简单地说向上转型就是:将一个子类类型的对象赋值给一个父类类型的变量。【小范围转大范围】
向上转型基本的实现语法
父类类型 变量 = new 子类类型();
向上转型
public abstract class Person {
//定义一个抽象方法
public abstract void say();
}
public class Student extends Person {
@Override
public void say() {
System.out.println("我是一个学生!");
}
}
public class Hello {
public static void main(String[] args) {
Person per = new Student();
per.say();
}
}
输出我是一个学生!
【具体调用哪一个子类覆写的方法是在运行时期根据具体你赋值的子类来确定的】
可以使用父类类型的变量调用子类新扩充的方法吗?
public class Student extends Person {
@Override
public void say() {
System.out.println("我是一个学生!");
}
//子类扩充方法
public void readingBook(){
System.out.println("正在阅读!");
}
}
The method readingBook() is undefined for the type Person
发现不能使用父类类型的变量调用子类新扩充的方法,如果要实现调用可以使用向下转型。将一个父类类型的变量强制转换为子类类型。
向下转型基本语法
子类类型 变量名= (子类类型) 父类类型的变量
public class Hello {
public static void main(String[] args) {
//向上转型
Person per = new Student();
//向下转型
Student s =(Student)per;
s.readingBook();
}
}
输出我在阅读
但是向下转型会存在风险,存在类型转换异常的风险
总结
1.向上转型的概念:父类类型 变量 = new 子类类型();
2.使用父类类型的变量调用方法的时候具体调用哪一个子类的方法是在运行期间根据具体的子类对象类型确定的。
3.父类类型的变量不能调用子类新扩充的方法。
向下转型
简单来说向下转型就是:一个父类类型的变量强制转换为子类类型。
【大范围转小范围】
向下转型基本语法
子类类型 变量名= (子类类型)父类类型的变量
向下转型
发现了实现向下转型必须先向上转型,但是向下转型作用不大,只是作为知识点提出,向下转型还存在类型转换异常的风险。
向下转型用得不多,知道这个概念就行,但是你要记住这个异常(ClassCastException)。其实也可以在代码中防止这样的异常。
防止异常出现
if (per instanceof Student) {
Student s = (Student)per;
}else if (per instanceof Worker) {
Worker w = (Worker)per;
}
可以使用instanceof关键字防止类型转换异常的出现,但是没事干别向下转型。
总结:
1.向下转型存在风险:类型转换异常,所以尽量不要向下转型。
2.新关键词【instanceof】