引用数据类型转型分为两种,一种是向上转型,另一种是向下转型。
一、向上转型(父类引用执行子类对象)
例:
class Person{
public String name;
public int age;
}
class Student extends Person{
public String class;
}
class Text{
public static void main(String[] args){
Person s = new Student();//父类引用指向子类对象,s对象是Student类的实例,被Person类引用
}
}
注意:
- 这是多态的一种体现(多态:一种事物的多种表现形式)。
- 向上转型中的两个类必须是继承关系。
- 执行顺序:父类静态块–>子类静态块–>父类构造块–>父类构造器–>子类构造块–>子类构造器
- 若两个类中有相同的方法,那么程序执行时会调用子类中重写的方法,且对子类新增方法不可见
- 若两个类中有相同的变量,那么程序执行时会调用父类的变量。
例:
class Person{
public String name="教师";
public static void work(){
System.out.print("正在去授课!");
}
}
class Student extends Person{
public String name=“学生”;
public static void work(){
System.out.print("正在去学习!");
}
public static void eat(){
System.out.print("正在去食堂!");
}
}
class Text{
public static void main(String[] args){
Person s = new Student();//父类引用指向子类对象
System.out.print(s.name);//输出的是父类的变量 教师
System.out.print(s.work());//输出的是子类的方法 正在去学习!
System.out.print(s.eat());//程序报错 eat()是子类中新增的方法,父类对该方法不可见。
}
}
二、向下转型(父类转向子类,强制转换)
例:
class Person{
public String name;
public int age;
}
class Student extends Person{
public String class;
}
class Text{
public static void main(String[] args){
Student s2 = (Student)new Person();//向下转型
}
}
instanceof
若父类被不止一个子类继承,那么会在向下转型时会发生转型异常(ClassCastException),需要用 instanceof 判断一个类的对象是否为一个类的实例,如果是返回true,否则返回false。
引用数据类型 instanceof 类
例:
class Person{
public String name;
}
class Student extends Person{
public String class;
}
class Daughter extends Person{
public String class;
}
class Text{
public static void main(String[] args){
Person s1 = new Student();//向上转型
if(s instanceof Student)//判断s对象是否为Student类的实例,此处返回true
Student s2 = (Student)s;//向下转型,转型成功
else if(s instanceof Daughter)//判断s对象是否为Daughter类的实例,此处返回false
Daughter s3 = (Daughter)s;//向下转型,如果此句被执行,那么编译不会出错但是执行会发生转型异常
}
}