继承:代码复用,增加整个程序的扩展性
将多个类的一些共性抽取出来,提出了继承的概念
就成就是在进行共性提取,实现代码复用!
要想使用继承,不是所有东西为了共用都能使用继承,要想 使用继承,必须满足原则 is - a原则
继承的语法:使用extends表示继承父类
访问修饰符 class 子类名称 extends 父类 {
}
有了继承的存在,将所有共性属性与方法放在父类中
子类只需要实现独有的属性和方法即可
整体代码实现更加简便,方便进行扩展
父类和子类成员的关系
1.父类和子类不存在同名的属性和方法
2.父类和子类成员变量同名(编译器的就近匹配原则)
当访问的变量(不管类型)子类存在
此处的a和b子类中存在,则在子类中调用的a和b默认就会使用子类的属性
若子类中不存在该属性,才会从父类中寻找同名属性
若父类中也没找到同名属性,编译报错
当父类中存在private私有域,子类在继承父类时,私有域无法直接使用这种继承称为隐式继承
3.父类和子类方法之间的调用
当通过子类对象访问方法时
若在子类中存在该方法,则优先访问子类的同名方法(要看参数)
若子类不存在该方法,则会从父类中寻找是否存在该方法,存在则调用,不存在编译出错,一定注意隐式继承问题
当产生子类对象时,默认先调用父类的构造方法产生父类对象而后调用子类构造方法产生子类对象
只要产生子类对象,一定是先调用父类构造方法产生父类对象之后再调用子类构造方法产生子类对象
继承关系
(Java的单继承局限:一个类只能使用extends直接继承一个父类,不允许多重继承,但允许多层继承)
super
表示直接从父类中寻找成员变量或成员方法
1.super修饰属性,表示直接寻找的父类的同名属性
private属性无法被调用
2.super修饰方法
2.1 super修饰普通方法,表示直接在父类中寻找同名方法
this.方法名称,从当前类中寻找同名方法
super.方法名称,从父类中寻找同名方法
2.2 super修饰构造方法,表示显示在子类构造方法中调用父类的构造方法!
当父类存在无参构造,则子类构造方法首行可以不写super();
如果父类中没有无参构造,则在子类的构造方法首行必须显示的使用super(参数)来调用父类的有参构造
当存在父类继承时,一般在子类中不出现this的构造方法调用
子类的构造方法首行不需使用super
this的构造方法调用也要放首行
关于继承访问权限 protected关键字 在不同包的具有继承关系的类之间可见
private(类的内部可见) < default(同级包中可见) < protected < public(整个项目可见)
在同一个包的毫无关系的不同类之间,protected可见!!
final:终结器-到此为止
final修饰的属性具体使用之前必须赋值,一旦赋值就无法修改
1.final 修饰的属性,称为常亮,一旦被final修饰的变量成为常量,一旦初始化后,值不能改!
final修饰的变量数值不能改!对于基本类型来说,就是具体的数值;对于引用类型来说,不可变的是引用类型的数值,地址!!!!!对象内部的内容无关!
2.final修饰方法 被final修饰的方法无法被重写/覆写
3.final修饰类 被final修饰的类不能有子类 JDK中的String类就是final类
类和类之间的关系:继承和组合
继承表示的是类之间的 is a 关系
Dog is an Animal;//天然的继承关系,Dog具备了Animal类中的所有属性和方法
组合表示的是类之间的 has a 关系
School has a Student; School has a Teacher;
组合关系也可以实现代码的复用 组合类的内部包含了其他类直接调用其他类对象的属性和方法 实现代码复用
继承和组合都可以实现代码复用 到底使用继承关系还是组合关系 要根据具体场景来看到底类之间是 is a 还是 has a 关系来决定