在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
注释,注释只会使代码更可读,并有助于防止打字错误
但是,如果您将classb
更改为扩展classa
,那么它的静态方法m()
实际上会在a
中隐藏相同名称的方法
这就是我们要说的:
隐藏静态方法和重写实例方法之间的区别具有重要意义:
-
interface i { void m(); }
interface j { void m(); }
class a implements i,j { void m(){} }