1.继承
1.1 什么是继承
public class 子类名 extends 父类名{
}
和现实世界的继承一样,或者说是遗传更为贴切。“这孩子和你长得真像”,“和他爸一样爱玩”,这里就是继承了外貌这个属性和玩这个行为。
java中子类可以继承父类所有的非私有成员(如果在同一个包里),继承了其他类的类称为子类,派生类,衍生类,被继承的类称为父类,基类,超类。
1.2 同名成员的访问顺序
遗传可能伴随着变异,子类中可以声明和父类成员名称相同但内容不同的成员。
java中同名成员的访问遵循就近原则,访问的优先级为:所在方法>所在类>所在类的父类,若在这些范围内都没有找到访问的成员则报错
1.3 super关键字
super 代表的是本类的父类对象,可以访问父类的成员变量 调用父类的成员方法和构造方法(在权限修饰符允许的范围内)
super的注意事项:
- 不能同时用this和super调用子类和父类的构造方法,因为以这些关键字调用构造方法的语句都必须位于所在构造的第一行
- 子类的构造方法中会默认调用父类的无参构造,完成父类数据的初始化以供子类初始化使用
- 若父类中不存在无参构造有两种解决办法1.创建一个父类无参构造2.在子类构造中调用父类其他有参构造
1.4 方法的重写
什么是方法的重写:在子类中声明和父类成员方法同名的方法,并重构方法体的内容
应用场景:子类需要父类的功能,但父类的功能不能满足子类的需求
注意事项:
- 私有的方法无法被继承,也就无法被重写
- 重写不能缩小方法的访问权限
- final修饰的方法不能被重写
- 重写方法与被重写方法同名,参数列表也必须相同
- 重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类
- 静态方法只能被覆盖,不能被重写
- 重写的方法可以加final修饰符,不能加static修饰符
1.5 继承的规范
java中类的继承不支持多继承,只支持单继承和多继承(一脉相传)
2.修饰符
修饰符分为权限修饰符和状态修饰符
2.1 权限修饰符
权限修饰符可以用来修饰类,成员方法,成员变量,主要作用是设置访问权限,有public>protect>default>private四种
修饰符 | 同一个类 | 同一个包子类无关类 | 不同包的子类 | 不同包的无关类 |
---|---|---|---|---|
private | ✔ | |||
default | ✔ | ✔ | ||
protect | ✔ | ✔ | ✔ | |
public | ✔ | ✔ | ✔ | ✔ |
2.2 状态修饰符
状态修饰符有final和static两种
2.2.1 final
- final修饰的类不能被继承
- final修饰的方法不能被重写
- final修饰的变量只能被赋值一次,成员变量可以在声明时赋值或在构造函数中赋值,局部变量必须在声明时赋值
- final修饰的基本变量的值不能改变,引用类型的变量所指向的对象不能改变,但所指对象的属性可以改变
2.2.1 static
- 随着类的加载而加载,优先于对象存在,和类绑定在一起,存储在方法区(元空间)
- 修饰的成员被所有对象共享
- 访问权限允许时,可以不创建对象,直接用类名调用
- 静态的成员方法能只能访问静态的成员,不能访问非静态的成员
- static可以修饰变量,方法,代码块和内部类
- 静态方法中不能使用this关键字
- java允许重写静态方法,但是无法实现多态,静态方法是静态绑定的
3.多态
3.1 什么是多态:
同一个操作作用于不同的对象,会有不同的解释,产生不同的执行结果
3.2 多态的前提条件:
- 要有继承或实现关系
- 有方法的重写
- 父类的引用指向子类对象,父接口的引用指向实现类对象
3.3 多态的要点:
多态是方法的多态,不是属性的多态
父类引用指向子类对象,被称为向上转型
成员变量时静态绑定的,不具备多态性,只要看引用变量声明的类型即可
成员方法是动态绑定,要看运行时实际创建的对象实例
3.4 静态绑定和动态绑定
静态绑定是指在方法调用之前,编译器就已经确定了要调用的方法,静态绑定又称为早绑定
动态绑定是指只有等到方法调用时,执行器才会确定所要调用的具体的方法,动态绑定又称为晚绑定
3.5多态的好处和弊端
挺高了代码的扩展性,但不能访问子类特有的成员。
3.6 向下转型
指的是从父类到子类类型的强制类型转换(造型),可以解决不能访问子类特有成员的缺陷
Animal ac = new Cat();
Animal ad = new Dog();
Cat cat = (Cat) ac;
cat.play();
Dog dog = (Dog)ad;
dog.work();
非父子类关系的类之间不能进行强制类型转换,为了避免这种错误,java提供了 Instanceof 的运算符
if(ac instanceof Cat){
Cat cat = (Cat) ac;
cat.play();
}
Dog dog = (Dog)ad;
dog.work();
System.out.println("--------------------------");
// 以下的转换是失败的
if(ac instanceof Dog){//返回true 则表示是该类的实例对象
Dog cd = (Dog) ac;
cd.work();
}else{
System.out.println("类型不匹配");
}
if(ad instanceof Cat){
Cat dc = (Cat) ad;
dc.play();
}else{
System.out.println("类型不匹配");
}