我有以下代码:
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;
}提前谢谢。
发布于 2016-09-01 17:28:32
调用非静态方法( start方法)需要创建包含该方法的类的实例(或该类的子类)。创建类的实例需要调用类及其所有祖先类的构造函数。因此,您无法避免执行父级默认构造函数。
对于第二个问题,将ProcessUtility.enableProcessUtility()移到子类的start方法意味着每次调用start方法时都会执行该方法。
也就是说,在您的示例中,main仅创建Application的一个实例,并且仅为该实例调用start一次。因此,ProcessUtility.enableProcessUtility()在两个代码片段中只执行一次,并且行为将是相同的。
编辑:两个代码段之间的另一个区别是,第一个代码段在创建Application实例之前调用ProcessUtility.enableProcessUtility(),而第二个代码段首先创建实例,然后从子类的start中调用ProcessUtility.enableProcessUtility()。如果构造函数(子类或超类的)的行为受到ProcessUtility.enableProcessUtility()调用的影响,则这两个代码片段可能会产生不同的输出。
发布于 2016-09-01 17:31:30
你的第一个问题已经在这里回答了https://stackoverflow.com/a/10508202/2527075
至于你的第二个问题,在第二个例子中,超级构造函数将在ProcessUtility调用之前被调用,在第一个例子中,ProcessUtility调用是第一个。
https://stackoverflow.com/questions/39267672
复制相似问题