这是一个例子:
public interface IXMLizable<T>
{
static T newInstanceFromXML(Element e);
Element toXMLElement();
}
Run Code Online (Sandbox Code Playgroud)
当然这不会奏效.但为什么不呢?
其中一个可能的问题是,当您致电时会发生什么:
IXMLizable.newInstanceFromXML(e);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我认为它应该只调用一个空方法(即{}).所有子类都将被强制实现静态方法,因此在调用静态方法时它们都会很好.那么为什么这不可能呢?
编辑:我想我正在寻找比"因为这就是Java的方式"更深层次的答案.
是否有一个特殊的技术原因导致静态方法无法被覆盖?也就是说,为什么Java的设计者决定使实例方法可覆盖但不是静态方法?
编辑:我的设计的问题是我正在尝试使用接口来强制执行编码约定.
也就是说,界面的目标是双重的:
我希望IXMLizable接口允许我将实现它的类转换为XML元素(使用多态,工作正常).
如果有人想要创建一个实现IXMLizable接口的类的新实例,他们将始终知道将有一个newInstanceFromXML(Element e)静态构造函数.
除了在界面中添加评论之外,还有其他方法可以确保这一点吗?
编辑: 从Java 8开始,接口中现在允许使用静态方法.
该主题大部分都说明了 - 静态方法无法在接口中声明的原因是什么?
public interface ITest {
public static String test();
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给出了以下错误(至少在Eclipse中):"接口方法ITest.test()的非法修饰符;只允许使用public和abstract".
我正在阅读Khalid Mughal的程序员Java™SCJP认证指南.
在继承章节中,它解释了这一点
成员的继承与其声明的可访问性密切相关.如果超类成员可以通过其子类中的简单名称访问(不使用任何额外的语法,如super),则该成员被视为继承
它还提到静态方法不是继承的.但是下面的代码非常好:
class A
{
public static void display()
{
System.out.println("Inside static method of superclass");
}
}
class B extends A
{
public void show()
{
// This works - accessing display() by its simple name -
// meaning it is inherited according to the book.
display();
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能display()在课堂上直接使用B?更重要的是,B.display()也有效.
本书的解释是否仅适用于实例方法?
当我注意到你现在可以在界面中定义静态和默认方法时,我正在通过接口学习.
public interface interfacesample2 {
public static void method() {
System.out.println("hello world");
}
public default void menthod3() {
System.out.println("default print");
}
}
Run Code Online (Sandbox Code Playgroud)
请解释两者的区别,如果有一个例子,我们什么时候使用它会很好.在接口上有点困惑.
我最近正在玩Java 8的新功能并观察到一个有趣的行为:
这没关系:
Class A { static void staticMethodInA() {println();} }
Class B extends A {}
B.staticMethodInA();
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:静态方法只能在包含接口类时调用.
interface A { static void staticMethodInA() {println();} }
Class B implements A {}
B.staticMethodInA(); // from here IntelliJ complaints..
Run Code Online (Sandbox Code Playgroud)
有人能告诉我为什么Java 8的设计者会选择以不同的方式对待上述两种情况吗?
我创建了一个Java类的Kotlin子类:
class AlarmReceiver : WakefulBroadcastReceiver() {
companion object {
const val ACTION_NOTIFY = "..."
}
override fun onReceive(context: Context, intent: Intent) { ... }
}
Run Code Online (Sandbox Code Playgroud)
WakefulBroadcastReceiver 有两种静态方法:
static boolean completeWakefulIntent(Intent intent)static ComponentName startWakefulService(Context context, Intent intent)从我的AlarmReceiver班级中调用这些就像我期望的那样.但是,我想在我的Kotlin子类之外调用其中一种方法.
如果我尝试AlarmReceiver.completeWakefulIntent(intent)使用不同的Kotlin类,我会收到以下编译错误:
未解决的参考:completeWakefulIntent
我认为这是因为编译器试图在AlarmReceiver伴随对象上解析方法,而不是从其超类中查找继承的方法.作为一种解决方法,我可以直接定义具有相同签名的方法AlarmReceiver.Companion:
class AlarmReceiver : WakefulBroadcastReceiver() {
companion object {
const val ACTION_NOTIFY = "..."
// Just call the superclass implementation for now
fun completeWakefulIntent(intent: Intent): Boolean =
WakefulBroadcastReceiver.completeWakefulIntent(intent)
} …Run Code Online (Sandbox Code Playgroud) 隐藏静态字段时,字段对子类的访问级别没有限制,它甚至可以是非静态的,也可以是其他数据类型.
另一方面,当隐藏静态方法时,从超类隐藏静态方法的子类中的静态方法可以允许比隐藏方法更多但不能更少的访问.
AFAIK,静态方法链接无论如何都是在编译时完成的,那么为什么会有这样的限制呢?
PS问题只是出于好奇.