一、向上转型
父类子类对象之间的转换分为向上转型和向下转型
向上转型:通过子类对象(小范围)实例化父类对象(大范围),这种属于自动转换。(将一个子类类型的对象赋值给一个父类类型的变量)
语法:父类类型 变量 = new 子类类型();
package com.CoderLB;
/**
* 定义一个抽象类
*/
public abstract class Person {
//定义一个普通方法
public void getInfo(){
System.out.println("这是一个普通的成员方法");
}
//定义抽象方法
public abstract void say();
}
package com.CoderLB;
import java.io.Serializable;
import java.sql.SQLOutput;
public class Student extends Person {
@Override
public void say() {
System.out.println("我是一个学生");
}
//新扩充的方法
public void readbook(){
System.out.println("正在读书");
}
}
package com.CoderLB;
import java.io.Serializable;
public class Worker extends Person {
public void removeBrik(){
System.out.println("我正在搬砖");
}
@Override
public void say() {
System.out.print("我是一个工人");
}
}
package com.CoderLB;
import java.util.Scanner;
public class Hi {
public static void main(String[] args) {
Person per = new Student();//向上转型
Person per1=new Worker();
Student s=(Student) per;//向下转型
s.readbook();
//((Student) per).readbook();
per.say();
per1.say();
}
}
//输出
正在读书
我是一个学生
我是一个工人
使用父类类型的变量调用子类覆写父类的方法。具体调用哪个子类覆写的方法,是在运行期间具体复试的子类来确定的。
二、向下转型
不能使用父类类型的变量调用子类新扩充的方法,要使用向下转型,将一个父类类型的变量强制转换为子类类型。
语法:子类类型 变量名=(子类类型)父类类型变量
package com.CoderLB;
import java.util.Scanner;
public class Hi {
public static void main(String[] args) {
//Person per = new Student();//向上转型
Person per = new Worker();
//向下转型
if (per instanceof Student) {
Student s=(Student) per;
s.readbook();
}else if(per instanceof Worker){
Worker w=(Worker) per;
w.banzhuan();
}
}
}
实现向下转型必须先向上转型
向下转型存在类型转换异常的风险ClassCastException。虽然可以使用instanceof关键字来防止异常的出现,但一般不向下转型。