java中的多态polymorphic

一.什么是多态?

1.多态的概念

多态是同一个行为具有多个不同表现形式或形态的能力。
父类的引用指向子类的对象,这就是多态。
格式: A ad=new B();

多态就是同一个接口,使用不同的实例而执行不同操作,举个例子,生活中的榨汁机,我们都是把水果放到榨汁机中去榨汁,但是你放进去什么水果,它就榨出来相对于的果汁,榨汁是一种行为,榨出来不同的的果汁就是不同的表现形式。
在这里插入图片描述
例:
在这里插入图片描述
父类:

public class A{

}

子类:

public class B extends A{

}

Test:

public class Test{
    public static  void main{
            A ad=new B();//多态
            }
}

2.通过数据的存储形式了解什么是多态

(1).基本数据类型中int、byte、float的内存存取形式

在这里插入图片描述

(2).A类既父类对象的内存结构图

在这里插入图片描述

(3).B类既子类对象的内存结构图

在这里插入图片描述

(4).子类即B类对象run()方法重写后的内存形式

在这里插入图片描述

(5).多态 A ad=new B(); ad的内存图

创建子类对象一定会创建父类对象,所以内存中会出现A和B的对象,但因为数据类型决定数据的存储形式,ab被A类型所锁定(决定),ab受制于数据类型A,所以只能调用A对象的数据。在这里插入图片描述
如果子类发生过重写(重写的方法覆盖之前的方法),此时该重写的方法是父类与子类共用的,所以也能调用。
在这里插入图片描述

2.多态用法

(1).向上转型

向上转型,子类的对象可以被父类的类型所接收,即父类的引用指向子类的对象
在这里插入图片描述

3.实例演示

A.java


public class A {
    public String show(D obj) {
        return ("A and D");
    }
    public String show(A obj) {
        return ("A and A");
    } 
}

B.java

public class B extends A{
    public String show(B obj){
        return ("B and B");
    }
    
    public String show(A obj){
        return ("B and A");
    } 
}

C.java


public class C extends B{
}

D.java


public class D extends B{
}

Test.java

public class Test {
    public static void main(String[] args) {
        A a1 = new A();
        A a2 = new B();
        B b = new B();
        C c = new C();
        D d = new D();
        
        System.out.println("1--" + a1.show(b));
        System.out.println("2--" + a1.show(c));
        System.out.println("3--" + a1.show(d));
        
        System.out.println("4--" + a2.show(b));
        System.out.println("5--" + a2.show(c));
        System.out.println("6--" + a2.show(d));
        
        System.out.println("7--" + b.show(b));
        System.out.println("8--" + b.show(c));
        System.out.println("9--" + b.show(d));      
}

输出结果:
在这里插入图片描述

第一个输出:
a1这个对象能调用到的方法有A里面show(D)和show(A); b是B类型的数据,而B是A的子类,所以B类型的数据可以向上转型到A,所以输出 1–A and A

第二个输出:
a1这个对象能调用到的方法有A里面show(D)和show(A); c是C类型的数据,而C是B的子类,且B是A的子类,所以C类型的数据可以向上转型到B,且B类型的数据可以向上转型到A,所以输出 2–A and A

第三个输出:
a1这个对象能调用到的方法有A里面show(D)和show(A); d是D类型的数据,所以输出 3–A and D

第四个输出:
a2这个对象能调用到的方法有A里面show(D)和B里面的show(A); b是B类型的数据,而B是A的子类,所以B类型的数据可以向上转型到A,所以输出 4–B and A

第五个输出:
a2这个对象能调用到的方法有A里面show(D)和B里面的show(A); c是C类型的数据,而C是B的子类,且B是A的子类,所以C类型的数据可以向上转型到B,且B类型的数据可以向上转型到A,所以输出 5–B and A

第六个输出:
a2这个对象能调用到的方法有A里面show(D)和B里面的show(A); d是D类型的数据,所以输出 6–A and D

第七个输出:
b这个对象能调用到的方法有A里面show(D)和B里面的show(Object)、show(A); b是B类型的数据,而B是A的子类,所以B类型的数据可以向上转型到A,所以输出 7–B and A

第八个输出:
b这个对象能调用到的方法有A里面show(D)和B里面的show(Object)、show(A); c是C类型的数据,而C是B的子类,且B是A的子类,所以C类型的数据可以向上转型到B,且B类型的数据可以向上转型到A,所以输出 8–B and A

第九个输出:
b这个对象能调用到的方法有A里面show(D)和B里面的show(Object)、show(A); d是D类型的数据,所以输出 9–A and D

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值