zoukankan      html  css  js  c++  java
  • 多态

    多态

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

    • 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();
            }
        }
    }
    
    
  • 相关阅读:
    curl上传图片文件
    手工制作简单后台模板
    首页自动生成静态化html
    svn-多个项目版本库和自动同步更新post-commit
    Snoopy+phpquery采集demo
    phpstorm使用手册
    mac系统使用帮助
    upupw一键绿色免安装环境包
    去掉文件夹的.svn文件
    centos安装svn服务器
  • 原文地址:https://www.cnblogs.com/geqianLee/p/13152850.html
Copyright © 2011-2022 走看看