返回博主主页

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)来访问的

所以:

  • baseBase 类型,因此访问的是 Base.id,即 100

✅ 结果:100


3. base.doSomething();

  • doSomething() 是一个 普通实例方法,且被 Child 重写了(@Override)。
  • 方法调用是动态绑定:JVM 会根据对象的实际运行时类型(Child)来决定调用哪个方法。

所以:

  • 虽然引用是 Base 类型,但实际对象是 Child,因此调用的是 Child.doSomething()

✅ 结果:Child


🧠 总结关键点

特性 字段(id 方法(doSomething
绑定方式 静态绑定(编译时决定) 动态绑定(运行时决定)
实际访问 按引用类型(Base 按对象实际类型(Child
输出结果 100 Child

💡 小贴士:如何访问 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

posted @ 2025-11-27 17:28  懒惰的星期六  阅读(9)  评论(0)    收藏  举报