多态

多态

  • 面向对象三大特性:封装性,继承性,多态性

  • extends继承或者implements实现是多态的前提

  • 一个对象拥有多种形态,即对象的多态性

多态的格式

  • 类的多态其实就是指父类引用指向子类对象(子类对象被当作父类)

    父类名称 对象名 = new 子类名称();

    对于接口也可写作:接口名称 对象名 = new 实现类名称();

    package property;
    
    public class Item {
        String name;
        int price;
    
        public void buy(int price){
            System.out.println("使用" + price + "钱购买");
        }
    
        public void method(String name){
            System.out.println("父类方法,使用可以有效");
        }
    }
    ////////////////////////////////
    
    package property;
    
    public class LifePotion extends Item {
        @Override
        public void method(String name) {
            System.out.println(name + "可以回血");
        }
        
        public void LiMethod(){
            System.out.println("血瓶特有方法");
        }
    }
    
    /////////////////////////////////
    
    package property;
    
    public class MagicPotion extends Item{
        @Override
        public void method(String name) {
            super.method(name);
        }
    }
    
    ///////////////////////////////
    
    package property;
    
    public class ItemMutil {
    
        public static void main(String[] args) {
            Item xueping = new LifePotion();
            Item lanping = new MagicPotion();
    
            xueping.method("血瓶");//调用子类方法
            xueping.buy(30);//子类未覆盖重写时调用父类方法
            lanping.method("蓝瓶");
        }
    }
    
    

多态中成员变量和成员方法

  • 通过对象名访问成员变量,等号左边是谁优先用谁,没有则向上找

  • 通过成员方法访问成员变量,该方法属于谁优先用谁,没有则向上找

  • 成员方法访问规则为,new的是谁优先用谁,没有则向上找

    成员变量:编译看左边,运行看左边

    成员方法:编译看左边,运行看右边

对象的转型

  • 向上转型(多态写法):

    • 父类名称 对象名 = new 子类名称();
  • 右侧创建一个子类对象,把它当作父类看待使用

    • 向上转型一定是安全的,因为是小范围转向了大范围
  • 一旦向上转型为父类,那么无法调用子类特有方法(未覆盖重写父类的方法),因为编译不通过

  • 向下转型(还原):

    • 子类名称 对象名 = (子类名称)父类对象;

    • 将父类对象还原成原本子类对象

    • 向下转型必须保证,对象转换为的是原本的子类对象

  package property;
  
  public class ItemMutil {
  
      public static void main(String[] args) {
          Item xueping = new LifePotion();//多态,也是向上转型
          Item lanping = new MagicPotion();
  
          //向下转型
          LifePotion one = (LifePotion)xueping;
          one.LiMethod();//向下转型后可以调用子类方法
  
          //向上转型后向下转型还原对象
          //编译不会报错但是运行会报错,java.lang.ClassCastException
          //MagicPotion two = (MagicPotion)xueping;
      }
  }
  • instanceof关键字:

    • 对象 instanceof 类名称

    • 判断对象能不能当作后面类型的实例,将会得到一个boolean结果

package property;

public class ItemMutil {

    public static void main(String[] args) {
        Item xueping = new LifePotion();//多态,也是向上转型
        Item lanping = new MagicPotion();

        xueping.method("血瓶");//调用子类方法
        xueping.buy(30);//子类未覆盖重写时调用父类方法
        lanping.method("蓝瓶");

        useItem(xueping);//可以通过instanceof的方法随时向下转型
        useItem(lanping);
    }

    public static void useItem(Item Item){
        if(Item instanceof LifePotion){
            LifePotion one = (LifePotion)Item;
            one.LiMethod();
        }
        if(Item instanceof MagicPotion){
            MagicPotion two = (MagicPotion)Item;
            two.MagiMethod();
        }
    }
}

posted @ 2020-06-17 15:53  搁浅Lee  阅读(182)  评论(0编辑  收藏  举报