一,多态时Java中一个重要的语法机制。例如:A继承B,C继承B,那么:
父→子(向下转型);子→父(向上转型)
其中,向下转型又被称为强制类型转换;向上转型被称为自动类型转换。
注:无论是向上还是向下,必须有继承关系,不然没法编译。
二,在使用多态机制:以student(学生)和human(人类)为例:
人类与学生有继承关系==人类是父类,学生是子类。学生是人类(这个合理)
那是不是可以写成
human h=new student();
解释:这个new出来的是student,h这个引用的数据类型是human,它们之间进行了类型转换,子类变成了父类,称为向上转型。
Java中允许父类引用指向子类对象(不过用的不多,还是乖乖调用的好)
三,例:
public class Human {
public void move() {
System.out.println("人类在学习");
}
public class Student extends Human{
public void move() {
System.out.println("人类在学习");
}
}
public static void main (String []args) {
Human S=new Student();//父类指向子类
S.move();
Student h=new human();//错误,子类无法指向父类,不存在这种转换。
}
我们在使用向下转型时,如果调用的方法是子类中的特有的,也就是父类不存在的方法时,可以用向下转型。
再例如:
父类:动物
子类:猫、
animal a=new cat()//多态
但如果在上面的基础上继续一个代码
fish f= (fish)a;//直接爆炸,因为a中底层创建了cat的对象,用去找猫,两者无任何联系。
不过编译没问题了但继续运行还会发现,运行报错。因为有检测出了a中的内部有animal数据类型,指向了cat所以发生报错。
因此,向上转型有时候通过编译就可以运行,不过向下转型通过编译不一定可以运行。
因此使用instance of避免这个情况。
四,语法:
引用+instanceof+数据类型名
其结果为布尔类型表达式。
还以上面的猫和为例:
(a instanceof animal)
true表示a引用指向animal类型
false表示a引用没有指向animal类型
五,例:
public class Human {
public void move() {
System.out.println("人类在学习");
}
public class Student extends Human{
public void move() {
System.out.println("人类在学习");
}
}
public static void main (String []args) {
Student S=new Student();
Human h=new Human();
if(h instanceof Student) {//引用H
Student S1=(Student) new Human();//父类指向子类
S1.move();
}else if(h instanceof Human) {//引用H
Human h1=new Student();//错误,子类无法指向父类,不存在这种转换。
h1.move();
}
}
}
//上面这个可以通过运行
//把下面的换一下
public static void main (String []args) {
Student S=new Student();
Human h=new Human();
if(S instanceof Student) {//换成了引用S
Student S1=(Student) new Human();//父类指向子类
S1.move();
}else if(S instanceof Human) { //换成了引用S
Human h1=new Student();//错误,子类无法指向父类,不存在这种转换。
h1.move();
}
}
}//运行报错,Exception in thread "main" java.lang.ClassCastException: exercise1.Human cannot be cast to exercise1.Student
类型有问题,无法运行,ClassCastException
注:在强转前,通常都会用instanceof来判断一下,避免异常



