标题: 多态中的引用对象问题 [打印本页] 作者: 凡延海 时间: 2012-5-21 10:39 标题: 多态中的引用对象问题 public class Test
{
public static void main(String[] args)
{
Person person=new Student();
person.age=20;
person.name="Tom";
person.say();
System.out.println(person.country);
}
}
class Person
{
int age;
String name;
String country="China";
public void say()
{
System.out.println("Perosn"+" age:"+age+",name:"+name+" come from:"+country);
}
}
class Student extends Person
{
int scores;
String country="English";
public void say()
{
System.out.println("Student"+" age:"+age+",name:"+name+" come from:"+country);
}
}
打印出的结果是Student age: 20 name:Tom come from English
China
我知道把子类的实例对象给父类引用变量,调用方法的话用的是子类的方法,调用成员变量的画用的是父类的方法,打印出的Student那一行打印的应该是China才对。作者: 李哲 时间: 2012-5-21 11:13
可是 person.say();是成员方法,编译看父类,运行看子类。既然是运行子类的 person.say();,这个方法中是country,隐含就是this.country,所以打印English。
System.out.println(person.country);就没什么说的。就像你说的成员变量用父类。 作者: 黑马-唐磊 时间: 2012-5-21 11:25
你那个主函数中的Person person=new Student();
子类型被提升到了父类型,父类引用指向子类对象,所以对于成员函数
编译时期:查看的引用型变量所属的类中中是否有被调用的方法
运行时期:查看所属的类中是否又该方法
造成这种现象原因是:函数在字符类中的一个特性:覆盖
也就是成员函数,编译看等号左边,运行看等号右边,这个结论很重要,所以你那个就看的是new student的方法所以结果是student中的变量English而不是China下面有一个例子可以运行下
class Fu
{
int num = 4;
public void method()
{
System.out.println("fu method ");
}
/**/
public static void show()
{
System.out.println("fu static show");
}
}
class Zi extends Fu
{
int num = 5;
public void method()
{
System.out.println("zi method");
}
public static void show()
{
System.out.println("zi static show");
}
}
class DuoTaiDemo6
{
public static void main(String[] args)
{