在Java中,一个实例方法可以隐藏另一个方法吗?

在Java中,一个实例方法可以隐藏另一个方法吗?,java,Java,最重要的情况: class a{ public void m() {} } class b extends a { @override public void m(){} } 隐藏箱: class a { public static void m(){} } class b extends a{ public static void m(){} } 这是一个实例方法隐藏另一个实例方法吗 interface i { void m(); } interface j

最重要的情况:

class a{  public void m() {}    }
class b extends  a {   @override public void m(){}   }
隐藏箱:

class a { public static void m(){}  }
class b extends a{ public static void m(){}  }
这是一个实例方法隐藏另一个实例方法吗

 interface i {  void m();  }
 interface j {   void m();  }
 class a implements i,j {  void m(){}  }

一个实例方法是否可以隐藏另一个实例方法?如果该方法匹配i和j中的两个签名(这里是这种情况),它将同时实现这两个签名。如果两个接口中的签名差异不足以使用重载,则不能将它们组合到单个类中


当涉及到接口时,没有隐藏/重写,只有实现。

如果该方法匹配i和j中的两个签名(这里就是这种情况),它将同时实现它们。如果两个接口中的签名差异不足以使用重载,则不能将它们组合到单个类中


对于接口,没有隐藏/覆盖,只有实现。

静态方法

对于静态方法,您必须以任何方式向调用提供类(它们是类方法,而不是实例方法),因此不会隐藏,例如

A.m(); //call static method on class A (btw, Java convention is that class names start with a capital case letter)
B.m();
实例方法

实例方法不能隐藏其他方法,只需覆盖它们,例如,如果
B
扩展了
A
,每当您对
B
的实例调用
m()
时,就会调用
B
版本的
m()

接口

对于接口,即使在多个接口中声明了一个方法,也要实现一次


在Java 8中,可能存在接口方法和IIRC的默认实现,具体实现将覆盖默认实现,而两个默认实现接口
I
J
将生成编译时错误(除非有一个接口更具体,例如如果
J
扩展
I

静态方法

对于静态方法,您必须以任何方式向调用提供类(它们是类方法,而不是实例方法),因此不会隐藏,例如

A.m(); //call static method on class A (btw, Java convention is that class names start with a capital case letter)
B.m();
实例方法

实例方法不能隐藏其他方法,只需覆盖它们,例如,如果
B
扩展了
A
,每当您对
B
的实例调用
m()
时,就会调用
B
版本的
m()

接口

对于接口,即使在多个接口中声明了一个方法,也要实现一次


在Java 8中,可能存在接口方法和IIRC的默认实现,具体实现将覆盖默认实现,而两个默认实现接口
I
J
将生成编译时错误(除非一个接口更具体,例如,如果接口
I
J
J
扩展
I

,如果一个类同时实现了这两个接口,则该接口没有冲突

对于静态方法,您不能隐藏它,因为您必须从类调用它,即
a.m()
b.m()
,因此它不会隐藏


最后,对于重写方法,超类的方法不是隐藏的,而是被重写的。

对于接口
i
j
,如果一个类同时实现了这两种方法,那么就可以了,没有违反接口的情况

对于静态方法,您不能隐藏它,因为您必须从类调用它,即
a.m()
b.m()
,因此它不会隐藏


最后,对于重写方法,超类的方法不是隐藏的,而是被重写的。

定义一个与超类的方法具有相同签名的方法


在子类中,您可以
重载从超类继承的方法
。这样的
重载方法既不隐藏也不重写
超类实例方法-
它们是新方法,是子类所独有的,定义了与超类方法具有相同签名的方法


在子类中,您可以
重载从超类继承的方法
。这样的
重载方法既不隐藏也不重写
超类实例方法-
它们是新方法,在
@override
的情况下是子类特有的

接口情况不同:


一个接口定义了一个契约,它只是说标记为接口的对象可以做一些事情。没有定义如何做。所以你不是在隐藏方法,而是在实现两个接口的类中,你定义了两个动作(同名)以相同的方式执行。

@Override
的情况下,这是可以的

接口情况不同:

一个接口定义了一个契约,它只是说标记为接口的对象可以做一些事情。没有定义如何做。所以你不是在隐藏方法,而是在实现两个接口的类中,你定义了两个动作(同名)以相同的方式执行

这些类不共享一个共同的祖先,因此一个不能“隐藏”另一个的方法。在Java中,子类中的同名实例方法总是覆盖超类的实例方法,没有其他语言中的隐藏机制(如Pascal,如果我没记错的话)。这是正确的,即使未进行
@Override
注释,注释只会使代码更可读,并有助于防止打字错误

但是,如果您将class
b
更改为扩展class
a
,那么它的静态方法
m()
实际上会在
a
中隐藏相同名称的方法

这就是我们要说的:

隐藏静态方法和重写实例方法之间的区别具有重要意义:

  • interface i {  void m();  }
    interface j {   void m();  }
    class a implements i,j {  void m(){}  }