day09【继承、super、this、抽象类】

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. 抽象之后的注意事项

  1. 抽象类不能创建对象(实例化)
  2. 抽象类中有构造方法, 作用用于给子类初始化.
  3. 抽象类的子类, 必须重写父类中所有的抽象方法.
  4. 抽象类中可以没有抽象方法, 有抽象方法的类一定是抽象类(接口)

你可能感兴趣的:(Java基础)