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

Java继承代码执行结果疑问:为何输出feline cougar cc?

嘿,这问题问得特别到位!我来给你把整个逻辑拆解得明明白白~

为什么没显式调用父类构造器却输出了feline?

首先得记住Java里一个默认的构造器规则:如果子类构造器没有显式用super()调用父类的构造器,编译器会自动在子类构造器的第一行插入super()(也就是调用父类的无参构造器)。

所以你写的Cougar构造器,其实被编译器偷偷修改成了这样:

public Cougar() {
    super(); // 这行是编译器自动加的!
    System.out.println("cougar");
}

这就解释了为什么控制台先输出feline(父类构造器的打印内容),再输出cougar(子类构造器的打印内容)。

为什么最终会输出cc?

再来看go()方法里的代码:

void go() {
    type = "c";
    System.out.println(this.type + super.type);
}

这里的关键是理解父类的type变量:它是非私有实例变量,子类会直接继承这个变量。因为你在Cougar类里没有重新定义一个同名的type变量,所以你在子类里操作的type,本质就是从父类继承来的那个实例变量。

当你执行type = "c"时,相当于this.type = "c",直接修改了当前Cougar对象里的type值(从原来的"f"改成了"c")。而super.type看起来是访问父类的成员,但因为实例变量是存储在对象中的,super只是用来标识“从父类的定义中找这个成员”,但最终指向的还是当前对象里的那个type变量——它已经被改成"c"了。

所以this.type和super.type的值都是"c",拼起来自然就是cc。

完整执行流程复盘

我们把整个代码的执行步骤串一遍,你就更清楚了:

  1. 执行new Cougar().go(),开始创建Cougar对象
  2. 进入Cougar构造器,编译器自动插入super(),触发父类Feline的构造器执行
  3. 父类构造器做两件事:初始化type为"f",然后打印feline
  4. 回到Cougar构造器,执行打印语句,输出cougar
  5. 调用go()方法:
    • 把当前对象的type值改成"c"
    • 打印this.type + super.type,两者都是"c",输出cc
  6. 最终控制台就输出了:feline cougar cc

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:16:53