从父类调用main()方法

时间:2014-03-22 12:36:42

标签: java main

有一个代码:

class Test1{
    public static void main(String[] args){     
        System.out.println("Test1");
    }
}

class Test2 extends Test1{
}

当我尝试执行java Test1时,我当然得到了这个:

  

测试1

但是,当我尝试执行java Test2时,我仍然得到:

  

测试1

为什么呢?在类Test2中不存在main()方法。并且静态方法不会继承。如果我在Test2中添加main()(使用字符串“Test2”而不是“Test1”),我会得到:

  

的Test2

我理解为什么我在这个例子中得到了Test2。但是如果在Test2类中不存在main(),我不明白为什么我会得到Test1。

2 个答案:

答案 0 :(得分:3)

  

静态方法不会继承。

继承静态方法。看看jls-8.4.8 Inheritance, Overriding, and Hiding

  

C类继承自其直接超类并直接超级接口超级类的所有abstractnon-abstract方法以及publicprotected或使用{声明的超接口{1}}在与C相同的包中访问,并且不会被类中的声明覆盖(第8.4.8.1节)或隐藏(第8.4.8.2节)。

没有关于不继承静态方法的信息,这就是为什么你可以通过default类(它被继承)运行main中声明的Test1


同样来自jls-8.4.8.2 Hiding (by Class Methods)

  

如果某个类声明了Test2方法static,那么声明m会被称为隐藏任何方法m',其中m的签名是m'签名的子签名(第8.4.2节),在类的超类和超接口中,否则该类中的代码可以访问。

因此,当您在m类中创建新的main方法时,您隐藏(未覆盖)Test2方法,这就是您看作输出的原因

Test1.main

答案 1 :(得分:2)

静态方法实际上是继承的。这就是这里发生的事情。防爆。这很好用:

class Base {
    public static void saySomething() {
        System.out.println("Hi!");
    }
}

class Extended extends Base {
    public static void main(String[] args) {
        saySomething();
    }
}