java多态讲解!

转载于:https://blog.csdn.net/weixin_35638540/article/details/54730164

 

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

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

}

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

public class C extends B{

}

public class D extends B{

}

   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));      
        }

输出:

1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D

前面三个输出估计没有问题,接下来说明一下第四个,首先a2是A类的引用变量,它所指向的对象是B类的对象,可以看出这就是多态的特性,a2.show(b);计算机的执行过程为:首先到父类中寻找show(B obj)这个方法,但是发现找不到,于是找到形参为A定义的show(A obj)这个函数,把b赋值给a,在这一步上又有出现多态的特性,此时按理来说是输出的“A and A”,但是不然,因为show(A obj)这个函数被子类B重写了所以说要调用子类中的show(A obj)这个函数,以上三步是执行全过程,由此可以看出,多态特性中用父类变量调用成员方法是通过子类对象来调用的,所以最后一步调用了子类重写父类的成员方法。有些书上总结了一些公式,但我觉得这种问题还是要从解析内存上理解,后面的几个也差不多。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值