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。
完整执行流程复盘
我们把整个代码的执行步骤串一遍,你就更清楚了:
- 执行
new Cougar().go(),开始创建Cougar对象 - 进入
Cougar构造器,编译器自动插入super(),触发父类Feline的构造器执行 - 父类构造器做两件事:初始化
type为"f",然后打印feline - 回到
Cougar构造器,执行打印语句,输出cougar - 调用
go()方法:- 把当前对象的
type值改成"c" - 打印
this.type + super.type,两者都是"c",输出cc
- 把当前对象的
- 最终控制台就输出了:
feline cougar cc
内容的提问来源于stack exchange,提问作者Kuii Maldonado
相关产品推荐
相关产品推荐

