1.向上转型
定义:将子类的对象赋值给父类的引用。用法如下:
Student s = new Student();
Person p = s;
或者:
Person p = new Student();
因为在继承树的画法中,父类是放置在上方的。
先看下面程序:
class Person {
String name;
int age;
void introduce(){
System.out.println("我的姓名是:" + name+",我的年龄是"+ age);
}
}
class Student extends Person {
String address;
void study(){
System.out.println("我正在学习");
}
void introduce(){
super.introduce();
System.out.println("我的家在"+ address);
}
}
class Test{
public static void main(String args[]){
Person p = new Student();
p.name = "张三";
p.age = 20;
p.address = "北京";
p.introduce();
}
}
输出结果:
error:找不到符号
符号 :变量address
位置 :类型为Person的变量p
p.address = "北京";
错误的原因是因为:
- 一个引用能够调用哪些成员(变量和方法),取决于这个引用的类型
在这个例子中,引用p能够调用哪些成员取决于Person里面的成员。Person类的成员变量只有name和age,因此调用不存在于Person类的成员变量就会出错。
class Test{
public static void main(String args[]){
Person p = new Student();
p.name = "张三";
p.age = 20;
//p.address = "北京";
p.introduce();
}
}
编译运行
输出结果:
我的姓名是:张三,我的年龄是20
我的家在null
从结果来看,我们发现p调用的introduce()方法是子类的introduce()方法。原因是:
- 一个引用调用的是哪一个方法,取决于这个引用所指向的对象。
在向上转型中,当把一个子类对象直接赋值给一个父类的引用时,例如上面的Person p = new Student(); 这个p引用变量的编译时类型是Person,而运行时类型是Student,当运行时调用该引用变量的方法时,其方法行为总是表现出子类方法的行为特征,而不是父类方法的行为特征,这就可能出现:相同类型的变量、调用同一个方法时呈现出不同的行为特征,这就是多态。
关于多态,以后会有更详细的介绍。
2.向下转型
定义:将父类的对象赋值给子类的引用。用法如下:
Student s1 = new Student();
Person p = s1;
Student s2 = (Student)p;
或者
Person p = new Student();
Student s = (Student)p;