kaindy7633/blog

Java基础之面向对象 – 继承

Opened this issue · 0 comments

继承的概念

继承,泛指把前人的作风、文化、知识、财产等接收过来的过程。

Java中的继承,就是让类与类之间产生父子关系,被继承的类叫做父类(基类、超类), 继承的类叫做子类(派生类)

我们可以通过关键字extends来实现这种继承关系

// 父类
class Parent {}

// 子类
class Children extends Parent {
	// ...
}

当两个类发生了继承关系后,子类就拥有了父类的非私有成员,包括成员属性和成员方法

// 父类
public class Parent {
    // 成员变量
    private String name;
    private int age;

    // 构造方法
    public Parent() {
    }

    public Parent(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getter & Setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

// 子类继续父类
class Child extends Parent {
}

继承使用场景

在多个类中,存在相同的属性和行为时,可以将这些内容提取出来放到一个新类当中,让这些类和新类产生父子关系,以便实现代码复用。

继承中的变量使用

Java中使用变量,遵循就近原则,局部位置有则使用,如果没有,则去本类的成员位置找,否则就去父类中找

如果想要在子类方法使用使用类变量,可以使用this关键字,如果想使用父类变量,可以使用super关键字

class Fruit {
    int price = 20;
}

class Apple extends Fruit {
    int price = 10;
    public void showPrice() {
        int price = 5;
        System.out.println(price);  // 5
        System.out.println(this.price);  // 10
        System.out.println(super.price);  // 20
    }
}

this和super

父子类中的构造方法

子类继续父类,实例化子类后,如果父类中定义了无参构造,则会自动执行父类的无参构造,系统会在子类构造中加入super(),意思就是调用父类的构造方法,调用父类构造方法的super()语句必须在子类构造方法的第一行

class Person {
    public Person() {
        System.out.println("Person类的无参构造方法");
    }
}

class Worker extends Person {
    public Worker() {
        // super();  这行代码系统会自动加上
        System.out.println("Worker子类的无参构造方法");
    }
}

但如果父类没有无参构造方法,则子类构造方法会报错,比如我们在父类中指定了一个有参构造方法

class Person {
	// 有参构造方法
    public Person(String name) {
        System.out.println("Person类的无参构造方法");
    }
}

class Worker extends Person {
    public Worker() {
        super("阿振sc");  // 这时必须手动调用父类构造方法并传入参数
        System.out.println("Worker子类的无参构造方法");
    }
}

方法重写

Java中的方法重写(Override)是指子类中出现和父类方法定义相同的方法的现象。方法重写也叫方法的复写、覆盖,它要求方法名、参数列表、返回值类型都要相同

class Parent {
    public void pMethod() {
        System.out.println("父类中的pMethod方法");
    }
}

class Child extends Parent {
    // 重写父类中的同名方法
	@Override
    public void pMethod() {
        System.out.println("子类中的pMethod方法");
    }
}

注意:

  • 父类中的私有方法不能被重写
  • 子类方法访问权限不能小于父类方法
  • 子类不能比父类方法抛出更大的异常

访问修饰符

  • private 强调的是给自己来使用
  • 默认 强调的是给同一个包下的类来使用的
  • protected 强调的是给子类使用的
  • public 强调的是给所有类所有的

方法重载和方法重写

Java中继承的特点

  • 单继承, Java中只支持类的单继承,但支持多层(重)继承

    Java中是支持接口的多继承的,比如:接口A extends 接口B, 接口C, 接口D, ...

  • 父类的私有成员是不能被继承的,私有成员包含成员变量和成员方法

  • 构造方法不能被继承,构造方法用于初始化本类对象,创建子类对象时,需要调用父类构造方法进行初始化

  • 继承体现了一种 is a的关系,子类符合is a父类的情况下,才使用继承