day09【继承、super、this、抽象类】
一. 继承(重点)
1. 继承的格式和特点
格式
public class Fu {
}
// ============================================
public class Zi extends Fu{
}
// Zi继承了Fu, Zi是子类, Fu是父类
特点
- 子类可以使用父类所有非私有的属性和行为
注意事项:
构造方法, 不继承.
2. 继承后成员使用的特点
- 出子类调用父类的成员特点
使用特点
- 成员变量
- 子父类不同名
- 子父类同名
- 成员方法
- 子父类不同名
- 子父类同名
总结: 使用子类对象调用变量或者方法的时候, 遵循下面的特点:
子类有用子类, 子类没有找父类, 父类有就用父类, 父类没有就报错.
继承中的父类只能有一个.
Java只支持单继承, 不支持多继承, 但是支持多层继承
二. 重写(重点)
- 回顾
- 重载: 同一个类中, 方法名相同, 参数列表不同, 与返回值类型和修饰符无关
方法的重写
-
子父类中, 出现了一模一样(子类的权限可以大于等于父类)的方法
-
为什么要有方法的重写?
- 子类觉得父类的方法, 不够好, 将父类的方法重写.
// Animal
public void eat() {
System.out.println("动物吃饭!~");
}
public void sleep() {
System.out.println("动物睡觉");
}
// Cat
// Cat觉得父类的方法不够好, Cat子类, 就重写这两个方法
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void sleep() {
System.out.println("猫趴着睡");
}
三. this和super(了解)
1. 父类一定优先于子类加载
- 字节码文件父类先加载
- 构造方法父类先执行
2. this和super
- this: 代表本类对象, 谁来调用我(我所在的方法), 我就代表谁
- super: 代表父类的引用
应用场景
- this.成员变量
- this.成员方法
- super.成员变量
- super.成员方法
super.成员变量和super.成员方法使用:
子父类中, 有同名的成员变量或者成员方法, 不想用子类, 只想使用父类,
可能使用到的场景
- 子类重写父类方法后, 子类中还想调用父类当前的方法.
3. this和super在构造方法中的使用
- this(): 调用本类的构造方法
- super(): 调用父类的构造方法
可能使用到的场景
- super(参数): 调用父类的有参构造
public class Cat extends Animal {
public Cat() {
}
// 自动生成了使用父类的有参构造
public Cat(String kind, String name) {
super(kind, name);
}
}
四. 抽象类(重点)
1. 抽象的由来
// 可以创建Animal的对象, 但是没有意义
Animal a = new Animal();
// 可以调用eat方法, 但是没有意义, 不知道是什么动物, 也不知道怎么吃饭
a.eat();
- 解决:
- 将抽取出共性的父类, 定义成抽象类
- 将共性方法, 定义成抽象方法
2. 抽象的格式
- 抽象类
public abstract class 类名 {
}
- 抽象方法
public abstract void 方法名(参数列表) ;
// 抽象类
public abstract class Animal {
private String kind;
private String name;
public Animal() {
}
public Animal(String kind, String name) {
this.kind = kind;
this.name = name;
}
public String getKind() {
return kind;
}
public void setKind(String kind) {
this.kind = kind;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 抽象方法
public abstract void eat();
public abstract void sleep();
}
3. 抽象之后的注意事项
- 抽象类不能创建对象(实例化)
- 抽象类中有构造方法, 作用用于给子类初始化.
- 抽象类的子类, 必须重写父类中所有的抽象方法.
- 抽象类中可以没有抽象方法, 有抽象方法的类一定是抽象类(接口)