zoukankan      html  css  js  c++  java
  • java学习笔记 --- 多态

    一、多态

     (1)定义:同一个对象在不同时刻体现出来的不同状态。父类的引用或者接口的引用指向了自己的子类对象。   

          Dog d = new Dog();//Dog对象的类型是Dog类型。

              Animal a = new Dog();//Dog对象的类型右边是Dog类型,左边Animal类型。

     (2)多态的前提:
            A:有继承或者实现关系。
            B:有方法重写。
            C:有父类或者父接口引用指向子类对象。
      
          多态的分类:
             a:具体类多态
                class Fu {}
                class Zi extends Fu {}
        
                Fu f = new Zi();
             b:抽象类多态
                abstract class Fu {}
                class Zi extends Fu {}
        
                Fu f = new Zi();
             c:接口多态
                interface Fu {}
                class Zi implements Fu {}
        
                Fu f = new Zi();

      (3)多态的好处:
          A:提高代码的维护性(继承体现)
          B:提高代码的扩展性(多态体现)

      (4)多态的弊端

        通过父类引用操作子类对象时,只能使用父类中已有的方法,不能操作子类特有的方法。

        现象:
             子可以当作父使用,父不能当作子使用。

      (5)多态中的成员访问特点
          A:成员变量
             编译看左边,运行看左边
          B:构造方法
             子类的构造都会默认访问父类构造
          C:成员方法
             编译看左边,运行看右边
          D:静态方法
             编译看左边,运行看左边

    
    
    class Fu {
        public int num = 100;
    
        public void show() {
            System.out.println("show Fu");
        }
        
        public static void function() {
            System.out.println("function Fu");
        }
    }
    
    class Zi extends Fu {
        public int num = 1000;
        public int num2 = 200;
    
        public void show() {
            System.out.println("show Zi");
        }
        
        public void method() {
            System.out.println("method zi");
        }
        
        public static void function() {
            System.out.println("function Zi");
        }
    }
    
    class DuoTaiDemo {
        public static void main(String[] args) {
            //要有父类引用指向子类对象。(向上转型)
            //父 f =  new 子();
            Fu f = new Zi();
            //调用成员变量时,编译时看父类,父类有才能通过编译,运行时也看父类的,因为我们看到的是“父亲”
                
             System.out.println(f.num);
            
             //System.out.println(f.num2);编译错误,找不到符号(父亲没有这个变量)
            
             //调用成员方法时,编译时看父亲,只有父亲有,我们才能用,运行时看子类(右边),因为我们本质还是“孩子”,不是“父亲”
             f.show();
             //f.method();编译错误找不到符号(父亲没有这个方法)
         //调用静态方法时,编译看父类,运行也看父类,因为静态和类相关,算不上重写,所以,访问还是左边的
              f.function();
        }
    }
    
    

    (6)多态转型问题:
          向上转型:
             Fu f = new Zi();
          向下转型:
             Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。

  • 相关阅读:
    K8s网络插件flannel与calico
    calico部署与网卡绑定
    脚本基本函数
    k8s迁移工具-helm
    mysql不识别中文
    日志收集系统对比
    VM虚拟机安装后的网络设置
    微擎目录结构介绍
    amazeui笔记-web组件
    jQuery 数据
  • 原文地址:https://www.cnblogs.com/flei/p/6607732.html
Copyright © 2011-2022 走看看