Person person = new Student();
person = (Student) person;
Person是父类,Student是子类,为什么person = (Student) person;后,person不能调用子类的特有方法?
不知道你这个问题是否已经解决, 如果还没有解决的话:这个问题涉及到Java中的多态和引用类型转换的概念。
在Java中,多态是指通过父类的引用来引用子类的对象。在你的代码中,Person
是父类,而Student
是子类,通过将一个子类对象赋值给父类对象的引用person
,实现了多态。
但是,尽管你在代码中将person
强制转换为Student
类型的引用:person = (Student) person;
,但这并不能改变实际对象的类型。这个转换只是让编译器相信person
引用是Student
类型,以便在编译时可以调用Student
特有的方法,但在运行时,它实际上还是一个Person
类型的对象。
因此,尽管强制类型转换后的person
引用看起来像Student
类型,但它仍然无法调用子类特有的方法。如果你想调用子类特有的方法,你需要将person
引用重新赋值为一个指向Student
对象的引用,如下所示:
Person person = new Student();
Student student = (Student) person; // 将person重新赋值给student
// 然后就可以使用student引用调用Student类的特有方法了
总结一下,通过将一个子类对象赋值给父类对象的引用,实现了多态。但是在运行时,该引用仍然只能调用父类中定义的方法。如果需要调用子类特有的方法,需要将父类引用重新赋值为指向子类对象的引用。
子类的成员方法和变量, 对于父类来讲是不可见的,
也就是 不论 你的父类引用 指向的是谁, 父类引用 都无法访问 子类的成员变量和方法
因为你强转为student之后,又赋值给了person对象,就是又转成了person对象,所以还是不能调用student的方法,如果赋值的对象是Student类就可以用。
向上转型了,person不能调用子类特有的方法,如果想调用子类特有的方法,直接调用就可以了(向下转型)
调用不了,可以把父类方法设置成protected