黑马程序员技术交流社区

标题: 为什么输出这个字符串 [打印本页]

作者: 仲伟    时间: 2013-5-12 20:56
标题: 为什么输出这个字符串
本帖最后由 仲伟 于 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
作者: 黑马-许鹏    时间: 2013-5-12 21:19
奇怪,同问?
作者: 黑马-许鹏    时间: 2013-5-12 21:20
应该是103040才对啊
作者: 张迁    时间: 2013-5-12 21:22
第一:new Sub(),调用Sub的无参构造方法Sub(),
第二:Sub()首行有隐式的super(),及调用父类的构造方法,输出10;
第三:执行Sub()里面的打印方法,输出30;
第四:new Sub()是匿名对象,new Sub().j,就是要输出j的值,即40;
估计过是;103040

同学以后代码写的整齐一点,看的好费劲
作者: fjl_fight    时间: 2013-5-12 21:28
本帖最后由 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,不解释,你懂得

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

为什么我编辑的时候点击代码 然后把复制的代码粘贴进去之后都是靠边对齐的呢?跟楼主的一样而不是像你这样呢。  怎么弄的呢?我也是复制整齐的代码的呀
作者: fjl_fight    时间: 2013-5-12 21:35


作者: 赵崇友    时间: 2013-5-12 22:18
楼主的输出结果没有问题。
代码的执行顺序是这样的,当你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

作者: 孙百鑫    时间: 2013-5-12 22:22
赵崇友 发表于 2013-5-12 22:18
楼主的输出结果没有问题。
代码的执行顺序是这样的,当你new Sub()时,会在Sub类中找无参数的构造函数, ...

我次奥.!辛苦了.看你图画的好流弊
作者: 赵崇友    时间: 2013-5-12 22:38
孙百鑫 发表于 2013-5-12 22:22
我次奥.!辛苦了.看你图画的好流弊

很少画图,编辑的草草泛泛,谅解!!
作者: 石贤芝    时间: 2013-5-12 22:47
这个题的关键是要先知道一句话:子类在初始化时,先执行父类的构造函数,然后才是子类的成员变量初始化,然后是子类构造函数的其它部分执行;
此题打印了三次变量“j”的值,
第一次打印时在父类构造函数执行期间,子类的成员变量还没有初始化,所以此时 j=0;
第二次打印时父类构造函数执行完毕,子类的成员变量也初始化完毕,所以此时 j=30;
第三次打印时,父类构造函数、子类成员变量的初始化和子类构造函数都已经执行完毕,所以此时 j=40;
所以最终输出结果是  03040
呵呵,希望能明白。

作者: 仲伟    时间: 2013-5-12 23:52
8047107 发表于 2013-5-12 21:30
为什么我编辑的时候点击代码 然后把复制的代码粘贴进去之后都是靠边对齐的呢?跟楼主的一样而不是像你这 ...

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

很流弊,我忠于明白了啊
作者: 8047107    时间: 2013-5-12 23:59
fjl_fight 发表于 2013-5-12 21:35

我是点击了这个的啊。。。
作者: 8047107    时间: 2013-5-13 00:00
  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. }
复制代码

作者: 8047107    时间: 2013-5-13 00:03
仲伟 发表于 2013-5-12 23:52
ctrl+shift+F就可以了

不行的啊。在直接弹出的回复框里是可以点击源码然后粘贴 是整齐的  但是在高级模式下 点击源码再粘贴就靠边了。。
作者: 仲伟    时间: 2013-5-13 00:08
8047107 发表于 2013-5-13 00:03
不行的啊。在直接弹出的回复框里是可以点击源码然后粘贴 是整齐的  但是在高级模式下 点击源码再粘贴就靠 ...

我说在 eclipse   快捷键
作者: Sword    时间: 2013-5-13 11:12
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解决”,谢谢合作!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2