Java学习笔记(多态)

原创 2015年11月21日 11:12:02

12.多态

多态:事物存在的多种体现形态

例:动物中猫,狗。

  • 猫这个对象对应的类型是猫类型:猫 x=new 猫();
  • 同时猫也是动物中的一种,也可以把猫称为动物:动物 y=new 猫();

动物是猫和狗具体事物中抽取出来的父类型。
父类型引用指向了子类对象

体现:父类的引用指向了自己的子类对象;父类的引用也可以接受自己的子类对象。

作用:提高了程序的扩展性

应用前提:

  • 需要存在继承或实现关系;
    • 需要有重写操作。

例1

    public class MulitDemo {
        public static void main(String[] args){
            Animal c = new Cat();
            method(c);
            method(new Dog());
            method(new Pig());

        }
        public static void method(Animal a){
            a.eat();
        }

    }

    abstract class Animal{
        public abstract void eat();
    }

    class Cat extends Animal{
        public void eat(){
            System.out.println("吃鱼");
        }
        public void catchMouse(){
            System.out.println("抓老鼠");
        }
    }

    class Dog extends Animal{

        public void eat() {
            System.out.println("吃骨头");  
        }
        public void watchDoor(){
            System.out.println("看家");
        }
    }

    class Pig extends Animal{
        public void eat() {
            System.out.println("吃饲料");  
        }
        public void gongdi(){
            System.out.println("拱地");
        }
    }

运行结果:

例2

class MulitDemo2{
    public static void main(String[] args){
        Animal a = new Cat();//类型提升,向上转型
        a.eat();
        //如果想要调用猫的特有方法时,
        //强制将父类的引用转成子类类型,向下装换
        Cat c =(Cat)a;
        c.catchMouse();
        //不能出现将父类对象转成子类类型的操作;
        //多态始终都是子类对象在做变化
        //Animal a = new Animal();
        //Cat c = (Cat)a;

        //Animal a = new Dog();
        //Cat c = (Cat)a;//也不能随意转换,
                         //否则可能回报出ClasCastException的异常      
    }   
    public static void method(Animal a){
        a.eat();
        if(a instanceof Cat){
            Cat c = (Cat) a;
            c.catchMouse();
        }
        else if(a instanceof Dog){
            Dog d = (Dog) a;
            d.watchDoor();
        }
    }
}

例3

public class MutilDemo3 {

    public static void main(String[] args) {
        DoSth ds = new DoSth();
        ds.doSomething(new BaseStudent());
    }
}

 class DoSth{
    public void doSomething(Student st){
        st.sleep();
        st.study();
    }
}

abstract class Student{
    public abstract void study();
    public void sleep(){
        System.out.println("躺着睡");
    }
}

class BaseStudent extends Student{
    public void study(){
        System.out.println("base study");
    }
    public void sleep(){
        System.out.println("坐着睡");
    }
}

class AdvStudent extends Student{
    public void study(){
        System.out.println("avd sleep");
    }
}

运行结果:

12.1 在多态中成员函数(非静态)的特点:

  • 在编译时期,参考引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译失败;
  • 在运行时期,参考对象所属的类中是否有调用的方法;
  • 简单说,成员函数在多态调用时,编译看左边,运行看右边。

    class Fu1{
        void method1(){
            System.out.println("fu_method_1");
        }
        void method2(){
            System.out.println("fu_method_2");
        }
    }
    
    class Zi1 extends Fu1{
        void method1(){
            System.out.println("zi_method_1");
        }
        void method3(){
            System.out.println("zi method_3");
        }
    }
    
    public class MutilDemo3 {
        public static void main(String[] args){
            Fu1 f = new Zi1();
            f.method1();
            f.method2();
            //f.method3();
        }
    }
    

运行结果为:

12.2 在多态中成员变量的特点:

  • 编译时,参考引用型变量所属的类中是否有调用的成员变量,如果有则编译通过,没有则编译失败;
  • 运行时,参考引用型变量所属的类是否有调用的成员变量,并运行该所属类中的成员变量;
  • 无论编译和运行,都参考左边(引用类型变量所属的类);

