public class test {
public static void main(String[] args) {
Teacher t = new Teacher();
t.setName("zhangsan");
Student s = new Student();
s.setName("lishi");
if(t instanceof Person){
/**
* 父类的两个子类是不能相互强转的,老师和学生不好理解,
* 举一个别的例子:
* 猫和狗都继承了动物类,但是猫和狗不能相互强转,你不能说猫是狗,狗是猫。
*/
//s=(Student)t;
/**
* 顺便说一下,向上转型和向下转型
* 向上转型:就是子类转为父类
* Person person_teacher=(Person)t
* Father f1 = new Son(); // 这就叫 upcasting (向上转型)
* 向下转型:就是父类转换为子类
* Teacher teacher1=(Teacher)person_teacher
* 如果真需要子类之间的转化,可以先转化为父类再转化,但实际场景很少存在
* Teacher teacher2=(Teacher)person_student
*
* 总结:
* 1、把子类对象直接赋给父类引用叫upcasting向上转型,向上转型不用强制转型。Father father=new Son();
* 2、把指向子类对象的父类引用赋给子类引用叫向下转型(downcasting),要强制转型,要向下转型,必须先向上转型
* 为了安全可以用instanceof判断
* Person person_teacher=(Person)t;
* Teacher teacher1=(Teacher)person_teacher;
* person_teacher就是一个指向子类对象的父类引用,把person_teacher赋给子类引用teacher1即
* Teacher teacher1=(Teacher)person_teacher;
* 3、upcasting 会丢失子类特有的方法,但是子类overriding 父类的方法,子类方法有效,向上转型只能引用父类对象的属性,
* 要引用子类对象属性,则要写getter函数。
*
* 4、向上转型的作用,减少重复代码,父类为参数,调有时用子类作为参数,就是利用了向上转型。
*/
Person person_teacher=(Person)t;
Teacher teacher1=(Teacher)person_teacher;
Person person_student=(Person)s;
Student student1=(Student)person_student;
/**
* 父类不能直接转化为子类
*/
Person person_=new Person();
Teacher teacher2=(Teacher)person_;
Student student2=(Student)person_;
/**
* com.chen.www.chendemo.maishi.Student cannot be cast to com.chen.www.chendemo.maishi.Teacher
*/
Teacher teacher3=(Teacher)person_student;
Student student3=(Student)person_teacher;
}
}
}