当前位置: 首页 > 知识库问答 >
问题:

将null传递给重写的方法[重复]

吕飞翼
2023-03-14

我有以下代码:

class SuperClass {

    int method(Object o){
        return 1;
    }

    int method(String s){
        return 2;
    }
}
public class PassingNull extends SuperClass {

    int method(Object s) {
        return 3;
    }
    public static void main(String... a){
        SuperClass sc = new SuperClass();
        PassingNull sb = new PassingNull();
        SuperClass st = new PassingNull();
        System.out.println(sc.method(null)); //1
        System.out.println(sb.method(null)); //2
        System.out.println(st.method(null)); //3
    }
}

我知道对于1和3,它打印“2”,因为调用了最特定的参数类型。但无法理解为什么2打印“2”。

共有1个答案

卫弘图
2023-03-14

基本上,原因与案例1和2相同。

如您所知,超类有两个名为method的方法。其中一个接受对象,另一个接受字符串,后者更具体,因此传递null是指第二个(更具体的)方法,因为null适用于两者。

现在,PassingNull还有两个名为method的方法。与之前一样,一个重载采用对象(覆盖超类::方法(对象)的重载),另一个重载采用字符串(直接从超类继承的重载)。因此,情况类似,这意味着类型解析的工作方式类似:假设两个重载都适用,那么更具体的重载(接受字符串的重载)就是将被调用的重载。

 类似资料:
  • 我无法理解为什么这个程序打印字符串 请帮助我了解如何打印Sting而不是Object

  • 我在一个类中重载了以下2个方法: 当我调用方法testMethod时,它会打印“String”。 当我再添加一个重载方法时: 它抛给我编译器错误:是矛盾的。 当我用null调用方法时,所有这些都会发生 我的问题是: 为什么它打印字符串而不是对象? 为什么添加第三种方法会出现编译错误?

  • 问题内容: 一个讨论是关于将空值传递给方法。 它代表了不同的处理方式: 我更喜欢断言方法,但是我不喜欢断言默认情况下处于关闭状态的事实。 该书最后指出: 在大多数编程语言中,没有很好的方法来处理调用者意外传递的null。因为是这种情况,所以合理的方法是默认情况下禁止传递null。 它实际上并没有涉及如何实施此限制? 无论哪种方式,您中的任何人都有强烈的意见。 问题答案: 在这里,使用断言和引发异常

  • 问题内容: 我有一个类A,具有抽象方法doAction(BaseClass obj),期望类型为BaseClass的参数 现在,我还有另一个需要扩展A的类B。但是,B的doAction方法需要使用对象DerivedClass来扩展BaseClass。 当我需要将DerivedClass类型的参数传递给需要BaseClass的方法时,该如何处理呢? 谢谢! 问题答案: 您使基类通用: 以及使用派生类

  • 我正在Java中练习一些例子。代码如下所示: 关于这一点,我没有什么问题, 1) 上面的代码使用method1(算术异常e)执行并打印null,为什么不使用异常(因为它位于层次结构的顶部)? 猜测:这是因为与异常相比,算术异常更加具体。如果是这样,为什么要问第二个问题 2) 通过在现有代码中引入以下方法,程序显示编译时异常。为什么? 帮助我学习。谢谢

  • 在以下程序中: 输出为“str”,有人能解释一下为什么要打印str吗?我无法理解这一点。