1概念
多态: 一种事物,具有多种表现形态。
多态的体现: 重写, 父类的引用指向子类的对象。 称为向上转型(自动转换)
基本类型之间的转换
- 自动
- 强制
引用类型之间的转换
2引用类型之间的转换
自动(向上转型)
将子类对象转换为父类 Student ----- Person
将父类的引用指向子类的对象
特性:
-
通过父类保存 的变量 调用的是 子类 重写后的方法,不是父类的方法
-
通过父类保存的变量 无法调用子类特有的属性和方法
-
强制(向下转型)
将父类转为子类, 进行强制转换
语法: (子类类型)父类对象
特性:- 向下转型后,可以访问子类特有的属性和方法
- 转换时,父类必须为真实的子类类型,否则会出现转换异常 ClassCastException(类型转换异常)
- 向下转型是不安全的。 可以在转换时 使用 instanceof 关键字去判断当前对象的类型,避免出现转换异常
package javaSE08_面向对象的特征;
public class Test07_多态 {
public static void main(String[] args) {
/**
* 向上 自动
* 子类 类型 转为 父类类型
*/
// Person p = new Person();
// Teacher t = new Teacher();
// 父类的引用指向子类的对象
Person p1 = new Teacher();//自动转换
Person p2 = new Doctor();
p1.name ="张三";
p1.show();// 子类重写后的方法
// p1.school = ""; 不能访问子类特有的属性
// p1.teach(); 不能调用子类特有的方法
// p2.operate();
System.out.println("-------------------");
/**
* 向下 强制
* 父类类型转为 子类类型
*/
Teacher t = (Teacher)p1;
t.school="网博";
t.show();
t.teach();// 可以调用子类特有的方法
/**
* ClassCastException 类型转换异常
*/
/*Person p = new Person();
Doctor d = (Doctor) p;*/
// Teacher t2 = (Teacher)p2;
//在强制转换时 需要对类型进行判断 instanceof 判断 是否属于某个类型
if(p2 instanceof Teacher){
Teacher t2 = (Teacher)p2;
}else if(p2 instanceof Doctor){
Doctor d = (Doctor)p2;
d.operate();
}
}
}
//父类 人类
class Person{
String name;
public void show(){
System.out.println("我是一个人");
}
}
//子类 教员类
class Teacher extends Person{
String school;//子类特有的属性
@Override
public void show() {
System.out.println("我叫"+name+"我是一名教员");
}
public void teach(){
System.out.println("我在"+school+"教学");
}
}
// 子类 医生类
class Doctor extends Person{
public void operate(){
System.out.println("我在做手术");
}
}