继承是Java实现代码复用的一种重要方式
1.减少代码量
2.提高代码的维护性
基本语法:
创建父类
public class 父类名{
//属性和方法
}
public class 子类名 extends 父类名{
//子类特有的属性和方法
}
两个类建立起继承关系,我们称之为父子类,子类可以用于父类的信息(属性和方法)。
super关键字,专门用于有继承关系的父子类,
子类可以通过super关键字来访问父类的属性和方法,构造方法。
所有类都可以用super,因为所有类都有父类Object
子类调用父类的构造方法:
无参构造:super();
有参构造:super(参数列表);
规则:
1.只能写在子类的构造方法中
2.super()必须写在方法的第一行
子类访问从父类继承属性,实际上是指向父类的引用,子类对象中是不存在此属性的
1.调用子类无参创建对象,子类无参调用父类无参(默认)
2.调用子类无参创建对象,子类无参调用父类有参
3.调用子类有参创建对象,子类有参调用父类无参(默认)
4.调用子类有参创建对象,子类有参调用父类有参
new一个对象 ,至少在内存中会创建2个对象,一个是他本身,一个是Object
子类中使用super访问父类属性,super可以省略
语法:super.属性名
赋值:super.属性名 = 值
获取:super.属性名
1.普通方法中可以访问
2.构造方法中可以访问
super.属性名没有要求必须写在第一行
super调用构造函数必须写在构造函数的第一行
子类中使用super调用父类普通方法,super可以省略,构造函数不能省略
语法:super.方法名(参数列表);
1.普通方法中可以调用
2.构造方法中可以调用
super VS this
super是作用于父子类之间的,两个类
this是作用于同一个类内的
this可以访问自己的属性,调用自己的方法和构造方法。
super可以访问父类的属性,调用父类的方法和构造方法。超类 派生类 父类 子类
同一个类中 | 同一个包中的父子类 | 同一个包中的非父子类 | 不同包中的父子类 | 不同包中的非父子类 | |
---|---|---|---|---|---|
private | 可以 | 不可以 | 不可以 | 不可以 | 不可以 |
默认 | 可以 | 可以 | 可以 | 不可以 | 不可以 |
protected | 可以 | 可以 | 可以 | 可以 | 不可以 |
public | 可以 | 可以 | 可以 | 可以 | 可以 |
实际开发中何时使用继承?
真实世界中,如果两个对象符合 is-a 关系就可以使用继承
对象A 对象B
A is a B 这句话成立,符合客观真实的逻辑关系,表示A和B符合
is-a关系,则A对应的类和B对应的类可以建立继承关系
dog animal
dog is a animal 成立 Dog类和Animal类可以建立继承关系
Dog继承Animal
is-a 左侧的类继承右侧的类,左侧的类是子类,右侧的类是父类
在子类中this,super都能调用属性或方法
学会打断点去跟代码 理解程序结构
animal is a dog
继承中的方法重写/覆盖Override
只有在继承关系中才有重写的概念,
概念:子类根据需求对从父类继承的方法进行重新编写
父类的方法不能显示子类特有的属性时,就需要对父类方法进行重新
如何实现重写?
在子类中重新去定义父类中已存在的需要被覆盖的方法
当调用子类对象的某个继承自父类的方法时,如果子类没有对
该方法进行重写,则调用的是父类的方法,如果子类对该方法
进行重写,则调用的是子类的重写方法。
重写需要注意的事项:
1.进行重写时,可以使用super.方法名的方式保留父类方法的业务逻辑。
**2.构造方法不能被重写。**儿子不能决定创建父亲
方法重写的规则:
1.方法名相同
2.参数列表相同
3.返回值类型相同或重写方法的返回值类型是父类原方法的返回值类型的子类 基本类型返回值类型必须一致
4.子类重写方法的访问权限不能小于父类方法的访问权限
public > protected > 默认 > private
当父类方法使用public修饰时,子类重写方法只能有public修饰
当父类方法使用protected修饰时,子类重写方法只能有public,protected修饰
当父类方法使用默认修饰时,子类不能重写
当父类方法使用private修饰时,子类不能重写