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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李晓旭 中级黑马   /  2012-3-19 15:20  /  2113 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. import java.util.*;


  2. class GenericDemo6
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 ArrayList<Person> al = new ArrayList<Person>();
  7.                 al.add(new Person("abc1"));
  8.                 al.add(new Person("abc2"));
  9.                 al.add(new Person("abc3"));

  10.                 printColl(al);

  11.                 ArrayList<Student> al1 = new ArrayList<Student>();
  12.                 al1.add(new Student("bc1"));
  13.                 al1.add(new Student("bc2"));
  14.                 al1.add(new Student("bc3"));

  15.                 printColl(al1);


  16.         }

  17.         public static void printColl(ArrayList<? extends Person> al)
  18.         {
  19.                 for(Iterator<? extends Person> it = al.iterator();it.hasNext();)
  20.                 {
  21.                         sop(it.next().getName());
  22.                 }
  23.         }

  24.        
  25.         public static void sop(Object obj)
  26.         {
  27.                 System.out.println(obj);
  28.         }
  29. }

  30. class Person
  31. {
  32.         private String name;
  33.         Person(String name)
  34.         {
  35.                 this.name = name;
  36.         }
  37.         public String getName()
  38.         {
  39.                 return name;
  40.         }

  41. }
  42. class Student extends Person
  43. {
  44.         private String name;
  45.         Student(String name)
  46.         {
  47.                 super(name);
  48.         }
  49.         public String getName() // 这个地方虽然和父类完全一样,应该也算是覆盖吧?
  50.         {
  51.                 return name;
  52.         }
  53. }
复制代码
程序执行结果为:
abc1
abc2
abc3
null
null
null

如果注释掉Student类中的getName()方法
结果正常
abc1
abc2
abc3
bc1
bc2
bc3

为什么呢

5 个回复

倒序浏览
问题出在Student的构造方法上,调用了Person的构造方法把name付给了Person中的name,Person中name是私有的,Student并没有继承,因此Student中的name是null
回复 使用道具 举报
还不是很明白

是因为子类的同名私有变量不能覆盖父类Person中的私有name,
所以super(name);是在父类中给父类的name赋值

但是super(name);
不等于 this.name = name  吗?
回复 使用道具 举报
同意楼上,子类若覆盖父类的getName();返回的是子类的属性值,若不覆盖,则返回父类的私有属性;因构造方法调用父类,所以子类的属性值为null;
回复 使用道具 举报
name这个属性在Person中已经定义过了,所以你在子类Student中就不需要定义了,你要是定义了,就如楼上所说的父类中的name并没有赋值给子类中定义的name.
正确代码如下
import java.util.*;


public class GenericDemo6
{
        public static void main(String[] args)
        {
                ArrayList<Person> al = new ArrayList<Person>();
                al.add(new Person("abc1"));
                al.add(new Person("abc2"));
                al.add(new Person("abc3"));

                printColl(al);

                ArrayList<Student> al1 = new ArrayList<Student>();
                al1.add(new Student("bc1"));
                al1.add(new Student("bc2"));
                al1.add(new Student("bc3"));
         
                printColl(al1);


        }

        public static void printColl(ArrayList<? extends Person> al)
        {
                for(Iterator<? extends Person> it = al.iterator();it.hasNext();)
                {
                        sop(it.next().getName());
                }
        }

        
        public static void sop(Object obj)
        {
                System.out.println(obj);
        }
}

class Person
{
        private String name;
       public Person(String name)
        {
                this.name = name;
        }
        public String getName()
        {
                return name;
        }

}
class Student extends Person
{       



//private String name;
      
                public Student(String name) {
                        super(name);
                }
        
        public String getName() // 这个地方虽然和父类完全一样,应该也算是覆盖吧?
        {
                return super.getName();
        }
}
回复 使用道具 举报
但是如果这样的话,我觉得通常都是写:
class Student extends Person
{        
                  public Student(String name)
                  {
                         super(name);
                 }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马