我在玩弄实例控制流和静态控制流,注意下面的代码
class A {
{
m1();
}
A(){
System.out.println("A constructor");
}
void m1(){
System.out.println("A m1");
}
}
public class Main extends A {
public static void main(String[] args) throws Exception {
Main m = new Main();
}
void m1(){
System.out.println("Main m1");
}
}
代码的输出是:
Main m1
A constructor
我知道这是因为:
首先,静态块和变量被识别为自上而下的父子,在这种情况下,只有一个main()
是静态的。
其次,静态块和变量赋值被执行,所以main()
开始执行,并且尝试创建一个新Main
对象。
所以第三,将识别父类的实例块和变量。然后它们将自上而下执行。(之后父类的构造函数运行,然后识别子类的实例块和变量,然后自上而下执行,最后执行子类的构造函数)。
所以 A 中的实例块调用了 `m1()`。然后,A 的构造函数执行。最后,控制流返回到 `main()` 并且程序终止。
现在,从 A 调用 `m1()` 调用了 `Main` 的 `m1()`。但是,如果我将“m1()”方法都设为静态,其他一切都保持不变,那么从 A 的实例块调用“m1()”就会调用 A 的“m1()”。
我有两个问题(为什么?纯粹出于学术原因,我还在学习 Java):
- 当这两种
m1()
方法都是非静态的时,是否可以从 A 的实例块调用 A 的 m1()?我尝试做一个this.m1()
,但仍然调用 Main 的 m1()。(为什么?) - 当这两个
m1()
方法都是静态的时,是否可以从 A 的实例块调用 Main 的 m1()?(我猜不是,但我不确定)。
我知道在第一种情况下,它正在发生,而在第二种情况下,它是方法隐藏。但是我仍然不确定如何根据这些知识回答我的问题。