zoukankan      html  css  js  c++  java
  • java 多态一

    一 多态的概述

      现实事物经常会体现出多种形态,如学生,学生是人的一种,则一个具体的同学张三既是学

    生也是人,即出现两种形态。

      Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类

    ,一个Student的对象便既是Student,又是Person。

      Java中多态的代码体现在一个子类对象(实现类对象)既可以给这个子类(实现类对象)引用变量

    赋值,又可以给这个子类(实现类对象)的父类(接口)变量赋值。

      如Student类可以为Person类的子类。那么一个Student对象既可以赋值给一个Student类型的引

    用,也可以赋值给一个Person类型的引用。

      最终多态体现为父类引用变量可以指向子类对象。

      多态的前提是必须有子父类关系或者类实现接口关系,否则无法完成多态。

      在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法。

    二 多态的定义与使用格式

    定义格式:

    父类类型  变量名 = new 子类类型();

      变量名.方法名();

     

    普通类多态定义的格式: 

      父类 变量名 = new 子类();

    例如:

     

    class Fu {}
        class Zi extends Fu {}
        //类的多态使用
    Fu f = new Zi();

     

    抽象类多态定义格式:

      抽象类 变量名 = new 抽象类子类();

    例如:

     

    abstract class Fu {
             public abstract void method();
             }
    class Zi extends Fu {
    public void method(){
                  System.out.println(“重写父类抽象方法”);
    }
    }
    //类的多态使用
    Fu fu= new Zi();

     

    接口多态的定义格式:

      接口 变量名 = new 接口实现类();

    例如:

     

    interface Fu {
                 public abstract void method();
    }
    class Zi implements Fu {
                 public void method(){
                  System.out.println(“重写接口抽象方法”);
    }
    }
    //接口的多态使用
    Fu fu = new Zi();

     

    注意事项

      同一个父类的方法会被不同的子类重写。在调用方法时,调用的为各个子类重写后的方法。

    例如:

    Person p1 = new Student();
       Person p2 = new Teacher();
       p1.work(); //p1会调用Student类中重写的work方法
       p2.work(); //p2会调用Teacher类中重写的work方法

      当变量名指向不同的子类对象时,由于每个子类重写父类方法的内容不同,所以会调用不同的方法。

    三 多态成员的特点

      多态出现后会导致子父类中的成员变量有微弱的变化。

    例如:

    class Fu {
        int num = 4;
    }
    class Zi extends Fu {
        int num = 5;
    }
    class Demo {
        public static void main(String[] args)     {
            Fu f = new Zi();
            System.out.println(f.num);
            Zi z = new Zi();
            System.out.println(z.num);
        }
    }

    多态成员变量

      当子父类中出现同名的成员变量时,多态调用该变量时:

      编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。

      运行时期:也是调用引用型变量所属的类中的成员变量。

      简单记:编译和运行都参考等号的左边。编译运行看左边。

    多态出现后会导致子父类中的成员方法有微弱的变化。

    class Fu {
        int num = 4;
        void show()    {
            System.out.println("Fu show num");
        }
    }
    class Zi extends Fu {
        int num = 5;
        void show()    {
            System.out.println("Zi show num");
        }
    }
    class Demo {
        public static void main(String[] args)     {
            Fu f = new Zi();
            f.show();
        }
    }

    多态成员方法

      编译时期:参考引用变量所属的类,如果类中没有调用的方法,编译失败。

      运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员方法。

      简而言之:编译看左边,运行看右边。

    四 instanceof关键字

      我们可以通过instanceof关键字来判断某个对象是否属于某种数据类型。如学生的对象属

    于学生类,学生的对象也属于人类。

    使用格式:

      boolean  b  = 对象  instanceof  数据类型;

    例如:

     

    Person p1 = new Student(); // 前提条件,学生类已经继承了人类
    boolean flag = p1 instanceof Student; //flag结果为true
    boolean flag2 = p1 instanceof Teacher; //flag结果为false

     

     

     

     

     

     

  • 相关阅读:
    Spring Aop表达式以及EL表达式处理
    Java 设计模式-观察者(Observer )
    Java 设计模式-命令模式(Command Pattern)
    Java 设计模式-策略模式(Strategy Pattern)
    隐式使用This 引用逸出
    Java 设计模式-代理模式(Proxy Pattern)
    Java 设计模式-装饰器模式(Decorator)
    单例设计模式
    抽象工厂
    XML
  • 原文地址:https://www.cnblogs.com/jiejava/p/13256163.html
Copyright © 2011-2022 走看看