【1】一个父类的引用类型变量可以指向其子类的对象; 【2】一个父类的引用不能访问其子类扩展的属性和方法; 【3】必须强制类型转换才可以访问。 public class ObjectChangeTest { /** * function:test ObjectChange */ public static void main(String[] args) { // TODO Auto-generated method stub Person p=new Person("超人",100); Student st=new Student("小明",22,1001); Teacher tc=new Teacher("园丁",45,4600); //测试1:instanceof 来判断对象是否属于指定的类 System.out.println(p instanceof Person); //true System.out.println(st instanceof Student); //true System.out.println(tc instanceof Teacher); //true //测试2:父类引用指向子类对象 /** *【1】 在这里Person父类p引用指向子类Student对象 *【2】p引用能访问子类的name和age属性,即从Person类继承来的 *【3】但p引用不能访问子类Student扩展的属性no,要想访问,强制类型转换 */ p=new Student("yy",22,100); System.out.println("p.name="+p.name); //p.name=yy System.out.println("p.age="+p.age); //p.age=22 //p引用为了访问子类的扩展属性,强制类型转换 Student std=(Student)p; System.out.println("std.no="+std.no); //std.no=100 Person ps=new Teacher("ss",56,2345); System.out.println("ps.name="+ps.name); //ps.name=ss System.out.println("ps.age="+ps.age); //ps.age=56 Teacher tch=(Teacher)ps; System.out.println("tch.salary="+tch.salary); //tch.salary=2345.0 //测试方法 ObjectChangeTest test=new ObjectChangeTest(); Person pp=new Person("人人",100); test.showInfo(pp); //name=人人,age=100 System.out.println(); test.showInfo(st); //name=小明,age=22,no=1001 test.showInfo(tc); //name=园丁,age=45,salary=4600.0 } //定义一个方法 public void showInfo(Person p){ //打印出对应的name和age System.out.print("name="+p.name+",age="+p.age); if(p instanceof Student){ Student s=(Student)p; System.out.println(",no="+s.no); }else if(p instanceof Teacher){ Teacher t=(Teacher)p; System.out.println(",salary="+t.salary); } } } //定义一个Person类 class Person { public String name; public int age; Person(String name,int age){ this.name=name; this.age=age; } } //定义一个学生类 class Student extends Person { public int no; Student(String name,int age,int no){ super(name,age); this.no=no; } } //定义一个教师类 class Teacher extends Person { public double salary; Teacher(String name,int age,double salary){ super(name,age); this.salary=salary; } }