基本语法
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; // 一定会成功
}