Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从父类调用main()方法_Java_Main - Fatal编程技术网

Java 从父类调用main()方法

Java 从父类调用main()方法,java,main,Java,Main,有一个代码: class Test1{ public static void main(String[] args){ System.out.println("Test1"); } } class Test2 extends Test1{ } 当我尝试执行JavaTest1时,我当然会得到以下结果: 测试1 但是,当我尝试执行JavaTest2时,我仍然得到: 测试1 为什么??类Test2中不存在main()方法。静态方法不会被继承。如果我将mai

有一个代码:

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

class Test2 extends Test1{
}
当我尝试执行
JavaTest1
时,我当然会得到以下结果:

测试1

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

测试1

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

测试2


我理解为什么在这个示例中使用Test2。但我不明白,如果类Test2中不存在main(),为什么要得到Test1。

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

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

class Extended extends Base {
    public static void main(String[] args) {
        saySomething();
    }
}
静态方法不会被继承

静态方法是继承的。看看

类C从其直接超类和直接超接口继承超类和超接口的所有
抽象
非抽象
方法,这些方法是
公共
受保护
,或在与C相同的包中以
默认
访问权限声明的,并且既不被重写(§8.4.8.1)也不被类别中的声明隐藏(§8.4.8.2)

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


也来自

如果一个类声明了一个
静态
方法
m
,那么声明
m
被称为隐藏任何方法
m
,其中
m
的签名是
m
签名的子签名(§8.4.2),在类的超类和超接口中,否则类中的代码可以访问这些超类和超接口

因此,当您在
Test2
类中创建新的
main
方法时,您隐藏了(未重写)
Test1.main
方法,这就是您将其视为输出的原因

Test2

和静态方法不会继承。
谁告诉你的?静态方法不能被重写(它们不是多态的),但它们可以被继承和隐藏,就像您在示例中清楚看到的那样。@KlemensMorbe现在这是一个谎言。当classloader在类中找不到main()方法时,是否在父类中搜索main()方法?我前面的评论有错误:静态方法被隐藏,没有阴影,谢谢。然而,现在它并不重要。我试图理解为什么在父类中调用了方法而不是错误。为什么您希望出现错误?JVM在Test2的继承树中寻找了一个主方法,并找到了一个。在撰写评论时,我不理解这一点非常感谢。如果我理解正确,在创建类对象时,Test2从Test1继承静态方法main()。若并没有显式地创建它,那个么将调用继承的方法。