Java中的多态调用问题,下面代码输出是什么?

转自:http://www.lvhongqiang.com/blog431.html

问题:

下面代码输出是什么?

public class Test3 {
    public static void main(String[] args) {
        AAA a = new BBB();
        BBB b = new BBB();
        System.out.println(a.show(b));//B and A
    }
}
class AAA {
    public String show(D obj){
        return ("A and D");
    }
    public String show(AAA obj){
        return ("A and A");
    }
}
class BBB extends AAA{
    public String show(BBB obj){
        return ("B and B");
    }
    public String show(AAA obj){
        return ("B and A");
    }
    public String show(D obj){
        return ("D and A");
    }
}
class C extends BBB{}
class D extends BBB{}

解答:

先说为什么不是B and B。
        AAA a = new BBB();
        BBB b = new BBB();
        System.out.println(a.show(b));//B and A

这里面a虽然指向一个BBB对象,但声明的是一个AAA,所以a只能调用AAA中的两个方法:

public String show(D obj)
public String show(AAA obj)

根本访问不到BBB中的方法:

public String show(BBB obj)
然后,

a确实指向一个BBB对象,因为BBB继承自AAA,父类AAA中的

public String show(AAA obj)

被BBB中的

public String show(AAA obj)

覆盖,结果就是B and A。

最后,为什么参数b可以传入show(AAA obj)?

虽然传入的参数b是BBB类型,但AAA是BBB的父类,参数b可以被show(AAA obj)接受。

### Java 多态性详解 #### 什么是多态多态是指同一个行为具有多个不同表现形式的能力。在面向对象编程中,多态允许程序通过父类类型的引用调用子类的具体实现方法[^1]。 #### 实现方式 Java多态主要依赖于继承和接口两种机制来实现: 1. **继承** 当一个类继承另一个类时,子类可以重写(Override)父类的方法。这样,当通过父类类型引用指向子类对象并调用某个方法时,实际执行的是子类中的具体实现版本[^4]。 2. **接口** 接口提供了另一种实现多态的方式。任何实现了特定接口的类都可以视为该接口的一个实例,并且可以通过接口类型变量访问这些类所实现的方法[^3]。 #### 示例代码 以下是基于继承实现多态的例子: ```java package Polymorphism; public class Person { public void mission() { System.out.println("人要好好活着!"); } } class Student extends Person { @Override public void mission() { System.out.println("学生要努力学习!"); } } ``` 测试上述代码的行为如下所示: ```java Person p1 = new Person(); p1.mission(); // 输出:"人要好好活着!" Person p2 = new Student(); p2.mission(); // 输出:"学生要努力学习!" ``` 这里 `p2` 是一个 `Person` 类型的引用,但它实际上指向了一个 `Student` 对象。由于 `mission()` 方法被 `Student` 类重写了,所以最终调用了子类中的实现版本。 #### 注意事项 - 构造函数不支持多态特性;也就是说,在构造器内部不应该尝试调用可能被子类覆盖的方法,因为这可能导致尚未完全初始化的对象状态出现问题。 - 如果某方法仅存在于子类而非父类,则无法经由声明为父类类型的变量直接访问此方法。 #### 总结 利用多态可以使应用程序更加灵活、易于扩展与维护。它鼓励开发者设计通用性强的基础结构,同时让具体的细节留给派生类去处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值