首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >这段java代码的解释是什么?

这段java代码的解释是什么?
EN

Stack Overflow用户
提问于 2010-06-14 03:34:58
回答 2查看 496关注 0票数 16

我有以下代码:

代码语言:javascript
复制
public class Main {
     public void method(Object o)
     {
           System.out.println("Object Version");
     }
     public void method(String s)
     {
          System.out.println("String Version");
     }
     public static void main(String args[])
     {
           Main question = new Main();
           question.method(null);//1
     }
}

为什么结果是"String Version“?如果第一个方法接受StringBuffer对象,为什么会出现编译器错误?

另一种情况:如果第一个方法接受一个StringBuffer对象,并且我编写了question.method("word");,结果将是"String Version“。为什么?为什么没有编译器错误?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-06-14 03:38:34

JAVA规范规定,在这种情况下,将调用最具体的函数。由于String是Object的子类型,因此将调用第二个方法。如果将Object更改为StringBuffer,则没有特定的方法,因为StringBuffer不是String的子类型,反之亦然。在这种情况下,编译器不知道调用哪个方法-因此出现错误。

票数 23
EN

Stack Overflow用户

发布于 2010-06-14 04:01:14

在查看另一个案例时:

打包com.snamellit;

代码语言:javascript
复制
public class Main {
    public void method(Object o) {
        System.out.println("Object Version");
    }

    public void method(String s) {
        System.out.println("String Version");
    }

    public static void main(String args[]) {
        Main question = new Main();
        question.method("word");
    }
}

如果第一个方法调用一个单词,第二个方法调用一个字符串,那么就不会出现混淆,因为“StringBuffer”是一个字符串而不是一个StringBuffer。

在Java中,函数/方法的标识依赖于3件事:名称、类型、参数(也称为参数签名)和类加载器。因为这两种类型都有不同的参数签名,所以编译器可以很容易地选择正确的签名,并且不会引发错误。

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

https://stackoverflow.com/questions/3033607

复制
相关文章

相似问题

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