继承就是将多个类的共性抽取出来,提出继承的概念。就是在进行共性抽取,实现代码复用。
提高代码的复用性,方便进行子类,子功能的扩展,将所有共性的内容放在父类(基类),子类只需要关注子类独有的属性和功能
由于c在父类中是私有权限,在子类中不能直接使用
当父类中存在private私有域,子类在继承父类时,私有域无法直接使用,这种继承称为隐式继承。
继承的使用规则: 当产生子类对象时,默认先调用父类的构造方法产生父类对象而后调用子类构造方法产生子类对象。
(先有父才有子,先产生父类对象然后产生子类对象)
表示直接从父类中寻找成员变量或成员方法
this.方法
是在当前类中寻找同名方法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
分析:
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 A a=new A()
//a对象内部的属性随意修改,但是a的指向不能修改
a.b=10;
a.b=20;
//报错,a无法再次指向别的A对象
a=new A();
a指向的对象不能修改
//天然的继承关系,Dogs具备了Animal类中的所有属性和方法
Dog is a Animal;
School has a Student;
School has a Teacher;
组合关系也可以实现代码的复用,组合类的内部包含了其他类,直接调用其他类对象的属性和方法,实现代码复用。
总结:
组合和继承都可以实现代码复用,具体使用哪个关系需要根据具体场景进行判断。