gpt4 book ai didi

java - 这段代码的行为有什么不同?

转载 作者:行者123 更新时间:2023-11-30 06:08:47 24 4
gpt4 key购买 nike

我有以下代码:

public class Application extends ApplicationManager{

public static void main(String[] args) {
ProcessUtility.enableProcessUtility();
new Application().start();
}
}

和类ApplicationManager代码:

public class ApplicationManager {

public ApplicationManager() {

String configPath = "file:home" + File.separator + "log4j.xml";
System.setProperty("log4j.configuration", configPath);
logger = Logger.getLogger(ApplicationManager.class);
}

protected void start() {
logger.info("*** Starting ApplicationManager ***");
}

当我运行应用程序类时,将调用父级的start方法,是否可以在不调用父级默认构造函数的情况下调用它?

我的第二个问题是上面的代码与此代码不同:

public class Application extends ApplicationManager{

public static void main(String[] args) {
new Application().start();
}


@Override
protected void start() {
ProcessUtility.enableProcessUtility();
super.start();
}
}

以及上面的 ApplicationManager 类。

这是静态方法的代码:

public static void enableProcessUtility() {
isCommon = false;
}

提前致谢。

最佳答案

调用非静态方法(您的 start 方法)需要创建包含该方法的类的实例(或该类的子类)。创建类的实例需要调用该类及其所有祖先类的构造函数。因此,您无法避免执行父默认构造函数。

对于第二个问题,将ProcessUtility.enableProcessUtility()移动到子类的start方法中意味着每次调用start方法时都会执行它。

也就是说,在您的示例中,您的 main 仅创建一个 Application 实例,并且只为该实例调用 start 一次。因此,ProcessUtility.enableProcessUtility() 在两个代码段中只会执行一次,并且行为是相同的。

编辑:两个片段之间的另一个区别是第一个片段在创建 Application 实例之前调用 ProcessUtility.enableProcessUtility(),而第二个片段首先创建实例然后从子类的 start 中调用 ProcessUtility.enableProcessUtility()。如果构造函数(子类或父类(super class))的行为受到对 ProcessUtility.enableProcessUtility() 的调用的影响,则两个片段可能会产生不同的输出。

关于java - 这段代码的行为有什么不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39267672/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com