代码求解? 谢谢

VRC289 2011-07-26 11:19:10
在类A中为什么执行showX() 方法是执行类B中的ShowX() 方法,在new 一个B对象之前,不是应该先执行父类 A的构造方法吗? 在这个时候类B的实例还没有被创建,如何执行B实例中的方法了? 求高手指点


public class test
{
public static void main(String[] args)
{
B b = new B(0);
}
}

class B extends A
{
B(int x)
{
x = x + 2; // 只对局部x操作
showX();
}
public void showX()
{
System.out.println("B.x=" + x);
}
}

class A
{
public static int x = 2;

A()
{
x = x + 1;
showX();
}
public void showX()
{
System.out.println("A.x=" + x);
}
}
...全文
166 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
VRC289 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 zl3450341 的回复:]

引用 12 楼 qybao 的回复:

方法存在于代码区,所以一旦B实例创建,方法就会加载到代码区,以后即使创建多个B实例,也只会有一份代码指令。
当B实例被创建的时候,B实例本身可能还没有被完全创建,但是不影响代码区的代码指令加载,因为B实例最终存在堆区,这种情况,只会影响B实例的数据区,即B的属性的赋值(初始化等)

宝哥的解释是比较底层,从JVM 内存的角度来解释的。。估计楼主听……
[/Quote] o(︶︿︶)o 大胡子哥说的对,是没听懂 底子比较薄,要看懂这上面这句话需要在哪方面加强修炼啊?
chenchengamao 2011-07-26
  • 打赏
  • 举报
回复
是我太激动了,对不起。。。

向“feifeikub”及“zn85600301”至歉。
zl3450341 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qybao 的回复:]

方法存在于代码区,所以一旦B实例创建,方法就会加载到代码区,以后即使创建多个B实例,也只会有一份代码指令。
当B实例被创建的时候,B实例本身可能还没有被完全创建,但是不影响代码区的代码指令加载,因为B实例最终存在堆区,这种情况,只会影响B实例的数据区,即B的属性的赋值(初始化等)
[/Quote]
宝哥的解释是比较底层,从JVM 内存的角度来解释的。。估计楼主听不懂
feifeikub 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feifeikub 的回复:]
首先你的main()方法执行的时候,创建B的时候带了参数0,虽然你继承了A类,但是不满足A类的构造方法,肯定不会执行,那只有满足B的构造方法,所以执行了B的构造方法。
[/Quote]
至于我的回答有误,在这里表示道歉,承认自己是菜鸟,但是有些人没必要在这里指指点点别人,至于别人几个星怎么来的,肯定有人家来的道理,如果感觉自己确实牛B,就解决问题,不是来这里指手画脚的,我觉得大胡子的精神值得学习。
qybao 2011-07-26
  • 打赏
  • 举报
回复
方法存在于代码区,所以一旦B实例创建,方法就会加载到代码区,以后即使创建多个B实例,也只会有一份代码指令。
当B实例被创建的时候,B实例本身可能还没有被完全创建,但是不影响代码区的代码指令加载,因为B实例最终存在堆区,这种情况,只会影响B实例的数据区,即B的属性的赋值(初始化等)
zl3450341 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chenchengamao 的回复:]
这还对?我不知道你两个星是哪来的。。。。
[/Quote]
不对,指出就好,没必要用这种口气说话,至于星星,只能说明一个热心程度, 总有你能帮得上的人
zl3450341 2011-07-26
  • 打赏
  • 举报
回复

B(int x)
{
x = x + 2; // 只对局部x操作
showX();
}



其实等价于:


B(int x)
{
super();
x = x + 2; // 只对局部x操作
showX();
}


楼主的理解也没错,B初始化的时候,先去调用父类的构造函数。。也就是A

A() {
x = x + 1;
showX();
}


实际上是:

A() {
x = x + 1;
this.showX();
}


但是此时的this 显然是B的实例。。。由于B已经重写了showX()方法,所以调用的是他本身的showX();
chenchengamao 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zn85600301 的回复:]

引用 2 楼 feifeikub 的回复:

首先你的main()方法执行的时候,创建B的时候带了参数0,虽然你继承了A类,但是不满足A类的构造方法,肯定不会执行,那只有满足B的构造方法,所以执行了B的构造方法。

对的~ 这种问题 你debug跟一遍就知道了
[/Quote]

这还对?我不知道你两个星是哪来的。。。。

你看下下面代码

public class MyJava
{
public static void main(String[] args)
{
B b = new B(0);
}
}

class B extends A
{
B(int x)
{
System.out.println("B");
}
}

class A
{
A()
{
System.out.println("A");
}
}
chenchengamao 2011-07-26
  • 打赏
  • 举报
回复
是还没创建,你在调的过程就是创建过程,你调用ShowX(),它是用到动态绑定机制,它关心的不是你对象出来了没,是关心你要创建的对象它所属类的,然后再去这个所属类中调用ShowX()实例方法
zl3450341 2011-07-26
  • 打赏
  • 举报
回复
关于构造函数,说明3 点:

(1) 对象是由 new 运算符创建的,且在任何构造函数执行之前就已经创建完毕了;
(2) 构造函数的执行总是 “ 向上 ” 的:而且总是先执行完父类的构造函数;
(3) 显式初始化语句总是先于构造函数语句,但后于 super() 或 this() 。

看了第一点,楼主明白了吗?

VRC289 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chenchengamao 的回复:]

这是多态问题,调用方法,会优先调用该对象实际所属类中的方法。
[/Quote]

如果这样写

A a = new B();
a.ShowX();

我知道这个是多态的,但是在A构造函数里面执行的时候,B对象不是还没有创建吗?
walkman_22 2011-07-26
  • 打赏
  • 举报
回复
没有重写父类的构造方法~~
VRC289 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feifeikub 的回复:]

首先你的main()方法执行的时候,创建B的时候带了参数0,虽然你继承了A类,但是不满足A类的构造方法,肯定不会执行,那只有满足B的构造方法,所以执行了B的构造方法。
[/Quote]

啥玩意啊 new 一个B对象的时候肯定会执行B的构造方法啊, 我是说在执行A构造方法的时候,里面有一个方法 ShowX() , 为什么B的 而不是A的
zn85600301 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 feifeikub 的回复:]

首先你的main()方法执行的时候,创建B的时候带了参数0,虽然你继承了A类,但是不满足A类的构造方法,肯定不会执行,那只有满足B的构造方法,所以执行了B的构造方法。
[/Quote]
对的~ 这种问题 你debug跟一遍就知道了
feifeikub 2011-07-26
  • 打赏
  • 举报
回复
首先你的main()方法执行的时候,创建B的时候带了参数0,虽然你继承了A类,但是不满足A类的构造方法,肯定不会执行,那只有满足B的构造方法,所以执行了B的构造方法。
chenchengamao 2011-07-26
  • 打赏
  • 举报
回复
这是多态问题,调用方法,会优先调用该对象实际所属类中的方法。
afj0075 2011-07-26
  • 打赏
  • 举报
回复
可以点测试跟进 程序运行,就会明白了
VRC289 2011-07-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 zl3450341 的回复:]

Java code

B(int x)
{
x = x + 2; // 只对局部x操作
showX();
}




其实等价于:

Java code

B(int x)
{
super();
x = x + 2; // 只对局部x操作
showX();
}
……
[/Quote]

理解了 谢谢

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