12.3 在多态中静态成员、函数的特点:

  • 无论编译和运行,都参考左边(引用类型变量所属的类);

    class Fu1{
        int num = 5;
        void method1(){
            System.out.println("fu_method_1");
        }
        void method2(){
            System.out.println("fu_method_2");
        }
        static void method4(){
            System.out.println("fu_method_4");
        }
    }
    
    class Zi1 extends Fu1{
        int num = 6;
        void method1(){
            System.out.println("zi_method_1");
        }
        void method3(){
            System.out.println("zi method_3");
        }
        static void method4(){
            System.out.println("zi method_4");
        }
    }
    
    public class MutilDemo3 {
        public static void main(String[] args){
            Fu1 f= new Zi1();
            System.out.println(f.num);
            f.method4();
            Zi1 z= new Zi1();
            System.out.println(z.num);
            z.method4();
        }
    }
    

运行结果:

java多态之运行时多态和编译时多态

多态分为静态多分配、动态单分配 运行时多态即动态单分配:程序在运行时在类的方法元数据中搜索合适的方法再调用该方法.与重写有关 编译时多态即静态多分配:在编译阶段javac编译器会根据参数...
  • u013129944
  • u013129944
  • 2017年01月14日 20:43
  • 406

java回调函数 以及java多态

//程序1 public class Caller { public MyCallInterface mc; public void setCallfuc(MyCallInt...
  • past__time
  • past__time
  • 2017年06月02日 10:32
  • 161

JavaWeb接口的多态现实

JavaWeb接口的多态现实
  • zx520sun
  • zx520sun
  • 2016年11月04日 10:50
  • 391

Java的多态(静态绑定和动态绑定)

参考资料:http://blog.csdn.net/lingzhm/article/details/44116091java多态具体表现形式有两种:方法的重写和方法的重载。先来看一段程序(此段代码摘自...
  • zlp1992
  • zlp1992
  • 2016年09月16日 19:52
  • 1149

java中的对于多态的理解

面向对象:      类:具体的对象抽象而来,可以抽象的表示一类具有相同特征和行为的对象      对象:是由类的实例化而来,对象是类的一个实例 java中关于多态的理解 打个比方 父...
  • woshiermingerming
  • woshiermingerming
  • 2016年08月26日 08:29
  • 8219

Java基础之多态的详细解释

http://www.cnblogs.com/xdp-gacl/p/3644035.html 一、面向对象最核心的机制——动态绑定,也叫多态    1.1.通过下面的例子理解动态绑定,即...
  • arjelarxfc
  • arjelarxfc
  • 2016年10月26日 22:13
  • 881

java接口实现多态

多态: 父类的引用类型变量指向了子类的对象或者是接口类型的引用类型变量指向了接口实现类 的对象。 实现关系下的多态: 接口  变量  = new  接口实现类的对象。 i...
  • oguro
  • oguro
  • 2016年11月08日 20:00
  • 3871

java中什么是多态性?它具有什么优点

 Java是面向对象的语言,多态性是面向对象程序设计代码重用的一个最强大机制,动态性的概念也可以被说成“一个接口,多个方法”。Java实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是...
  • zyl9111012
  • zyl9111012
  • 2014年08月06日 10:57
  • 8110

Java-多态、方法重载

什么是多态、重载1. 多态对多态现象的理解多态是面向对象的一个重要特征。关于定义性的概念,相信网上有很多资料,不再多说。这里说说我自己的理解。多态是指在运行期间,调用某个类对象的方法会有不同的行为。举...
  • zjx409
  • zjx409
  • 2015年07月15日 15:45
  • 1700

java多态实现原理

众所周知,多态是面向对象编程语言的重要特性,它允许基类的指针或引用指向派生类的对象,而在具体访问时实现方法的动态绑定。C++ 和 Java 作为当前最为流行的两种面向对象编程语言,其内部对于多态的支持...
  • huangrunqing
  • huangrunqing
  • 2016年07月22日 16:46
  • 15305
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java学习笔记(多态)
举报原因:
原因补充:

(最多只允许输入30个字)