java 上转型对象调用
点击查看代码
class Base {
public int id = 100;
public void doSomething() {
System.out.println("Base");
}
}
public class Child extends Base {
public int id = 101;
@Override
public void doSomething() {
System.out.println("Child");
}
public static void main(String[] args) {
Base base = new Child();
System.out.println(base.id);
base.doSomething();
}
}
100
Child
我们来一步步分析这段 Java 代码的执行结果,并解释背后的原理。
🧩 代码回顾
class Base { public int id = 100; public void doSomething() { System.out.println("Base"); } } public class Child extends Base { public int id = 101; @Override public void doSomething() { System.out.println("Child"); } public static void main(String[] args) { Base base = new Child(); System.out.println(base.id); base.doSomething(); } }
✅ 执行结果
100 Child
🔍 逐行解释
1.
Base base = new Child();
- 这里是多态的典型用法。
- 变量
base的编译时类型是Base。- 但它的运行时类型是
Child(因为new Child())。⚠️ 重点:方法调用是动态绑定(运行时决定),而字段访问是静态绑定(编译时决定)。
2.
System.out.println(base.id);
- 虽然
base实际指向的是Child对象,- 但
id是 实例变量(字段),不是方法。- 字段访问是 按引用类型(Base)来访问的。
所以:
base是Base类型,因此访问的是Base.id,即100。✅ 结果:
100
3.
base.doSomething();
doSomething()是一个 普通实例方法,且被Child重写了(@Override)。- 方法调用是动态绑定:JVM 会根据对象的实际运行时类型(
Child)来决定调用哪个方法。所以:
- 虽然引用是
Base类型,但实际对象是Child,因此调用的是Child.doSomething()。✅ 结果:
Child
🧠 总结关键点
特性 字段( id)方法( doSomething)绑定方式 静态绑定(编译时决定) 动态绑定(运行时决定) 实际访问 按引用类型( Base)按对象实际类型( Child)输出结果 100Child
💡 小贴士:如何访问 Child 的 id?
如果你想访问
Child中的id,必须通过Child类型的引用,或者使用super等方式显式访问。例如:
Child child = new Child(); System.out.println(child.id); // 输出 101
✅ 最终答案
输出结果是:
100 Child原因:
base.id使用的是引用类型Base的字段,所以输出100。base.doSomething()是动态绑定,实际对象是Child,所以调用Child的方法,输出Child。

浙公网安备 33010602011771号