java多态讲解

JAVA多态

一、相关的类结构

class A ...{  //create by danielinbiti
         public String show(D obj)...{  
                return ("A and D");  
         }   
         public String show(A obj)...{  
                return ("A and A");  
         }   
}   
class B extends A...{  
         public String show(B obj)...{  
                return ("B and B");  
         }  
         public String show(A obj)...{  
                return ("B and A");  
         }   
}  
class C extends B...{}  																
class D extends B...{}

二、测试运行

        A a1 = new A();  
        A a2 = new B();  
        B b = new B();  
        C c = new C();   
        D d = new D();   
        System.out.println(a1.show(b));   ①  
        System.out.println(a1.show(c));   ②  
        System.out.println(a1.show(d));   ③  
        System.out.println(a2.show(b));   ④  
        System.out.println(a2.show(c));   ⑤  
        System.out.println(a2.show(d));   ⑥  
        System.out.println(b.show(b));    ⑦  
        System.out.println(b.show(c));    ⑧  
        System.out.println(b.show(d));    ⑨
三、运行结果

①   A and A
②   A and A
③   A and D
④   B and A
⑤   B and A
⑥   A and D
⑦   B and B
⑧   B and B
⑨   A and D

四、总结

以A a2=new B()为例。

1、a2只能访问A的信息(指的是编译期编译器只知道a2是A类型,不知道a2具体子类对象,只有运行期才知道指向什么对象),而子类重写的方法,父类中也存在,即B重写的方法,A里也有(如果B里有但是A里没有的方法,a2也不能直接调用),所以a2可以访问,但是调用的时候(注意这里指的是运行期),a2实际指向的是B对象,所以调用的是B对象的同名同类型参数方法。所以a2.show(b)调用的是show(A obj),因为A引用不到show(B obj)。

注:编译期是编译器检查语法和类型,运行期是解析器解析伪代码为机器指令而执行,编译期编译器会检查a2的访问范围,也就是a2的访问不超过A的信息就不会出错,运行期解析器会解析方法的代码指令。

Java多态是一种重要的面向对象编程特性,它允许一个对象以多种不同的方式工作。下面介绍一个经典的Java多态案例——“动物园”。 假设有一个“动物园”类,里面有一个“动物”类,还有“狗”和“猫”两个子类,代码如下: ```java class Zoo { public void play(Animal animal) { animal.shout(); } } class Animal { public void shout() { System.out.println("动物叫!"); } } class Dog extends Animal { public void shout() { System.out.println("汪汪汪!"); } } class Cat extends Animal { public void shout() { System.out.println("喵喵喵!"); } } ``` 在“动物园”类中有一个play方法,它接收一个“动物”类对象作为参数,然后调用这个对象的shout方法。在“狗”和“猫”两个子类中分别重写了shout方法,实现了不同的叫声。 这时候我们可以创建一个“动物园”对象,然后分别将“狗”和“猫”对象传递给play方法进行测试。代码如下: ```java public class Main { public static void main(String[] args) { Zoo zoo = new Zoo(); Animal dog = new Dog(); Animal cat = new Cat(); zoo.play(dog); zoo.play(cat); } } ``` 运行结果如下: ``` 汪汪汪! 喵喵喵! ``` 通过这个案例,我们可以看到,在“动物园”类中,play方法接收一个“动物”类对象作为参数,而在实际测试中我们传递的是“狗”和“猫”对象,这就是多态的应用。我们可以看到,即使传递的是不同的对象,调用的都是各自重写的shout方法,实现了不同的叫声。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值