Java 中多态里成员变量访问看左边还是右边
java 多态中成员变量的访问取决于引用类型(即声明类型,位于编译期左侧),而非对象实际类型(运行期右侧)。这意味着在父类引用指向子类对象的场景下,代码直接通过引用访问的成员变量会解析为父类定义的版本,不会发生像方法那样的动态绑定。要获取子类特有的成员变量值,必须将引用强制转换为子类类型,或者通过被子类重写或继承的方法来间接访问。

为什么成员变量不随对象类型变化而改变
成员变量不具备多态性,因为它们在编译阶段就已经被确定下来。编译器在处理代码时,只看引用变量声明的类是什么,就去找该类中定义的成员变量。如果子类隐藏了父类的同名变量,编译器依然会选择父类的那个变量进行访问。这种机制被称为“变量隐藏”(Variable Hiding),它保证了程序在编译时的静态确定性,避免了运行时因对象类型不同而导致内存布局混乱的问题。

public class Parent {
public int value = 10;
}
public class Child extends Parent {
public int value = 20;
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.value);
}
}
预期输出:10
如何正确获取子类实例中的成员变量值
既然直接通过父类引用无法拿到子类的成员变量,开发者可以通过两种主要方式解决。第一种是使用向下转型(Downcasting),将父类引用强转为子类引用后再访问变量。第二种更推荐的方式是设计一个 getter 方法,让子类重写该方法并返回其自身的成员变量值。这样既利用了多态的特性,又符合面向对象封装的原则,避免了类型转换带来的潜在风险。

public class Parent {
public int value = 10;
public int getValue() { return value; }
}
public class Child extends Parent {
public int value = 20;
@Override
public int getValue() { return value; }
}
public class Main {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p.getValue());
}
}
预期输出:20
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











