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

时间:2016-09-01 09:25:08

标签: java methods polymorphism override super

我有以下代码:

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;
}

提前感谢。

2 个答案:

答案 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调用首先出现。