黑马程序员技术交流社区

标题: Java继承好纠结 [打印本页]

作者: 354620815    时间: 2014-10-8 12:46
标题: Java继承好纠结
本帖最后由 354620815 于 2014-10-8 19:57 编辑
  1.     class Fu{
  2.             int num = 5;
  3.             Fu(){
  4.                     this.show();//这个this指向哪个对象
  5.                     System.out.println(this.num);//这个this又指向哪个对象
  6.             }
  7.             void show(){
  8.                     System.out.println("55");
  9.             }
  10.     }
  11.     class Zi extends Fu{
  12.             int num = 3;      
  13.             void show(){
  14.                     System.out.println(num);
  15.             }
  16.     }
  17.     public class Test1 {

  18.             public static void main(String[] args) {

  19.                     Fu f = new Zi();
  20.                     f.show();
  21.             }
  22.     }
复制代码



作者: 354620815    时间: 2014-10-8 12:58
本帖最后由 354620815 于 2014-10-8 19:58 编辑

{:3_68:}{:3_68:}
作者: 唐王潮    时间: 2014-10-8 14:03
  1. package pro.properties;


  2. class Fu{
  3.     int num = 1;
  4.     Fu(){
  5.             show();//被子类继承指向子 ,父类中new出的子类调用子类的show(),由于子类中show的num指向子类,父类中没有子类num,所以为默认值0 //只能这么解释了,可能感觉有点牵强,希望有人能把这里说的更透彻点
  6.             System.out.println("fu:"+this.num);//指向父类num
  7.     }
  8.     //这里show方法被子类覆盖,可以看成f.show()调用的是子类的show方法。子类中show方法中num指向子类num,所以打印值为3
  9.     void show(){
  10.         System.out.println("fu:"+"5");
  11.     }
  12. }
  13. class Zi extends Fu{
  14.     int num = 1;
  15. //    子继承父默认的构造函数
  16.     Zi(){
  17.             super();
  18.            
  19.     }
  20.     void show(){
  21.             System.out.println("zi:"+num);//这个num指子类对象,创建子类对象调用的就是子类num
  22.     }
  23. }
  24. public class TTT {

  25.     public static void main(String[] args) {

  26.             Fu f = new Zi();
  27.             f.show();
  28.             
  29.     }
  30. }
复制代码

作者: 18643448863    时间: 2014-10-8 17:07
本帖最后由 18643448863 于 2014-10-8 17:37 编辑
  1. class Fu{
  2.         int num = 5;
  3.         Fu(){
  4.                 this.show();//这个this指向哪个对象,show被复写,调用的是Zi中的show, System.out.println(num);num之前省略的是this.指向的是zi中的      num,但是这个时候zi中的num还没有被显示初始化所以显示的是默认初始化的O
  5.                 System.out.println(this.num);//这个this又指向哪个对象,这个是this是自己Fu里面的啊在执行构造函数钱,已经显示初始化 所以是5
  6.         }
  7.         void show(){
  8.                 System.out.println("55");
  9.         }
  10. }
  11. class Zi extends Fu{
  12.         int num = 3;        
  13.         void show(){
  14.                 System.out.println(num);
  15.         }
  16. }
  17. public class Test1 {

  18.         public static void main(String[] args) {

  19.                 Fu f = new Zi();
  20.                 f.show();
  21.         }
  22. }
复制代码


应该是这样,在初始化这块,可以给你看个东西,当时我可是弄了整整大半天,也没弄明白为什么,反正结论是记住了http://bbs.itheima.com/forum.php ... 4&page=1#pid1016458,终于把代码上传清楚了,差点没搞疯我,又疯了以为传好了一看又传错了。我可以说我没看懂你的题么,才明白你问的指向哪个对象是什么意思。就一个对象Zi,没其他对象啊。
作者: 354620815    时间: 2014-10-8 17:23
至始至终this都指向Zi类对象,因为new Zi();并没有new Fu()...不可能出现Fu类对象...
this指向调用它的对象,并不是在Fu类里定义了this,this就指Fu类的对象。
Zi有两个num一个是自己的,一个是Fu的,
如果在zi类空间使用num,就找自己的num,如果在父类空间使用num,就找fu的num
作者: 18643448863    时间: 2014-10-8 17:28
354620815 发表于 2014-10-8 17:23
至始至终this都指向Zi类对象,因为new Zi();并没有new Fu()...不可能出现Fu类对象...
this指向调用它的对象 ...

