我遇到嵌套类的Java问题。
我的第一堂课结构如下:
public class TopClass {
public void mainMethod() {
// uses the different "method" methods from
// NestedClass-implementing nested classes
}
private interface NestedClass {
public void method();
}
private class NestedClass1 {
public void method() {
}
}
private class NestedClass2 {
public void method(){
}
}
}
但是现在我希望这些method()
方法是静态的,因为它们应该是主要的。
如果不将它们放在静态类中,我就无法使它们成为静态,但这没有问题,我使这些类保持静态,无论如何它们应该是。
现在看起来像这样:
public class TopClass {
public void mainMethod() {
// uses the different "method" methods from
// NestedClass-implementing nested classes
}
private static interface NestedClass {
public void method();
}
private static class NestedClass1 {
public static void method() {
}
}
private static class NestedClass2 {
public static void method(){
}
}
}
然后麻烦就开始了。静态方法无法从非静态接口方法正确继承,因为我在Eclipse中收到此消息This static method cannot hide the instance method from TopClass.NestedClass
。
当我将接口方法设为静态时,它会给我这个错误:Illegal modifier for the interface method method; only public & abstract are permitted
所以我想到了一个抽象类,并尝试了这个:
public class TopClass {
public void mainMethod() {
// uses the different "method" methods from
// NestedClass-implementing nested classes
}
private static abstract class NestedClass {
public static abstract void method();
}
private static class NestedClass1 {
public static void method() {
}
}
private static class NestedClass2 {
public static void method(){
}
}
}
但同样,看似抽象的方法不能被声明为静态:The abstract method method in type NestedClass can only set a visibility modifier, one of public or protected
。
离开静态(在抽象类方法中),在NestedClass1&中的方法方法上出错。 2:This static method cannot hide the instance method from TopClass.NestedClass
。
是否有任何方法可以声明某种上层结构来覆盖静态方法?
编辑: 我实际上试图解决的问题是Java缺乏存储方法引用的可能性。所以我只使用一种方法将这些类放在每个类中,而是将它们存储在List f.e中。他们必须能够被上层建筑“抓住”。 我得到了尝试匿名课程或枚举的提示,现在就试试吧。
答案 0 :(得分:6)
接口和静态不会在一起。完全没有。在静态方法上创建/强加模式没有Java支持。
答案 1 :(得分:2)
静态方法声明必须始终后跟定义。它不能由子类实现。
我认为你没有正确处理你的问题。尝试不同的方法!
使NestedClass
成为接口NestedInterface
并将您的不同实现存储为实现此接口的匿名类:
public static final NestedInterface firstNested = new NestedInterface() {
@Override
public void method() {
// ...
}
};
使NestedClass
成为枚举NestedEnum
并将您的不同实现存储为枚举值,从枚举中实现抽象方法。这仅适用于您可以选择的固定数量的实施,并且您不希望从外部来源接受NestedClass
实施。
public enum NestedEnum {
FIRST {
@Override
public void method() {
// ...
}
};
public abstract void method();
}
编辑:回复您的评论:
嵌套类上下文中的这些类本身也是静态的。
static
意味着可以在没有包含类的实例的情况下实例化。
可以通过TopClass.this.new NestedClass1()
实例化第一个示例中的常规嵌套类。通常,您只需在构造函数或new NestedClass1()
的实例方法中编写TopClass
,但在此详细形式中,您可以清楚地看到对TopClass.this
的依赖。这也可以从NestedClass1
的任何方法中看出,因为您可以访问包含TopClass.this
的类。
可以通过new TopClass.NestedClass1()
实例化第二个示例中的静态嵌套类。再一次,你可以写new NestedClass1()
,但是详细的表格清楚地表明构造仅依赖于TopClass
并且与TopClass
的实例无关。您甚至可以使用相同的代码段new TopClass.NestedClass1()
从外部类创建实例,而无需创建TopClass
实例。
我建议你看一下this question on inner classes and static nested classes。
答案 2 :(得分:1)
您的接口/抽象类嵌套的事实与问题无关 你不能。 Java中没有办法强制实现某些类来实现静态方法。只是哭泣并投降并使用实例方法。
答案 3 :(得分:1)
static abstract
是一个矛盾。静态方法与其他语言的类方法不同。当你创建一个静态方法时,它会进入一个类,它不会被继承,或者它的实现被推迟到子类。
您没有解释为什么您希望这些方法是静态的。如果您希望这些方法由子类定义,那么它们不应该是。