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

java中的静态和实例方法-父类和子类

何升
2023-03-14

为什么我们不能在子类B中声明一个实例方法,它与父类a中的静态方法共享相同的签名?

public class A{
     static void testStatic(){}
}


public class B extends  A{
      void testStatic (){}
}


public class Test{

public static void main (String[] args){

        A a = new B()

        a.testStatic();

}

在上面的代码中,由于A没有该名称的实例方法,并且由于Java允许对象访问静态方法,所以指向B的类型为A的对象A可以调用它中存在的静态方法(类A)。但是编译器抛出一个错误“实例方法不能重写静态方法”为什么?

注意:我可以理解,如果一个类不允许两个方法使用相同的方法名,即使其中一个是实例,另一个是静态的。但是我不明白为什么它不允许一个子类有一个同名的实例。特别是考虑到静态方法不能被重写这一事实。然而,Java允许子类与父类的静态方法同名,称为信息隐藏,而不是重写。

共有1个答案

阎知
2023-03-14

编译器抛出错误,因为这些是语言的规则。从Java语言规范§8.4.8.2:

如果一个类C声明或继承了一个静态方法M,那么M在C的超类和超接口中隐藏了任何方法M',其中M的签名是M'签名的子签名(§8.4.2),否则C中的代码就可以访问这些方法。

如果静态方法隐藏实例方法,则是编译时错误。

(原文中的强调)。这种语言很密集(就像JLS中的大多数地方一样),但它与您描述的情况相匹配。JLS没有为我在一读中找到的这一规则提供理论依据。但是,如果你想一下如何使这条规则变得不必要,就会发现它为什么会存在。

 类似资料:
  • 主要内容:Python类实例方法,Python类方法,Python类静态方法和类属性一样,类方法也可以进行更细致的划分,具体可分为 类方法、 实例方法和 静态方法。 和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法。 其中 @classmethod 和 @staticmethod 都是函数装饰器,后续章节会对其做详

  • 本文向大家介绍浅谈python中的实例方法、类方法和静态方法,包括了浅谈python中的实例方法、类方法和静态方法的使用技巧和注意事项,需要的朋友参考一下 在学习python代码时,看到有的类的方法中第一参数是cls,有的是self,经过了解得知,python并没有对类中方法的第一个参数名字做限制,可以是self,也可以是cls,不过根据人们的惯用用法,self一般是在实例方法中使用,而cls则一

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

  • 本文向大家介绍PowerShell中调用.NET对象的静态方法、静态属性和类方法、类属性例子,包括了PowerShell中调用.NET对象的静态方法、静态属性和类方法、类属性例子的使用技巧和注意事项,需要的朋友参考一下 本文介绍在PowerShell中如何使用.NET对象,PowerShell内在支持大量的.NET对象。 调用类的静态方法 用中括号把类的名称括起来,然后输入两个冒号,然后再输入方法

  • 在讲类方法和静态方法之前,先来看一个简单的例子: class A(object): def foo(self): print 'Hello ', self >>> a = A() >>> a.foo() Hello, <__main__.A object at 0x10c37a450> 在上面,我们定义了一个类 A,它有一个方法 foo,然后我们创建了一个对象 a,并调用

  • 本文向大家介绍深入解析python中的实例方法、类方法和静态方法,包括了深入解析python中的实例方法、类方法和静态方法的使用技巧和注意事项,需要的朋友参考一下 1、实例方法/对象方法 实例方法或者叫对象方法,指的是我们在类中定义的普通方法。 只有实例化对象之后才可以使用的方法,该方法的第一个形参接收的一定是对象本身 2、静态方法 (1).格式:在方法上面添加 @staticmethod (2)