那你说fu中构造函数中的打印语句打印的是几? 要是你说的this一直是zi的话 打印的应该是0 吧   
作者: 18643448863    时间: 2014-10-8 17:31
354620815 发表于 2014-10-8 17:23
至始至终this都指向Zi类对象,因为new Zi();并没有new Fu()...不可能出现Fu类对象...
this指向调用它的对象 ...

哦我 看懂你说的话了,可能这块我也没明白 ,得想想。到低这个this是咋回事
作者: 18643448863    时间: 2014-10-8 17:33
354620815 发表于 2014-10-8 17:23
至始至终this都指向Zi类对象,因为new Zi();并没有new Fu()...不可能出现Fu类对象...
this指向调用它的对象 ...

是呀 这个this还是指向fu的啊,被你弄蒙圈了,呵呵,:dizzy:
作者: 354620815    时间: 2014-10-8 17:35
这种问题很无聊,不要太纠结,我是混经验的。。。
作者: 18643448863    时间: 2014-10-8 17:41
我可以说,今天所有回帖能得经验和黑马币都回在你这贴了么,怎么说呢,混经验是一部分,当你问的问题别人去解答,而没解答出来成为了别人的问题的时候,你如果知道 可以给下正解。我这人比较倔,有知识点要是弄不明白的话,绝对会想到地老天荒的。
作者: 354620815    时间: 2014-10-8 18:08
本帖最后由 354620815 于 2014-10-8 18:15 编辑
18643448863 发表于 2014-10-8 17:28
那你说fu中构造函数中的打印语句打印的是几? 要是你说的this一直是zi的话 打印的应该是0 吧    ...

{:3_47:}{:3_47:}{:3_47:}
作者: 354620815    时间: 2014-10-8 18:22
18643448863 发表于 2014-10-8 17:33
是呀 这个this还是指向fu的啊,被你弄蒙圈了,呵呵,
  1. Zi(){
  2.                 System.out.println(this);
  3.         }
复制代码
  1. Fu(){               
  2.                 System.out.println(this);
  3.         }
复制代码


都是子对象,没必要骗你
作者: mingtianrsm    时间: 2014-10-8 18:29
不可能,应该是5 3吧,或者你的代码弄错了
作者: mingtianrsm    时间: 2014-10-8 18:31
说错了,没看清代码~
作者: 18643448863    时间: 2014-10-8 18:52
354620815 发表于 2014-10-8 18:22
都是子对象,没必要骗你

你只要回答我 fu构造函数中的 那个 this.num的意思就好了,你告诉我,我就懂了。
作者: 唐王潮    时间: 2014-10-8 19:52
18643448863 发表于 2014-10-8 17:41
我可以说,今天所有回帖能得经验和黑马币都回在你这贴了么,怎么说呢,混经验是一部分,当你问的问题别人去 ...

赞一个,跟我一样,学过的东西没弄明白会让我很难受。我看到IO流遇到问题来论坛提问,顺带看到楼主提的问题,发现自己也是稍微有点蒙圈,然后就放下我自己的那个问题,去研究了1个多小时的楼主问题。也算弄明白了,算是巩固基础知识了。
作者: kakasa    时间: 2014-10-8 19:52
想了半天,还是不懂,求解释。
作者: 唐王潮    时间: 2014-10-8 19:55
18643448863 发表于 2014-10-8 18:52
你只要回答我 fu构造函数中的 那个 this.num的意思就好了,你告诉我,我就懂了。 ...

你复制我的代码 打印一遍你就懂了,在这里父类构造函数中的this调用了子类show方法
作者: 郭.威    时间: 2014-10-9 00:14
,,,,,,,,,
作者: 18643448863    时间: 2014-10-9 06:44
唐王潮 发表于 2014-10-8 19:55
你复制我的代码 打印一遍你就懂了,在这里父类构造函数中的this调用了子类show方法 ...

你说的我懂,我只是想问问楼主的想法,我发现我俩好像没在一个频道上。




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