为什么这个Java程序会输出这个结果
public static void main(String[] args){
A a=new B();
B b=new B();
a.h();
b.t();
}
}
class A{
int k=6;
static int j=7;
public void t(){
System.out.println(k);
}
public static void h(){
System.out.println(j);
}
public A(){
t();
h();
}
}
class B extends A{
int k=8;
static int j=9;
static{
new A().t();
}
public void t(){
System.out.println(k);
}
public static void h(){
System.out.println(j);
}
public B(){
t();
h();
}
}
运行结果:
6
7
6
0
7
8
9
0
7
8
9
7
8 展开
一.调试了一下A a=new B();的执行顺序
先加载类,执行父类的静态变量static int j=7;,然后执行子类的静态变量及代码块static int j=9;
static{new A().t();} 。这里会先执行new A(),然后执行t().可以分1)、2)两步来看1):出现new A()了就会加载非静态变量int k=6,然后调用类A的构造器,构造器里调用类A的t();输出【6】,构造器里再调用类陆凳A的h();输出【7】.。
2):类A构造器返回后,调用类A的t()输出【6】。
2 类加载完成后,就开始new B()了,它会先调用A的构造器,这里也是先加载A中非静态变量int k=6;然后执行A构造器,当要执行A里面的方法t()时;这个方法是非静态方法,而这里没有A的实例存在,因此,会转而调用类B的方法t(),而这个 单纯的调用过程也没有加载B中的int k=8.因此输出的k是int的空值【0】,方法返回后会调用A的h();这个方法是静态方法,因此输出A中的【7】
然后就调用B的构造器了,它先加载B中早裂旅的int k=8;再调用构造方法中的t(),由于此时k已经加载了,因此源正输出【8】,接下来是h(),输出【9】。
以上就是A a=new B();
二.B A a=new B();
与一中不同的是,不需要加载类,因为一个类在程序执行过程只加载一次。因此输出从new B()开始,同上依次输出【0】【7】【8】【9】
三.a.h();和b.t();由于h()是static 方法是静态绑定的,因此调用的是父类的h()输出【7】,而t()是非静态方法,是动态绑定,因此调用的是B类的方法,输出【8】。
我也初学,不知道理解得对不对,感觉有些术语说得不太准确
在类B中执行t()时,这个方法是非静态方法,而这里没有B的实例存在,那怎么在A是输出0,而这里就不是了?
静态代码块:静态代码块的执戚穗行在加载类的相关信息时执行,在执行构造方法之前
继承:在new子类的对雹谨象时要先调用父类的构造方法,再执行子类的构造方法。
你按照这个思路去画堆栈图一源仔基步一步的分析程序的执行过程,你就能得到输出结果。
希望对你有帮助~~~