黑马程序员技术交流社区
标题:
关于继承父类时覆盖函数出错的问题
[打印本页]
作者:
李晓旭
时间:
2012-3-19 15:20
标题:
关于继承父类时覆盖函数出错的问题
import java.util.*;
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;
Person(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
class Student extends Person
{
private String name;
Student(String name)
{
super(name);
}
public String getName() // 这个地方虽然和父类完全一样,应该也算是覆盖吧?
{
return name;
}
}
复制代码
程序执行结果为:
abc1
abc2
abc3
null
null
null
如果注释掉Student类中的getName()方法
结果正常
abc1
abc2
abc3
bc1
bc2
bc3
为什么呢
作者:
段浩亮
时间:
2012-3-19 15:32
问题出在Student的构造方法上,调用了Person的构造方法把name付给了Person中的name,Person中name是私有的,Student并没有继承,因此Student中的name是null
作者:
李晓旭
时间:
2012-3-19 16:21
还不是很明白
是因为子类的同名私有变量不能覆盖父类Person中的私有name,
所以super(name);是在父类中给父类的name赋值
但是super(name);
不等于 this.name = name 吗?
作者:
周建
时间:
2012-3-19 16:42
同意楼上,子类若覆盖父类的getName();返回的是子类的属性值,若不覆盖,则返回父类的私有属性;因构造方法调用父类,所以子类的属性值为null;
作者:
李爱军
时间:
2012-3-19 17:04
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();
}
}
作者:
李晓旭
时间:
2012-3-19 17:48
但是如果这样的话,我觉得通常都是写:
class Student extends Person
{
public Student(String name)
{
super(name);
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2