polymorphism多态-java三大特性
/**
* 测试多态 polymorphism 方法的多态
*/
public class TestPolymorphism {
void eat(){
System.out.println("各国人的吃饭方式");
//父类的方法
}
}
class Chinese extends TestPolymorphism{
void eat(){
System.out.println("用筷子");
//子类重写
}
void drink(){
System.out.println("喝茶");
}
}
class American extends TestPolymorphism{
void eat(){
System.out.println("用叉子");
}
}
class TestPoly{
static void pe(TestPolymorphism p){
//静态方法属于类,在类内可直接调用,不依附于对象名.
p.eat();
}
public static void main(String[] args) {
pe(new TestPolymorphism());
//new一个父类对象,调用父类的eat
pe(new Chinese());
//new一个子类对象 (形参)p = new Chinese() 父类引用p 指向子类对象Chinese() 称为向上转型
//执行p.eat()时 p指向子类对象 变成子类对象.eat()
pe(new American());
//父类引用p(形参)指向父类或不同的子类 调用各自重写的方法 形成多态
TestPolymorphism p1 = new Chinese();
p1.eat();
//执行时p1指向子类对象 变成子类对象.eat()
//无法调用p1.drink(); 首先判定父类p1.drink() 父类没有drink方法 此时还没到p1指向子类对象的步骤
//TestPolymorphism p1为编译类型 new Chinese()为运行时类型
//父类引用变量p1只能调用编译类型TestPolymorphism的方法 不能调用运行时类型Chinese的方法
TestPolymorphism p2 = new Chinese();
//父类引用p2 指向子类对象 称为向上转型
Chinese c = (Chinese) p2;
//子类引用c 指向父类编译类型p2 称为向下转型 需要用(类名)强制转换
c.drink();
//p2.drink();依然报错
((Chinese)p2).drink();
//(Chinese)p2强制转换后可用drink()
//原对象仍然是Chinese类 p2仍然是TestPolymorphism类 c是Chinese类
if(p2 instanceof American){
//判断p2是否属于American类
American a2 = (American) p2;
//由于Chinese类不属于American类 虽然编译时可以强制转换 但运行时会报错
//添加if语句判断instanceof 为false即不执行
a2.eat();
}
}
}