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

如何理解构造函数用法?修改Java类以两种方式输出“My App”

解决方法:两种方式打印"My App"

嘿,我来帮你搞定这个问题!咱们一步步来,先理清楚需求:要修改给定的Java代码,用两种不同方式打印出My App,分别是通过方法重写,以及通过构造函数初始化。同时我也会帮你理解怎么用构造函数解决这类问题。


方式1:使用方法重写

原来的MyApp类只是继承了DefaultApplication,但没有重写父类的getName()方法,所以调用时会返回父类的静态常量NAME(值为"defapp")。我们只需要在MyApp里重写getName()方法,让它直接返回"My App"即可:

abstract class Application {
    public abstract String getName();
}

class DefaultApplication extends Application {
    public static final String NAME = "defapp";
    
    @Override
    public String getName() {
        return NAME;
    }
}

class MyApp extends DefaultApplication {
    // 重写getName方法,覆盖父类的实现
    @Override
    public String getName() {
        return "My App";
    }
}

public class ApplicationTest {
    public static void main(String[] args) {
        Application myApp = new MyApp();
        System.out.println(myApp.getName()); // 输出: My App
    }
}

为什么这样有效?

这是面向对象的多态特性:当子类重写了父类的方法后,通过父类引用调用该方法时,实际执行的是子类的实现。这里MyApp重写了getName(),所以调用时就会返回我们想要的"My App"。


方式2:使用构造函数

构造函数的核心作用是初始化对象的状态。如果我们希望在创建对象时就给它设置好名称,而不是依赖子类重写方法,可以调整类的结构,通过构造函数传递并初始化名称:

abstract class Application {
    public abstract String getName();
}

// 修改DefaultApplication,添加实例变量和构造函数
class DefaultApplication extends Application {
    protected String name; // 用protected让子类可以访问
    
    // 默认构造函数:使用默认名称"defapp"
    public DefaultApplication() {
        this.name = "defapp";
    }
    
    // 带参数的构造函数:允许自定义名称
    public DefaultApplication(String name) {
        this.name = name;
    }
    
    @Override
    public String getName() {
        return name;
    }
}

class MyApp extends DefaultApplication {
    // 调用父类的带参构造函数,传入"My App"初始化名称
    public MyApp() {
        super("My App");
    }
}

public class ApplicationTest {
    public static void main(String[] args) {
        Application myApp = new MyApp();
        System.out.println(myApp.getName()); // 输出: My App
    }
}

如何理解用构造函数解决问题?

构造函数适合在对象创建阶段就确定它的属性值,比如这里的应用名称。它的优势是灵活性更高:你可以用同一个DefaultApplication类创建出不同名称的实例(比如new DefaultApplication("Custom App")),而不需要为每个名称都写一个子类。如果你的需求是让对象在诞生时就具备特定状态,构造函数就是很好的选择。


内容的提问来源于stack exchange,提问作者Hajar Saud

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:53:58