Java中父类数组存子类对象无法访问子类属性问题求助
问题根源
Java的成员变量不具备多态特性,当你用父类(Animal)引用指向子类(RedBird)对象时,直接访问成员变量会取**引用的静态类型(即Animal)**对应的变量,而非实际对象的变量。你代码里每个类单独定义的name属于「隐藏父类变量」,不是方法重写,因此无法触发多态逻辑。
解决方案
方案1:强制类型转换(仅限确定对象类型的场景)
把Animal类型的引用强制转换成RedBird类型,就能直接访问子类的name变量:
public class Room { public static void main(String args[]) { Animal[] anim = {new RedBird()}; // 强制转型后访问RedBird的name System.out.println(((RedBird) anim[0]).name); } }
输出结果:Red Bird
⚠️ 注意:如果数组中存在其他Animal子类对象,这种转型会抛出ClassCastException,仅适合明确对象类型的场景。
方案2:用方法封装(推荐的面向对象写法)
在面向对象设计中,应该通过方法来封装属性访问,方法支持多态特性。修改代码如下:
祖父类Animal
public class Animal { String name = "Animal"; // 定义获取name的方法 public String getName() { return name; } }
子类Bird
public class Bird extends Animal { String name = "Bird"; @Override public String getName() { return name; } }
孙类RedBird
public class RedBird extends Bird { String name = "Red Bird"; @Override public String getName() { return name; } }
测试代码
public class Room { public static void main(String args[]) { Animal[] anim = {new RedBird()}; // 利用多态自动调用子类的getName方法 System.out.println(anim[0].getName()); } }
输出结果:Red Bird
这种写法的优势在于,无论数组中存放的是Animal、Bird还是RedBird对象,都会自动调用对应类的getName方法,返回正确的属性值,完全符合面向对象的设计原则。
补充说明
Java编译阶段会确定成员变量的访问目标(看引用的静态类型),而方法调用是在运行阶段确定(看对象的实际类型),这就是为什么直接访问成员变量无法触发多态,而方法可以。
内容的提问来源于stack exchange,提问作者Bread Bouquet
相关产品推荐
相关产品推荐

