当前位置: 首页 > 面试题库 >

Java是否有任何理由对同一类中的重载方法使用后期/静态绑定?

曹疏珂
2023-03-14
问题内容

Java是否对重载方法使用早期绑定有任何特定的原因?不可能使用后期绑定吗?

例:

public class SomeClass {

    public void doSomething(Integer i) {
        System.out.println("INTEGER");
    }

    public void doSomething(Object o) {
        System.out.println("OBJECT");
    }

    public static void main (String[] args) {
        Object i = new Integer(2);
        Object o = new Object(); 
        SomeClass sc = new SomeClass();
        sc.doSomething(i);
        sc.doSomething(o); 
    } 
}

打印:对象对象

我更希望:整数对象


问题答案:

在我看来,最明显的原因是它允许编译器保证实际上会有一个要调用的函数。

假设Java根据运行时类型选择了函数,并且您这样编写:

public class MyClass
{
  public void foo(Integer i)
  {
    System.out.println("Integer");
  }
  public void foo(String s)
  {
    System.out.println("String");
  }
  public static void main(String[] args)
  {
    Object o1=new String("Hello world");
    foo(o1);
    Object o2=new Double(42);
    foo(o2);
  }
}

输出是什么?对foo的第一个调用可能显示“
String”,但是第二个调用无处可去。我想它可能会生成运行时错误。这类似于严格类型与宽松类型的论点。如果它在运行时选择了该功能,则从某种意义上讲它可能会更加灵活。但是,通过在编译时选择函数,我们可以在编译时获得错误消息,而不必等到运行时,并确保我们已对每种可能的数据组合使用了所有可能的路径。



 类似资料:
  • 问题内容: 我知道不可能在一个类中重写一个方法。但是,有没有办法使用非静态方法作为静态方法呢?例如,我有一个加数字的方法。我希望此方法在没有对象的情况下有用。是否可以在不创建其他方法的情况下执行类似的操作? 编辑:我的意思是,如果我将一个方法设为静态,我将需要它接受参数,如果我创建了一个已经设置了变量的对象,那么再次对具有相同参数的对象调用函数将非常不舒服。 我知道代码不正确,但是我想展示自己想做

  • 问题内容: 似乎抽象类意味着该类的定义不完整,因此无法实例化。 我看到了一些简单的Java代码,其中包含一个抽象类,其中定义了所有方法。然后我想知道,为什么他们将其作为抽象类而不是真实类?他们是在这样做,所以我们不能从这个抽象类实例化吗?还是从定义了所有内容的抽象类中获得其他好处? 问题答案: 即使所有方法都具有默认实现,也有可能这些实现在应用程序上下文中实际上没有 意义 。这些方法可能仅进行内部

  • 问题内容: 我正在为测试做练习,并且遇到了有关重载以及静态和动态绑定的练习。询问以下代码的输出: 我 认为 我获得了第一个,但在其他方面我完全迷失了。这是我解决第一个问题的方法: 在运行时,类型为,因此我们调用Curly的print方法。由于我们传递了要打印的类型的对象,因此在中运行了具有参数类型的相应打印方法。该方法的输出为,正确答案。 但是,当我将这种技术应用于以下几行时,我得到的答案是错误的

  • 我想我得到了第一个,但在其他方面我完全迷失了。我是这样解决第一个问题的: 在运行时,的类型是,所以我们调用curly的print方法。因为我们将类型的对象传递给print,所以相应的参数类型为的print方法在中运行。此方法的输出是,正确答案。 然而,当我将此技术应用到以下行时,我最终得到了错误的答案。有人能解释一下这个概念在Java中到底是如何工作的吗? 代码的正确输出是:

  • 我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则: 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。 例如,让,然后隐藏. 我们可以重写实例方法。 例如重写. 两个或多个具有相同签名的方法不能以静态或非静态组合形式

  • 我在一个类中有多个同步的静态方法。 现在只允许一个线程执行类中的任何同步函数。这是不有效的,因为这些函数彼此独立并且可以并行运行。我如何才能使它们彼此独立,但每个方法只允许一个线程,而对类的更改最少。