继承
- java中的继承只子类使用extends关键字继承父类具有对象属性的成员所有的成员
- 方法覆盖的意义,扩展功能,满足需要
- 修饰符,控制类中的成员在那些范围可以访问
- public //公共
- 所有地方都可以访问
- protected //保护
- 子类可以访问,同包可访问
- default //默认修饰符,缺省修饰
- 同一个包,可以访问,子类看是否在同一个包
- private //私有
- 仅仅本类可以访问
- public //公共
- 方法覆盖可以使用@override注解修饰让编译器帮我们检查,是否重写规范
- 注,当方法被覆盖时,就算有父类方法调用父类的被覆盖方法,也会执行子代的覆盖方法。
- 修饰符,控制类中的成员在那些范围可以访问
- 属性
- 子类继承父类的方法,并可以访问父类protected及更宽松的修饰符修饰的属性
- 属性不具多态性,不可被覆盖
- 构造器
- 构造器不可以继承,属于父类独有
- super,可以调用父类成员变量和方法和构造器
- super不限于直接父类,调不到向上找
- 注,构造方法不继承,只能调用直接父类的
- super可用于区分父类同名成员
- super用法和this很像
- super不限于直接父类,调不到向上找
- 子类的构造器会默认访问父类的无参构造器,
- 父类没有无参构造器,报错。
- 可显式调用父类其他构造器。
- super构造器必须最先执行,即显式调用必须放第一行
- super和this不共存,都要求第一行,
- super是对父类构造器的直接调用,this是对父类构造器的间接调用,多次调用会造成混乱
- 第一行因为优先级最高
- 结论:
- 所有类必须有构造器
- 所有类构造器必须先调用super构造器
- 语句块
- 语句块无论是否被static修饰都没有继承性
- 值得注意的是,当子类调用父类构造器初始化父类时父类的非静态语句块也会执行对父类的语句块进行初始化,static语句块会在父类模板加载时进行执行。
- 内部类
- 内部类继承规则则根据内部类的属性不同来决定是否有继承性
白马非马
- 这里指本态和多态的关系
- 多态指子类对象的的多种父类形态
- 本态,子类对象的本类形态
- 子类对象赋值给本身,本态引用;子类对象赋值给父类引用(父类引用指向子类对象),多态引用
- 注,使用多态时不能调用父类没有的方法,
- 因为对象的类型模糊,多态的副作用,不能使用子类特有成员,
- 因为需要检查父类对象是否有其成员
- 注,使用多态时不能调用父类没有的方法,
- 子类可以看做父类对象,向上转型无条件发生
- 虚拟方法:被覆盖掉的方法,多态调用的时候会产生虚方法,编译时需要,并没有执行
- 编译时检查父类类型
- 运行时执行子类对象
- 若方法被子类覆盖,使用子类实体时,无论家族系谁调用父类被覆盖方法,若不指明父类则都会调用子类方法。
- 属性不具备多态性,使用父类类型调用属性,则使用继承来的属性值
- 多态数组
- 多态参数,把父类当参数传递来选择使用方法
- 造型,可以使用强转的形式把父类类型的子类的对象引用转换成子类类型,进而调用子类特有的方法
left- instanceof right,判断桌面的引用指向的实体是否是右面的类型的实体
if(person instanceof Chinese){
…
}
子类属于父类,所以判断的时候子类必须放到父类前面