Java继承


基本语法

public class Main {
    public static void main(String[] args) {
        Student s = new Student("hahaha", 12, 89);
    }
}

class Person {
    protected String name;
    protected int age;

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

class Student extends Person {
    protected int score;

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

上面的代码编译会出错,原因是父类没有合适的构造方法来调用初始化三个参数的构造函数。

在继承的时候,如果不显式指定父类的构造方法,会自动调用super()方法;

class Student extends Person {
    protected int score;

    public Student(String name, int age, int score) {
        super(name, age);
        this.score = score;
    }
}

改为这样就可以运行了。

阻止继承

语法:

1、sealed关键字:下面的就是说明了Person只可以由Man,和Woman两个类继承,不可以随便继承

public sealed class Person permits Man, Women {
    ...
}

2、 final关键字:Man是最后的儿子,他不可以被其他类继承。

public final class Man extends Penson{
    ...
}

向上转型(upcasting)

比如上面的Person:

Person p=new Person();
Student stu = new Student();
Person p1=new Student(); // upcasting, ok
Object ob1=p; // upcasting, ok
Object ob2=stu; // upcasting, ok

这种指向是可以的,父类指向子类(反过来是不可以的)。

注意:上面的例子的继承树是这样子的:Student>Person>object(所以叫做向上转型),在java中所有的类都是继承于object。

向下转型(downcasting)

例子:

Person p1 = new Student(); // upcasting, ok
Person p2 = new Person();
Student stu1 = (Student) p1; // ok
Student stu2 = (Student) p2; // runtime error! ClassCastException!

instanceof操作符

为了避免向下转型出错,Java提供了instanceof操作符,可以先判断一个实例究竟是不是某种类型:

Person p = new Person();
System.out.println(p instanceof Person); // true
System.out.println(p instanceof Student); // false

Student s = new Student();
System.out.println(s instanceof Person); // true
System.out.println(s instanceof Student); // true

Student n = null;
System.out.println(n instanceof Student); // false

instanceof实际上判断一个变量所指向的实例是否是指定类型,或者这个类型的子类。如果一个引用变量为null,那么对任何instanceof的判断都为false

利用instanceof,在向下转型前可以先判断:

Person p = new Student();
if (p instanceof Student) {
    // 只有判断成功才会向下转型:
    Student s = (Student) p; // 一定会成功
}

文章作者: AllenMirac
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AllenMirac !
  目录