黑马程序员技术交流社区

标题: 多态 [打印本页]

作者: tcny    时间: 2014-3-25 00:08
标题: 多态
  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;
        }

}
问题见注释。
作者: lwy0319    时间: 2014-3-25 01:02
子类继承了父类的属性变量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
作者: luoyilan222    时间: 2014-3-25 09:36
首先确定这句打印 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

作者: 630681386@qq.co    时间: 2014-3-25 09:44
父类的引用是指向子类的对象,父类中没有i这个变量,就会调用子类的,

作者: 梦幻    时间: 2014-3-25 15:15
其实你可以把你的程序给做一下拆分你就会看的很清楚了,首先你在主函数中定义的 i 只是一个局部变量,不是类的成员变量,所以不算是你定义的子类中的你想要的那个变量 i ,下面的程序是我给你拆分的,你可以看一下拆分后的子类中并没有定义子类的成员变量 i ,也就是说子类中的函数中的 i 是继承了父类的。是父类中的成员变量 i ,

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

捕获.JPG

作者: H-Deka    时间: 2014-3-26 16:49
    Super t = new Test("A"); 虽然是父类引用,但是是指向子类的,所以调用的还是子类的方法和属性
作者: 清风木扬    时间: 2014-3-27 18:03
   Super t = new Test("A"); // t变量指向的是一个Test对象。Test 继承Super的i变量(访问权限是default“同包子类时可以继承",“不同包时不可以”这里同包所以可以继承i)   Test对象生成时,先执行了Super方法后i变2,后再执行自已的构造方法i变成5。
   System.out.println(t.i);




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