继承
- 子类可以继承父类的方法,属性等;子类也可以写自己的方法。
- 父类更加通用,子类更加具体
- 类只能获得父类中非 private 属性,如果要继承就来提供 set 和 get 方法,私有的方法是没有办法继承的
- Java 中只能做单继承,不能一次性继承两个类,但是支持多级继承。
- 在类的继承结构中,如果创建一个子类的对象,那么在子类的对象中内部创建一个父类的对象,如果子类的对象访问的属性或者方法在子类中没有的时候,就会到父类中去寻找。
super关键字
- 子类的构造器中,内部默认调用了父类的构造器;如果父类带有有参数的构造器,并且没有显式的定义父类的默认构造器,默认构造器被覆盖,导致子类的构造器无法通过 super() 来调用父类的构造器,需要把父类的默认构造器写出来;如果子类的构造器中调用了父类的有参构造器,此时隐藏的 super() 就不会再起作用;super() 的调用必须在第一行;如果子类中没有初始化。
- 如果父类和子类两个属性重名,在调用方法的时候子类中的属性就是子类的属性,也就是在子类中找这个属性,使用子类中的属性,如果想要使用父类中的属性则可以使用 super.属性名,如果想要使用父类中的方法则可以使用 super.方法名。
覆盖重写
- 重写:方法名,参数列表,返回值相同,有继承关系的两个类,子类对继承的方法进行覆盖重写
- 重载:方法名相同,参数列表不同
- 创建对象,在执行方法的时候,如果子类中有就使用子类中的方法,如果子类中没有就使用父类中的方法。
final关键字
- 修饰变量的时候,变量的值无法改变
- 在修饰成员属性时必须要有一个初始值,要么直接给初始值,要么在构造器中赋值(需要在所有的构造器中都要初始化)
- 在修饰方法的时候,那个这个方法在子类中是不能被覆盖重写的
- 在修饰类的时候,当前类就不能被继承。
- 如果 final 修饰的是一个引用,那么这个引用只能执行这一个对象,这个引用不能再次被赋值,但是 final 指向的对象的属性是可以进行修改的
- final 不能修饰构造方法
抽象类
- 父类中的方法不确定如何进行方法体的实现,那么这个方法就应该是一个抽象方法,如果一个类中有抽象方法,那么这个类也要变成抽象类。我们不能直接创建抽象类对象,必须使用子类来继承抽象父类;子类必须覆盖重写父类中的所有的抽象方法;然后创建子类对象就可以使用相关方法。
- 抽象类不能被 final 修饰
注意
- 抽象类不能直接创建对象,无法实例化
- 抽象类可以存在构造方法,在子类创建的对象的时候,抽象父类的构造方法先执行,子类的构造方法后执行。
- 一个抽象类中,不一定有抽象方法,有抽象方法的类一定是抽象类。
- 抽象类的子类必须要覆盖重写所有的抽象方法,如果没有全部重写全部的方法,那么子类也是抽象类。
- 抽象方法不能使用 private 、final 和 static 修饰
接口
- 如果抽象类中的所有方法都是抽象的,我们就可以把它定义称为一个接口。接口是对行为的抽象,类是对属性和行为的抽象。接口中没有属性,没有具体的方法。接口中的方法默认是抽象的,接口是不能进行实例化的,只有一个类来实现了这个接口,需要覆盖重写所有的方法,此时创建子类对象就可以调用相关的方法。
- 接口无法和 private,static 和 final 共存;接口中可以定义一些有初始值常量,可以通过实现类或者接口名来进行访问,常量名要单词大写来表示,定义的常量默认是 final 和 static。接口可以一次性继承多个接口。
- Java 8 新特性:可以有静态方法,默认方法(default修饰)。
子类可以继承父类,实现多个接口
- 接口中没有静态代码块和构造方法
- 接口中方法相同,重写一次就可以,不同全部重写
- 实现类如果没有覆盖重写所有接口中的方法,那么这个实现类一定是一个抽象类
- 一个类直接父类和接口中的方法冲突,优先使用父类中的方法
- 多个接口之间默认方法重复,要在子接口中覆盖重写