2012-05-14 72 views
1

我有嵌套類的Java問題。如何使用從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

你究竟想在這裏完成什麼?意思是除了嵌套類,接口等之外,實際的目標是什麼?似乎你可能會過度解決問題的任何問題。靜態方法的接口沒有意義,因爲靜態方法只聲明/存在*一次*。 –

+0

我用Enumeration做了。哪些工作正常:) –

+0

「但我認爲靜態類中的每個方法都是靜態的,」 - 不,這不是事實。我認爲你對嵌套類和內部類的區別感到困惑。閱讀[this](http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html)和[this](http://stackoverflow.com/questions/70324/java-inner-class-靜態嵌套類) –

回答

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(); 
    } 
    

編輯:在回答您的評論:

The classes itself are static as well..

static在嵌套類的上下文意味着這個類可以不包含類的實例被實例化

像第一個例子中的常規嵌套類可以通過TopClass.this.new NestedClass1()實例化。通常情況下,您只需在構造函數或TopClass的實例方法中編寫new NestedClass1(),但以詳細的形式可以清楚地看到對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

6

接口和靜態信息不會放在一起。完全一樣。沒有對靜態方法創建/強制模式的Java支持。

1

您的接口/抽象類嵌套的事實與問題無關。
你只是不能。 Java沒有辦法強制某些類實現靜態方法。只要哭泣,投降並使用實例方法。

1

static abstract是一個矛盾。靜態方法不像其他語言的類方法。當你創建一個靜態方法時,它會在一個類中繼承,它不會被繼承或者將其實現推遲到子類中。

你不解釋爲什麼你希望這些方法是靜態的。如果你想要這些方法由子類定義,那麼它們不應該是。

+0

靜態意味着一個方法的執行與您擁有的類的實例無關。由於這些類只是代表方法,情況就是如此。類本身也是靜態的。 –