继承的实现
编写父类
class Animal{
// 公共的属性和方法
}
编写子类,继承父类
class Dog extends Animal{
// 子类特有的属性和方法
}
父类的构造方法,不允许被继承,不允许被重写
方法的重载
- 同一个类中
- 方法名相同,参数列表不同(参数类型,顺序,个数)
- 方法返回值,访问修饰符任意
- 与方法的参数名无关
- 静态方法和最终方法可以被重载
方法的重写
- 有继承关系的子类中
- 方法名相同,参数列表相同(参数类型,顺序,个数),方法返回值可以允许是子类类型
- 方法的访问修饰符是可以允许有变化的,但是有条件,即访问范围需要大于等于父类的访问范围
- 与方法的参数名无关
- 静态方法和最终方法不仅能被重写
在子类中也可以定义与父类重名的属性,此时会覆盖父类的属性
访问修饰符
#同包:包括 同包子类 和 同包对象
#子类:包括 同包子类 和 非同包子类
#其他:非同包对象
继承的初始化顺序
- 父类静态成员,代码块 #静态成员和代码块的顺序,与书写顺序有关
- 子类静态成员,代码块 #静态成员和代码块的顺序,与书写顺序有关
- 父类对象构造
- 子类对象构造
super关键字
父类对象的引用,可以让子类访问父类中允许被派生的任意成员
public class Cat extends Animal{
public Cat(String name,int age){
super.name; // 访问父类属性
super.pring(); // 访问父类方法
super(); // 访问父类构造方法
}
}
- 子类的构造方法中必须调用其父类的构造方法
- 如果子类的构造方法找那个没有显式标注,那么子类构造默认调用父类无参构造方法
- 如果子类的构造方法找那个没有显式标注,且父类中没有无参的构造方法,则编译出错 `1
- super(参数1,参数2 … )会调用父类有参构造方法
- super()必须放在子类构造方法有效代码的第一行
public class Cat extends Animal{
public Cat(String name,int age){
// 子类构造默认调用父类的无参构造方法
// super(name,age)会调用父类的有参构造方法
super(name,age)
}
}
this:当前类对象的引用
- 访问当前类的成员方法
- 访问当前类的成员属性
- 访问当前类的构造方法
- 不能在静态方法中使用
super:父类对象的引用
- 访问父类的成员方法
- 访问父类的成员属性
- 访问父类的构造方法
- 不能在静态方法中使用
构造方法调用时,this 和 super 不能同时出现
Object类
- Object类是所有类的父类
- 一个类没有使用extends关键字明确标识继承关系,则默认继承Object类(包括数组)
- Java中的每个类都可以使用Object中定义的方法
1,equals(Object obj)
- 判断调用equals方法的对象和参数中的obj对象是否一致,即这两个对象是否指向同一块内存地址
- 效果和 “ == “ 判断是一样的
- 子类(比如String类)可以通过重写equals方法的形式,改变比较的内容 ```java Dog dog1 = new Dog(); dog1.setName(“妞妞”); dog1.setAge(1);
Dog dog2 = new Dog(); dog2.setName(“妞妞”); dog2.setAge(1);
System.out.println(dog1.equals(dog2)); // false System.out.println(dog1 == dog2); // false
#String类中的equals方法判断的不是两个字符串对象的引用是否一致,而是字符串值是否一致
```java
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // false
String str3 = "hello";
String str4 = "hello";
System.out.println(str3.equals(str4)); // true
System.out.println(str3 == str4); // true
2,toString()
- 输出对象名时,默认会直接调用类中的toString
- 继承Object中的toString方法时,输出对象的字符串表现形式:类型信息 + @+ 地址信息
- 子类(比如String类)可以通过重写toString方法的形式,改变输出内容
Dog dog1 = new Dog();
dog1.setName("妞妞");
dog1.setAge(1);
System.out.println(dog1); // com.imooc.animal.Dog@15db9742
System.out.println(dog1.toString()); // com.imooc.animal.Dog@15db9742
String类中的toString方法输出的是字符串的值
String str1 = new String("hello");
String str2 = "hello";
System.out.println(str1); // hello
System.out.println(str2); // hello
final关键字
final class:该类没有子类
final 方法:
- 该方法不允许被子类重写,但是可以正常被子类继承使用
- 该方法可以被重载
- 不能用于修饰构造方法
- final 变量:
- 基本数据类型的变量 => 初始赋值之后不能更改
— 方法内局部变量:只要在具体被使用之前进行赋值即可,一旦赋值不允许被修改
— 类中成员属性:赋值过程:1,定义直接初始化 2,构造方法 3,构造代码块
- 引用类型的变量 => 初始化之后不能再指向另一个对象,但对象的内容是可变的
- 可配合static使用
常用于配置信息,比如:public static final String URL = “www.google.com”
注解
- JDK1.5版本引入的一个特性
- 可以声明在包,类,属性,方法,局部变量,方法参数等前面,用来对这些元素进行说明,解释
- 源码注解:只在源码中存在,编译成.class文件就不存在了,比如@override
- 编译时注解:在源码和.class文件中都存在
- 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑,比如spring框架的@Autowired
// 重写方法的注解
@Override
public void eat() {
}
Alt + /:在子类中自动列出可以重写的父类方法