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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 谢振宣 中级黑马   /  2014-4-28 02:06  /  1046 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 谢振宣 于 2014-4-28 11:25 编辑

正在看基础视频,碰到一个小问题不太明白,哪位帮忙解决一下
毕老师的第10天的面向对象练习中的第6题
  1. class Super
  2. {
  3.         int i=0;
  4.         public Super(String a)
  5.         {
  6.                 System.out.println("A");
  7.                 i=1;
  8.         }
  9.         public Super()
  10.         {
  11.                 System.out.println("B");
  12.                 i+=2;
  13.         }
  14. }
  15. class Demo extends Super
  16. {        
  17.         
  18.         public Demo(String a)
  19.         {
  20.                 System.out.println("C");
  21.                 i=5;
  22.         }
  23.         public static void main(String[] args)
  24.         {
  25.                 int i=4;
  26.                 Super d=new Demo("A");
  27.                 System.out.println(d.i);
  28.         }
  29. }
复制代码
输出为:B C 5
把int i=4;定义为成员变量后,输出变了
  1. class Super
  2. {
  3.         int i=0;
  4.         public Super(String a)
  5.         {
  6.                 System.out.println("A");
  7.                 i=1;
  8.         }
  9.         public Super()
  10.         {
  11.                 System.out.println("B");
  12.                 i+=2;
  13.         }
  14. }
  15. class Demo extends Super
  16. {        
  17.         int i=4;//把int i=4;定义为成员变量后,输出变了
  18.         public Demo(String a)
  19.         {
  20.                 System.out.println("C");
  21.                 i=5;
  22.         }
  23.         public static void main(String[] args)
  24.         {
  25.                
  26.                 Super d=new Demo("A");
  27.                 System.out.println(d.i);
  28.         }
  29. }
复制代码
此时输出为:B C 2
多态中,对于成员变量无论编译还是运行都看左边。
第一次,在子类的构造函数中可以修改,已经赋值给子类对象的,父类的成员变量的值
第二次,在子类的构造函数中却不可以修改,已经赋值给子类对象的,父类的成员变量的值
谁能解释一下?





评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
第一次
  1. class Super
  2. {
  3.         int i=0;
  4.         public Super(String a)
  5.         {
  6.                 System.out.println("A");
  7.                 i=1;
  8.         }
  9.         public Super()
  10.         {
  11.                 System.out.println("B");
  12.                 i+=2;//[color=Red]三.将成员变量 i 赋值2,i=2[/color]
  13.         }
  14. }
  15. class Demo extends Super
  16. {        
  17.         [color=Red]//一.由于子类中没有定义变量 i ,所以建立子类对象直接继承父类的 i ,此时堆内存中只有一个 i =0[/color]
  18.         public Demo(String a)
  19.         {      //二.super()
  20.                 System.out.println("C");
  21.                 i=5;//[color=Red]四.将成员变量 i 赋值5,[/color]
  22.         }
  23.         public static void main(String[] args)
  24.         {      
  25.                 int i=4;[color=Red]//这个 i 不是成员变量,是局部变量 [/color]
  26.                 Super d=new Demo("A");
  27.                 System.out.println(d.i);[color=Red]//五.打印成员变量 i =5[/color]
  28.         }
  29. }
复制代码

第二次
  1. class Super
  2. {
  3.         int i=0;//[color=Red]三.在堆内存中定义另一个 i (父),此时对象中有两个 i [/color]
  4.         public Super(String a)
  5.         {
  6.                 System.out.println("A");
  7.                 i=1;
  8.         }
  9.         public Super()
  10.         {
  11.                 System.out.println("B");
  12.                 i+=2;//[color=Red]四.将i (父)赋值等于2[/color]
  13.         }
  14. }
  15. class Demo extends Super
  16. {        
  17.         int i=4;//[color=Red]一.此时子类在堆内存中定义了 i (子)[/color]
  18.         public Demo(String a)
  19.         {      //[color=Red]二.super(),然后赋值 i (子)=4[/color]
  20.                 System.out.println("C");
  21.                 i=5;//[color=Red]五. i (子)赋值为5[/color]
  22.         }
  23.         public static void main(String[] args)
  24.         {
  25.                
  26.                 Super d=new Demo("A");
  27.                 System.out.println(d.i);[color=Red]//六.由于是父类引用指向子类对象,d.i指向对象中两个 i 中的 i (父)=2[/color]
  28.         }
  29. }
复制代码

毕老师有一个视频上讲到了当父类中有变量 i 子类中没有再重新定义的话,新建子类对象时堆内存中只有一个这个变量 i ,所以无论this.i还是super.i都是指向这个 i

评分

参与人数 1技术分 +1 收起 理由
Silent_memory + 1 赞一个!

查看全部评分

回复 使用道具 举报 1 0
peku 发表于 2014-4-28 08:46
第一次

第二次

有些明白了,就是说子类的构造函数对成员变量的初始化,是有锁定性的。在多态中,如果只有父类有,就锁定为父类的成员变量;子父类中都有,就锁定为自己的成员变量,这时的两个同名变量同时存在。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马