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

Java中静态和非静态方法的重载和重写

尚景焕
2023-03-14

我试图理解重载和重写静态和非静态方法是如何工作的。事实上,我试图理解这些方法如何能够和不能出现在父类和子类中。我想出了下面的规则:

  1. 我们不能重写静态方法,只能隐藏它们。通过隐藏,我们的意思是在编译时根据引用变量类型决定执行哪个方法,而不是重写(,在运行时根据实例类型选择哪个方法执行)。
    例如,让类B扩展A,然后静态B.method()隐藏静态A.method().
  2. 我们可以重写实例方法。
    例如B.method()重写A.method().
  3. 两个或多个具有相同签名的方法不能以静态或非静态组合形式存在于同一个类中。
    例如,b不能同时包含静态方法(float)方法(float)
  4. 两个或多个具有不同签名的方法可以以静态或非静态的任意组合形式存在于同一个类中。
    例如,b可以包含静态方法()静态方法(int)方法(float)
  5. 静态方法不能重写非静态方法。
    例如B.method()不能重写静态B.method()
  6. 非静态方法不能重写静态方法。
    例如静态B.method()不能重写B.method()

我的这些观察是正确的吗?我有没有漏掉任何规则?

共有1个答案

宁鹏程
2023-03-14

规则:

  • 多态性适用于重写,而不适用于重载。
  • 重写是运行时概念,而重载是编译时概念。

Polymorphism->真正的对象类型@runtime(而不是引用变量的类型)决定使用哪个overridde方法。相反,引用类型决定编译时使用哪个overload方法。

 类似资料:
  • 我的程序有问题。Eclipse写道: 我做错了什么?我的应用程序中有2个错误。班你能改进我的代码并解释一下吗?先谢谢你。 多边形 地聚线

  • PowerMockito.when(ConnectionFactory.getConn(“ABC”).getCurrentStatus()).thenReturn(ConnectionStatus.Connected); 对于上面的陈述,我得到了一个NPE。 我在junit测试类的开头已经有@PrepareForTest({fxallConnectionFactory.class,Connecti

  • 我想知道: 为什么在Java中不能重写静态方法? 静态方法可以在Java中重载吗?

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

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

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