You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java向上转型:为何子类方法被调用但子类属性不生效?

为什么向上转型后子类属性无法被访问?

先看示例代码:

// Parent class
class Parent {
    String name = "Parent Name";
 
    void method()
    {
        System.out.println("Method from Parent");
    }
}
 
// Child class
class Child extends Parent {
    String name = "Child Name";
 
    // Overriding the parent method
    @Override void method()
    {
        System.out.println("Method from Child");
    }
}
 

public class GFG {
 
    // Driver code
    public static void main(String[] args)
    {
        // Upcasting
        Parent p = new Child();
 
      
        System.out.println(p.name); // 输出父类的属性值
        p.method(); // 输出子类的方法内容
    }
}

核心原因是Java里方法重写和属性隐藏的机制完全不同:

  • 方法重写是运行时多态:当父类引用指向子类对象时,方法调用会在运行时根据实际创建的对象类型(也就是Child)来动态选择执行子类的重写方法,这是Java多态特性的体现。
  • 属性隐藏是编译时绑定:编译阶段编译器只认引用变量的类型(这里是Parent),所以p.name会直接绑定到Parent类的name属性,和实际对象的类型无关——属性不存在多态,不会参与运行时的动态分派。

如果要访问子类的name属性,有两种常见方式:

  1. 向下转型:把父类引用强制转成子类类型,比如((Child)p).name
  2. 通过重写的方法间接获取:在父类定义getName()方法,子类重写该方法返回自己的name,调用p.getName()就能拿到子类的属性值了。

内容的提问来源于stack exchange,提问作者Grateful

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 11:03:15