概念
继承就是将多个类的共性抽取出来,提出继承的概念。就是在进行共性抽取,实现代码复用。
提高代码的复用性,方便进行子类,子功能的扩展,将所有共性的内容放在父类(基类),子类只需要关注子类独有的属性和功能
父类和子类成员关系
- 父类和子类不存在同名的属性和方法
- 子类和父类成员变量重名
编译器的就近匹配原则:若子类中不存在该属性,才会从父类中寻找同名属性;若父类中也没找到同名属性,编译报错。
问题:如果父类中的成员为私有,则变量为父类还是子类?
由于c在父类中是私有权限,在子类中不能直接使用
当父类中存在private私有域,子类在继承父类时,私有域无法直接使用,这种继承称为隐式继承。
- 父类和子类中的方法调用
当通过子类对象访问方法时
- 若子类中存在该方法,则优先访问子类的同名方法:子类和父类完全想通过,方法名称,参数类型,则优先访问子类中的方法。
- 若子类不存在该方法,则会从父类中寻找是否存在该方法,存在则调用,不存在则编译出错,一定注意隐式继承的问题。
继承中构造对象的产生顺序
继承的使用规则: 当产生子类对象时,默认先调用父类的构造方法产生父类对象而后调用子类构造方法产生子类对象。
(先有父才有子,先产生父类对象然后产生子类对象)
super关键字
表示直接从父类中寻找成员变量或成员方法
1. super修饰属性,表示直接寻找父类的同名属性
私有属性无法被调用!
2. super修饰方法
2.1 super修饰普通成员方法
表示直接在父类中寻找同名方法
this和super的使用
this.方法
是在当前类中寻找同名方法super.方法
是在父类中寻找同名方法
2.2 super修饰构造方法
表示显示在子类构造方法中调用父类的构造方法
- 如果父类中没有无参构造,只包含一个有参构造,则在子类的构造方法中首行必须显式使用
super(参数)
关键字来调用父类的有参构造; - 若父类存在无参构造,则子类的构造方法首行可以不写
super()
;
当存在父类继承时,一般在子类中不出现this的构造方法调用。
原因:
子类的构造方法首行必须使用super;
this的构造方法调用也得放在首行。
笔试题:
静态块>构造块>构造方法
- 静态块在类加载时执行一次,和具体产生对象无关,用于初始化静态变量
- 类中的静态代码块还会优先于主方法执行
输出顺序:7,3,2,1,6,5,4,2,1,5,4,8
正确顺序:3,6,7,2,1,5,4,2,1,5,4,8
分析:
- 主方法存在主类中,要执行主方法需要加载主类D,由于D继承于B,因此先加载B
一旦加载类,静态代码块就会执行,则3(B的静态代码块),6(D的静态代码块) - 进入主方法,输出7
- 产生子类对象D,首先需要产生父类对象B。
对象的产生构造块和构造方法都会执行,则2154,2154执行两次 - 输出8
protected关键字
- 在不同包的具有继承关系的类之间可见,和对象是没有关系的。
- 权限修饰符指的是在哪些“类”的内部可见,与具体的对象无关。
由于default权限,是在同一个包的不同类之间可见
protected(不同包之间的具有继承关系的类之间可见)>default
因此,在同一个包的毫无关系的不同类之间,protected仍然可见!!!
default有的权限,protected一定具备。
继承关系
java的单继承局限:一个类只能使用extends直接继承一个父类,不允许多重继承,但是允许多层继承。
多重继承(不允许!!!):
public class C extends A,B{}
多层继承:
public class C extends B{}
public class B extends A{}
不同类继承于同一个类:
public class A{}
public class B extends A{}
public class C extends A{}
单继承:
public class A{}
public class B extends A{}
final关键字—终结器,到此为止
-
final 修饰基本数据类型
final 修饰的属性称为常量,一旦被final修饰的变量成为常量,初始化之后值不能修改! -
final 修饰引用数据类型
final 修饰的变量数值不能改,对于基本数据类型来说,就是具体的数值;对于引用数据类型,不可变的是引用类型的数值,即地址!!!与对象内部的内容无关。
final A a=new A()
//a对象内部的属性随意修改,但是a的指向不能修改
a.b=10;
a.b=20;
//报错,a无法再次指向别的A对象
a=new A();
a指向的对象不能修改
- final 修饰的属性使用之前必须进行赋值,一旦赋值,无法修改
- final 修饰的方法无法被重写/覆写
- final 修饰的类不能有子类
JDK中String类就是final类
类和类之间的关系:继承和组合
- 继承表示的是类之间的 is a 关系
//天然的继承关系,Dogs具备了Animal类中的所有属性和方法
Dog is a Animal;
- 组合表示的是类之间的 has a 关系
School has a Student;
School has a Teacher;
组合关系也可以实现代码的复用,组合类的内部包含了其他类,直接调用其他类对象的属性和方法,实现代码复用。
总结:
组合和继承都可以实现代码复用,具体使用哪个关系需要根据具体场景进行判断。