首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中多态概念的混淆

java中多态概念的混淆
EN

Stack Overflow用户
提问于 2015-01-06 13:42:50
回答 4查看 538关注 0票数 0

我对java中的多态概念有点困惑,因为不同的作者编写它的方式不同。

案例-1

动态(运行时)多态--方法重载和使用实例方法重写方法--是动态多态的例子。

静态(编译时)多态-方法重载和使用静态方法重写方法;使用私有或最终方法重写方法是静态多态的示例。

案例2

方法重载是编译时/静态多态的一个例子。

方法重写是运行时/动态多态的一个示例。

那么哪个案子是对的?java支持静态或动态多态?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-01-06 14:01:54

编译时间和运行时多态性与解析调用的时间直接相关。

在编译时多态性中,调用在编译时被解析。方法重载是编译时多态性的一个例子。重载无论是在实例级别还是在类级别。

例子:

代码语言:javascript
复制
 public class Sample {
    static void doSomething(InputStream is) {
        System.out.println("is");
    }

    static void doSomething(OutputStream os) {
        System.out.println("os");
    }

    public static void main(String args[]) {
        System.out.println(doSomething(null)); // "compilation" error . Ambiguous call. Both InputStream and OutputStream can take `null` argument.
    } 

}

接下来,运行时多态性:在这里,在编译期间检查调用/方法签名是否存在,但实际调用在运行时被解析。例子:

代码语言:javascript
复制
class ParentOfSample {
    void testingOverriding(String s) {
        System.out.println("Parent..");
    }
}

public class Sample extends ParentOfSample {
    static void doSomething(InputStream is) {
        System.out.println("is");
    }

    static void doSomething(OutputStream os) {
        System.out.println("os");
    }

    void testingOverriding(String s) {
        System.out.println("Sample..");
    }

    public static void main(String args[]) {
        ParentOfSample s = new Sample();
        s.testingOverriding(null);
    }
}

样品。注意,在重写方法时,签名是相同的。

因此,底线是:第二种情况是对的。Java支持静态和动态多态。

票数 0
EN

Stack Overflow用户

发布于 2015-01-06 13:47:04

重载在编译时。覆盖在运行时。所以案例2是正确的。

票数 0
EN

Stack Overflow用户

发布于 2015-01-06 13:53:06

案例2是正确的

方法重写-运行时多态性。

方法重载-编译时多态性

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27799920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档