面向对象的三大特征:
继承:就是子类继承父类的属性(成员变量)和行为(成员方法)
为什么要有继承,继承的好处是什么?
继承的核心目的:
提高代码的复用性,相同代码重复利用!减少代码冗余。
继承的格式:
[修饰符] class 类名 extends 父类类名{
}
public class Teacher extends People{
}
注意:Java是单继承的,一个类只能直接继承一个父类。
父类不可被子类继承的内容:
父类的构造器是不能被子类继承的。
继承后的特点——————成员变量:
成员变量不重名:访问没有影响
成员变量重名:优先访问子类的。
继承后的特点——————成员方法:
成员方法不同: 没有影响。
成员方法相同:优先调用子类的。
方法重写:
方法重写是发生在子父类之间的关系。
方法重写的原理:
子类继承父类,子类得到了父类的方法,
有可能子类认为父类的该方法无法满足自己的需求,
子类重写一个与父类一样的方法来覆盖父类的该方法。
重写(Override)注解:
子类在重写父类方法的时候,建议都加上重写校验注解:@Override
一旦方法加上了这个注解,那么这个方法就必须要是重写父类的方法。
重写的要求:
最好与父类的方法形式完全一样!!!声明不变,重新实现。
注意事项
1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。
2. 子类方法覆盖父类方法,返回值类型、方法名和参数列表都要一模一样。
拓展:
子类是否可以重写父类私有的方法? 不可以
子类是否可以重写父类的静态方法? 不可以
继承后的特点:
子类构造器默认会在第一行先调用父类的无参数构造器一次。
// super超类==父类的意思
// 默认是去调用父类的无参数构造器,即使你不写这行代码,默认也存在。
//super();
继承后子类构造方法特点:子类所有构造器都会先调用父类的无参构造器一次。
子类的构造器为什么一定要先调用父类的构造器一次?
– 现实的角度来看: 必须先有爸爸,才有儿子。
先调用构造器其实就是在创建父类对象,再调用子类构造器是创建子类对象。
-- 从底层来看:必须先创建父类对象,初始化父类的成员变量
子类才能继承使用!
super()必须放在子类构造器的第一行!!
super和this
super: 超类==父类 指的是父类对象空间。
this : 指的是当前对象空间。
在开发的时候,比如我们重写了父类方法,
但是又可能需要调用父类被重写的该方法这时候怎么办呢?
super.父类方法
this.子类方法
this.子类成员变量 ‐‐ 本类的
super.父类成员变量 ‐‐ 父类的
this:找本类对象
super:找父类对象
this(..):找本类其他构造器
super(..):找父类构造器
继承的特点:
1. Java只支持单继承,不支持多继承。
一个类只能继承一个直接父类,但是可以间接继承多个父类
2.一个类可以有多个子类。
3.Java支持多层继承(继承体系,间接继承)。
抽象类(abstract):(重要)
父类中的方法,被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有
意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。Java语法规定,包含抽象方法的类就是抽象类
父类自己写了一个方法,结果所有的子类都重写了这个方法,
父类这个方法的方法体就没有意义了。
抽象方法:
父类认为子类必须有这个功能,但是父类又不能确定子类的这个方法具体要干嘛!!
所以父类只提供这个方法的声明,而没有提供方法体,这个方法就是抽象方法。
拥有抽象方法的类就是抽象类。
需求:定义一个抽象类。
抽象类的格式:
[修饰符] abstract class 类名{
}
抽象方法:
[修饰符] abstract 返回值类型 方法名称(形参列表);
抽象方法是不能写方法体的。抽象方法只是一个方法签名。
关键:是需要加上abstract就变成了抽象类或者抽象方法。
抽象类的意义:是为了被子类继承,然后重写抽象方法。
抽象类是“有得有失”:
有得:抽象类拥有了抽象方法的能力。
有失:抽象类本身是不能创建对象的。
Human h = new Human();
h.run(); // 我方法体都没有,无法运行
说明抽象类不能创建对象。
抽象类的注意事项:
1.一个类如果写了抽象方法,这个类必须定义成抽象类。
2.如果一个类继承了抽象类,这个类必须重写全部的抽象方法。
3.如果一个类继承了抽象类,但是没有重写全部抽象方法
这个类也必须定义成抽象类
4 .抽象类人家也是可以有普通方法的。
抽象类存在的意义:
1.抽象类存在的意义就是为了被子类继承。
如果抽象类不被继承,抽象类毫无意义。
2.抽象类体现的是模板模式。
抽象类是把不需要子类写的东西已经写好了
抽象类自己搞不定的交给子类重写。