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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© tcny 中级黑马   /  2014-3-25 00:08  /  1454 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Test extends Super{
  2.         public Test(String a){
  3.                 System.out.println("C");
  4.                 i = 5;
  5.         }
  6.         public static void main(String[] args) {

  7.                 int i = 4;
  8.                 Super t = new Test("A");
  9.                 System.out.println(t.i);//为什么是5呢?父类的引用不是应该调用父类的成员变量吗
  10.         }

  11. }
复制代码

public class Super {
        int i = 0;
        public Super(String a){
                System.out.println("A");
                i = 1;
        }
        public Super(){
                System.out.println("B");
                i += 2;
        }

}
问题见注释。

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

6 个回复

倒序浏览
子类继承了父类的属性变量I,第一次父类构造变成了2,经过第二次子类构造变成了5,从头到尾都访问的是同一个I,不分父类和子类成员。将
public Test(String a){
                System.out.println("C");
                i = 5;
        }
改成
public Test(String a){
                System.out.println("C");
               int  i = 5;
        }
那么结果将输出2

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
首先确定这句打印 System.out.println(t.i);的一定是Super类中的i,
1,当代码执行到这一句的时候Super t = new Test("A");先执行父类无参构造函数
public Super(){
                      System.out.println("B");
                i += 2;
        }
2,执行后i==1 然后再执行子类构造函数
1.        public Test(String a){
2.                        System.out.println("C");
3.                        i = 5;
4.                }
执行后 i  == 5 ;

System.out.println(t.i);所以最后打印结果是 5

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
父类的引用是指向子类的对象,父类中没有i这个变量,就会调用子类的,
回复 使用道具 举报
其实你可以把你的程序给做一下拆分你就会看的很清楚了,首先你在主函数中定义的 i 只是一个局部变量,不是类的成员变量,所以不算是你定义的子类中的你想要的那个变量 i ,下面的程序是我给你拆分的,你可以看一下拆分后的子类中并没有定义子类的成员变量 i ,也就是说子类中的函数中的 i 是继承了父类的。是父类中的成员变量 i ,

捕获.JPG (90.48 KB, 下载次数: 23)

捕获.JPG

评分

参与人数 1技术分 +1 收起 理由
朱神必 + 1

查看全部评分

回复 使用道具 举报
    Super t = new Test("A"); 虽然是父类引用,但是是指向子类的,所以调用的还是子类的方法和属性
回复 使用道具 举报
   Super t = new Test("A"); // t变量指向的是一个Test对象。Test 继承Super的i变量(访问权限是default“同包子类时可以继承",“不同包时不可以”这里同包所以可以继承i)   Test对象生成时,先执行了Super方法后i变2,后再执行自已的构造方法i变成5。
   System.out.println(t.i);
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马