上下转型
class Person{
String name;
int age;
public void eat(){
System.out.println("人要学会吃饭");
}
public void sleep(){
System.out.println("人类必须睡觉才能活着");
}
}
// 程序员
class Programmer{
boolean isCoding;
public void sleep(){
System.out.println("程序员加班多,996福报睡得少");
}
public void coding(){
System.out.println("必须熟悉编程且会写代码");
}
}
public class PersonDemo{
public static void main(String[] args){
// 对象的多态性,父类的引用指向子类的对象
Person per1 = new Programmer();
// 多态的使用,当调用子父类同名同参数的方法时,实际执行的是子类重写父类的方法 -- 虚拟方法的调用
per1.sleep();// 调用的是new的子类Programmer中重写的sleep方法
// 现在的对象per1拥有的属性和方法就是Person定义的属性和方法
// 属性 名字 name、年龄 age
// 方法 吃饭eat、睡觉sleep
// 这个时候我们尝试使用per1.isCoding= true;或调用方法per1.coding()。 是没法直接这样操作的。详细原因请回看多态的讲解
per1.isCoding= true;
per1.coding();
// 我们说new的对象都会加载到内存的堆空间上,类Programmer中所有属性和方法都会加载。只是我们有了对象的多态性以后,如per1实例化的时候我们在内存中加载了子类特有的属性和方法的。但是由于变量声明为父类类型,导致编译时只能调用父类中生命的属性和方法,子类中特有的属性和方法就不能调用。
// 如何在父类中调用子类特有的属性和方法?
// 让编译器在编译时可以调用子类特有的内容,理论上我们就可以,使用强制类型转换符[类比基本数据类型的转换],也称为向下转型。
Programmer pro1 = (Programmer)per1;
pro1.isCoding= true;
pro1.coding();
// 使用强转时,可能出现ClassCastException 的异常:
// 可以使用instanceof 进行类的示例判断
}
}