day--14
继承 extends
- 继承是类之间的关系,只有单继承,没有多继承。(一个子类只能直接继承一个父类,注意直接的意思,因为它的父类也继承了别的类,那么子类也间接的继承了这个类)
- 子类继承父类就可以调用父类的全部方法
- student extends person; 学生继承了人 学生是子类(派生类) persons是父类(基类)
- 子类可以继承父类,注意private是不可以直接继承的 私有的无法被继承。
- Ctrl+H; 显示继承树谱
- 所有的类都默认直接或间接继承 Object
This Super
//父类
public class person{
protected String name = "yujian";
}
//子类
public class Student extends Person{ //Student继承了Person
private String name = "kunlun";
System.out.println(this.name); //当前类的 kunlun
System.out.println(super.name); //父类里的 yujian
}
//父类
public class person{
protected String name = "yujian";
public void print(){ //这里的print是此类里的方法
System.out.println("person")
}
}
//子类
public class Student extends Person{ //Student继承了Person
private String name = "kunlun";
public void print(){ //这里的print是个方法
System.out.println("stundent")
}
public void text(){
this.print(); //调用自己的print方法
super.print(); //调用父类的print方法
}
super 和 this的注意点
-
super调用父类的构造方法吗,必须在构造方法的第一行
-
super 必须只能出现在子类的方法或者构造方法中
-
super 和 this 不能同时调用构造方法,因为它们都必须要写在第一行。所以只能选其一
-
代表的对象:
1. this:本身调用这个对象(自己调用自己)
1. super:代表父类对象的应用 -
前提:
- this:没有继承也可以使用
- super:只能在继承条件下才能使用,而且只能在子类中
-
构造方法:
- this();本类的构造
- super();父类的构造
方法的重写(和属性无关,都是方法的重写)
-
重写只跟非静态方法无关,因为静态方法一开始就在了
-
重写
- 需要有继承关系,子类重写父类
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大(排序 public > protected > default > private )
- 抛出的异常:范围可以被缩小,但不能扩大
- 子类的方法和父类必要一致;方法体不同
-
为什么要重写:
父类的功能,子类不一定需要,或者不能满足! Alt + Insert ; override
多态
注意事项:
1. 多态是方法的多态,属性没有多态
1. 父类和子类,有联系 类型转换异常!ClassCastException
1. 存在条件:继承关系,方法需要重写,父类引用指向子类对象! Father f1 = new Son() ;
1. static(属于类,它不属于实例)、final (常量)、private(私有的)是不能重写的,更不可能写多态了
- instanceof 类型转换 引用类型的转换
public static void main(string[] args){
//Object > person > student
//Object > person
//Object >
//Object > person > teacher
//Object > String
上面是继承关系 决定是Ttue 还是 False
Object object = new student();
System.out.println(object indtanceof Student); // true
System.out.println(object indtanceof Person); // true
System.out.println(object indtanceof Object); // true
System.out.println(object indtanceof Teacher); //false
System.out.println(object indtanceof String); //false
}
System.out.println(x instanceof y ); 能不能编译通过,主要取决于 x 和 y 是不是继承关系
- 父类的引用指向子类的对象
- 把子类转换为父类,向上转型;
- 把父类转换为子类,向下转换;强制转换
- 方便方法的调用,减少重复的代码!简洁