A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 仲伟 中级黑马   /  2013-5-12 20:56  /  1849 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 仲伟 于 2013-5-13 19:09 编辑

class Super{
int i=10;
Super(){
print();
i=20;
}
void print(){
System.out.print(i);
}
}
public class Sub extends Super{
int j=30;
Sub(){
print(); j=40;
}
void print(){
System.out.print(j);
}
public static void main(String[] args){
System.out.print(new Sub().j);
}
}

输出:03040

评分

参与人数 1技术分 +1 收起 理由
殇_心。 + 1

查看全部评分

17 个回复

倒序浏览
奇怪,同问?
回复 使用道具 举报
应该是103040才对啊
回复 使用道具 举报
第一:new Sub(),调用Sub的无参构造方法Sub(),
第二:Sub()首行有隐式的super(),及调用父类的构造方法,输出10;
第三:执行Sub()里面的打印方法,输出30;
第四:new Sub()是匿名对象,new Sub().j,就是要输出j的值,即40;
估计过是;103040

同学以后代码写的整齐一点,看的好费劲
回复 使用道具 举报
本帖最后由 fjl_fight 于 2013-5-12 21:29 编辑

1、如果不知道是怎么输出的要么用eclipse的debug调试跟进去看他的执行顺序(推荐)
2、要么用以下代码跟进看一下
  1. package fjl;

  2. class Super{
  3.         int i=10;
  4.         Super(){
  5.           System.out.println("one start");
  6.           print();
  7.           i=20;
  8.         }
  9.         void print(){
  10.                 System.out.print("two");
  11.                 System.out.println(i);
  12.         }
  13. }
  14. class Sub extends Super{
  15.         int j=30;
  16.         Sub(){
  17. //super(); 此处代码省略
  18.                 System.out.println("three start");
  19.             print();
  20.             j=40;

  21.         }
  22.         void print(){
  23.                 System.out.println("four");
  24.           System.out.println(j);
  25.         }
  26. }
  27. public class XXX{
  28.         public static void main(String[] args){
  29.                
  30.           System.out.print(new Sub().j);
  31.         }
  32. }
复制代码
输出:
one start
four
0
three start
four
30
40

解释:
1、new Sub(); 会调用super();,即调用父类的构造方法,
2、由于子类覆写了print()方法,则父类构造方法中print()调用被子类覆写的方法,由于是被父类构造调用,则j为默认初始值0
3、再运行Sub();构造方法的语句,调用子类本类的print()方法,则j=30
4、new Sub().j=40,不解释,你懂得

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
fjl_fight 发表于 2013-5-12 21:28
1、如果不知道是怎么输出的要么用eclipse的debug调试跟进去看他的执行顺序(推荐)
2、要么用以下代码跟进看 ...

为什么我编辑的时候点击代码 然后把复制的代码粘贴进去之后都是靠边对齐的呢?跟楼主的一样而不是像你这样呢。  怎么弄的呢?我也是复制整齐的代码的呀
回复 使用道具 举报

回复 使用道具 举报
楼主的输出结果没有问题。
代码的执行顺序是这样的,当你new Sub()时,会在Sub类中找无参数的构造函数,注意这时 j 没有被初始化 默认值为 0 ,由于在Sub类无参数的构造函数中 第一行有默认的super语句,所以这时候回去找Super中的无参数的构造函数,并且Super类中的这个构造函数第一行也有默认的Super语句,它是超类Object的无参数构造函数,当Object中的无参数构造函数执行完后,接着Super类就会开始显示初始化i的值为i=30,然后执行Super构造函数中的print语句,注意由于子类Sub复写了父类Super中的print方法,因此这时候调用的是Sub中的print方法, 由于 此时的 j  为 0 ,所以首先打印的是 0; Super构造函数print语句执行完后,紧接就是给 i 赋值 i =20;super构造函数执行完后,返回到Sub类中,这时候就开始初始化 j 的值了 ,即执行 int j=30;然后执行Sub构造函数中的print语句,这时候打印的是 30,没有异议。后面就是给 j 赋值语句:j=40;
之后返回到主函数中,实现匿名对象调用 j 参数,并打印 40. 所以 整个打印的 是:03040

写了那么多,够详细了;希望楼主能够看懂。

看图:画了好久:

QQ截图20130512215938.png (28.94 KB, 下载次数: 0)

QQ截图20130512215938.png

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
赵崇友 发表于 2013-5-12 22:18
楼主的输出结果没有问题。
代码的执行顺序是这样的,当你new Sub()时,会在Sub类中找无参数的构造函数, ...

我次奥.!辛苦了.看你图画的好流弊
回复 使用道具 举报
孙百鑫 发表于 2013-5-12 22:22
我次奥.!辛苦了.看你图画的好流弊

很少画图,编辑的草草泛泛,谅解!!
回复 使用道具 举报
这个题的关键是要先知道一句话:子类在初始化时,先执行父类的构造函数,然后才是子类的成员变量初始化,然后是子类构造函数的其它部分执行;
此题打印了三次变量“j”的值,
第一次打印时在父类构造函数执行期间,子类的成员变量还没有初始化,所以此时 j=0;
第二次打印时父类构造函数执行完毕,子类的成员变量也初始化完毕,所以此时 j=30;
第三次打印时,父类构造函数、子类成员变量的初始化和子类构造函数都已经执行完毕,所以此时 j=40;
所以最终输出结果是  03040
呵呵,希望能明白。
回复 使用道具 举报
8047107 发表于 2013-5-12 21:30
为什么我编辑的时候点击代码 然后把复制的代码粘贴进去之后都是靠边对齐的呢?跟楼主的一样而不是像你这 ...

ctrl+shift+F就可以了
回复 使用道具 举报
本帖最后由 仲伟 于 2013-5-12 23:55 编辑
赵崇友 发表于 2013-5-12 22:18
楼主的输出结果没有问题。
代码的执行顺序是这样的,当你new Sub()时,会在Sub类中找无参数的构造函数, ...

很流弊,我忠于明白了啊
回复 使用道具 举报
fjl_fight 发表于 2013-5-12 21:35

我是点击了这个的啊。。。
回复 使用道具 举报
  1. class  halfSearch
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 int []arr={1,2,3,4,5,6};
  6.                 int index=halfSearch(arr,5);
  7.                 System.out.println("index="+index);       
  8.         }
  9.         public static int halfSearch(int [] arr,int key)
  10.         {
  11.                 int min=0,max=arr.length-1,mid;
  12.                
  13.                 mid=(min+max)/2;

  14.                 while (arr[mid]!=key)
  15.                 {
  16.                         if (key>arr[mid])
  17.                                 min=mid+1;
  18.                         else if (key<arr[mid])
  19.                                 max=mid-1;
  20.                         if (min>max)
  21.                                 return -1;
  22.                         mid=(max+min)/2;
  23.                 }
  24.                         return mid;

  25.         }       

  26. }
复制代码
回复 使用道具 举报
仲伟 发表于 2013-5-12 23:52
ctrl+shift+F就可以了

不行的啊。在直接弹出的回复框里是可以点击源码然后粘贴 是整齐的  但是在高级模式下 点击源码再粘贴就靠边了。。
回复 使用道具 举报
8047107 发表于 2013-5-13 00:03
不行的啊。在直接弹出的回复框里是可以点击源码然后粘贴 是整齐的  但是在高级模式下 点击源码再粘贴就靠 ...

我说在 eclipse   快捷键
回复 使用道具 举报
Sword 金牌黑马 2013-5-13 11:12:51
18#
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解决”,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马