我有以下代码:
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;
}
提前感谢。
答案 0 :(得分:4)
调用非静态方法(您的start
方法)需要创建包含该方法(或该类的子类)的类的实例。创建类的实例需要调用类的构造函数及其所有祖先类。因此,您无法避免执行父默认构造函数。
关于第二个问题,将ProcessUtility.enableProcessUtility()
移动到子类的start方法意味着每次调用start
方法时都会执行它。
也就是说,在您的示例中,您的主要只创建一个Application
实例,并且只为该实例调用start
一次。因此,ProcessUtility.enableProcessUtility()
只会在两个片段中执行一次,行为也会相同。
编辑:两个代码段之间的另一个区别是第一个代码段在创建ProcessUtility.enableProcessUtility()
实例之前调用Application
,而第二个代码段首先创建实例,然后从内部调用ProcessUtility.enableProcessUtility()
子类的start
。如果构造函数(子类或超类)的行为受到ProcessUtility.enableProcessUtility()
调用的影响,则两个片段可能会产生不同的输出。
答案 1 :(得分:1)
您的第一个问题在这里得到解答https://stackoverflow.com/a/10508202/2527075
至于你的第二个问题,超级构造函数将在第二个例子中的ProcessUtility调用之前被调用,在第一个例子中,ProcessUtility调用首先出现。