向上转型之后可以调用的成员方法和成员属性是父类的还是子类的?

发布时间 2023-11-14 18:54:25作者: news_one

前言:

对于多态的一些概念存在模糊,于是这次来挑一下特别容易误解的点。

正文:

在Java中,向上转型(upcasting)是将子类的对象引用赋给父类的引用。例如,如果User2继承自Object,那么你可以这样做:

User2 user2 = new User2();
Object obj = user2;  // 这就是向上转型

在这个例子中,objObject类型的引用,但它实际上引用的是一个User2对象。

现在,如果你通过obj引用来访问成员方法或成员属性,你只能访问那些在Object类中定义的方法和属性。也就是说,你只能访问obj引用类型(即Object)所允许的方法和属性,而不能访问User2类中特有的方法和属性。这是因为在编译时,编译器只知道objObject类型的,所以它只允许你调用Object类中存在的方法。

然而,如果User2类重写了Object类的某个方法(例如toString方法),那么当你通过obj引用调用这个方法时,会调用User2类中的版本,而不是Object类中的版本。这是因为Java支持动态绑定(dynamic binding),也称为后期绑定(late binding)或运行时多态(runtime polymorphism)。在运行时,JVM会根据obj引用的实际对象类型来决定调用哪个版本的方法。

总结:

成员属性看的是父类
向上转型之后,你只能调用父类中定义的方法和属性,但如果子类重写了父类的方法,那么会调用子类的版本。
也就是说有看的是能够重写的方法,子类有重写的方法看子类,没有重写的方法看父类。
但是不会看子类特有的方法!