Java继承类程序执行流程解析与输出逻辑答疑
Java继承类程序执行流程解析
代码实现
public class MainClassInheritance { public static void main(String[] args) { Animal animal = new Animal("动物"); Animal shark = new AquaticAnimal("海豚"); Animal horse = new TerrestialAnimal("马"); Animal lion = new WildAnimal("老虎"); System.out.println(horse); } } class Animal { public Animal() { System.out.println("动物!"); } public Animal(String name) { this(name, 0); } public Animal(String name, int legs) { System.out.println( name + " 有 " + (legs == 0 ? "没有" : legs) + " 条腿"); } @Override public String toString() { return "我是一只动物!"; } } class AquaticAnimal extends Animal { public AquaticAnimal() { System.out.println("水生动物!"); } public AquaticAnimal(String name) { this(name, 0); System.out.println(name); } public AquaticAnimal(String name, int legs) { System.out.println( name + " 有 " + (legs == 0 ? "没有" : legs) + " 条腿"); } } class TerrestialAnimal extends Animal { public TerrestialAnimal() { System.out.println("陆生动物!"); } public TerrestialAnimal(String name) { this(name, 4); System.out.println(name); } public TerrestialAnimal(String name, int legs) { super(name, legs); System.out.println( name + " 有 " + (legs == 0 ? "没有" : legs) + " 条腿"); } } class WildAnimal extends TerrestialAnimal { public WildAnimal() { System.out.println("野生动物!"); } public WildAnimal(String name) { this(name, 4); System.out.println(name); } public WildAnimal(String name, int legs) { System.out.println( name + " 有 " + (legs == 0 ? "没有" : legs) + " 条腿"); } }
翻译后输出
动物 有 没有 条腿 动物! 海豚 有 没有 条腿 海豚 马 有 4 条腿 马 有 4 条腿 马 动物! 陆生动物! 老虎 有 4 条腿 老虎 我是一只动物!
执行流程详解
核心规则:子类构造方法若未显式调用父类构造(super),Java会自动调用父类的无参构造方法,以下按main方法的执行顺序逐一分析:
1. new Animal("动物")
- 调用
Animal(String name),该方法通过this(name, 0)调用Animal(String name, int legs) - 执行
Animal(String name, int legs):打印「动物 有 没有 条腿」
2. new AquaticAnimal("海豚")
- 调用
AquaticAnimal(String name),通过this(name, 0)调用AquaticAnimal(String name, int legs) - 该子类构造未显式调用父类构造,自动触发父类无参构造
Animal():打印「动物!」 - 执行
AquaticAnimal(String name, int legs):打印「海豚 有 没有 条腿」 - 回到
AquaticAnimal(String name),执行后续代码:打印「海豚」
3. new TerrestialAnimal("马")
- 调用
TerrestialAnimal(String name),通过this(name, 4)调用TerrestialAnimal(String name, int legs) - 该构造显式调用
super(name, legs),触发父类Animal(String name, int legs):打印「马 有 4 条腿」 - 执行
TerrestialAnimal(String name, int legs)自身代码:打印「马 有 4 条腿」 - 回到
TerrestialAnimal(String name),执行后续代码:打印「马」
4. new WildAnimal("老虎")
- 调用
WildAnimal(String name),通过this(name, 4)调用WildAnimal(String name, int legs) - 该构造未显式调用父类构造,自动触发父类
TerrestialAnimal()无参构造TerrestialAnimal()同样未显式调用父类构造,自动触发Animal():打印「动物!」- 执行
TerrestialAnimal()自身代码:打印「陆生动物!」
- 执行
WildAnimal(String name, int legs)自身代码:打印「老虎 有 4 条腿」 - 回到
WildAnimal(String name),执行后续代码:打印「老虎」
5. System.out.println(horse)
println会调用对象的toString()方法,TerrestialAnimal未重写该方法,因此调用父类Animal的toString(),返回并打印「我是一只动物!」
内容的提问来源于stack exchange,提问作者Jayden Morillo
相关产品推荐
相关产品推荐

