欢迎光临散文网 会员登陆 & 注册

polymorphism多态-java三大特性

2022-06-21 11:11 作者:虚云幻仙  | 我要投稿

/**
* 测试多态 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();
       }
   }
}

polymorphism多态-java三大特性的评论 (共 条)

分享到微博请遵守国家法律