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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:40:05