为什么这个Java程序会输出这个结果

publicclassTest{publicstaticvoidmain(String[]args){Aa=newB();Bb=newB();a.h();b.t();}}... public class Test {

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
展开
 我来答
zbingle
2014-07-07 · TA获得超过195个赞
知道小有建树答主
回答量:80
采纳率:100%
帮助的人:75.1万
展开全部

一.调试了一下A a=new B();的执行顺序

  1. 先加载类,执行父类的静态变量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,而这里就不是了?
追答

public B(){
t();
h();}

你问的是这个吗?

因为这个构造器是new B()后调用的,它除了会引发调用父类A的构造器外还有一个作用就是先加载子类B的非静态变量K,然后才是B的构造器,在调用B构造器之前K已经加载了,这时再执行t()时,输出已经加载的K值


另外new B()就是相当于生成了一个实例,不过没有实例变量来指向它而已

要不然你以为下面的new A()凭什么来调用t()

static{
new A().t();
}

你自己用Eclipse里的那个小虫子调试一下看看

乐正雁卉d1c01
2014-07-07 · TA获得超过103个赞
知道答主
回答量:80
采纳率:0%
帮助的人:50.2万
展开全部
  1. 静态代码块:静态代码块的执戚穗行在加载类的相关信息时执行,在执行构造方法之前

  2. 继承:在new子类的对雹谨象时要先调用父类的构造方法,再执行子类的构造方法。

你按照这个思路去画堆栈图一源仔基步一步的分析程序的执行过程,你就能得到输出结果。

希望对你有帮助~~~

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
云闯yun
2014-07-07
知道答主
回答量:4
采纳率:0%
帮助的人:5396
展开全部
Java继承机制,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式