Dlaczego nie możesz zadeklarować klasy jako statycznej w Javie?

Dlaczego nie możesz zadeklarować klasy jako statycznej w Javie?

Author: minarmahmud, 2010-08-27

14 answers

Tylko klasy zagnieżdżone mogą być statyczne. W ten sposób można użyć klasy zagnieżdżonej bez posiadania instancji klasy zewnętrznej.

class OuterClass{
    public static class StaticNestedClass{
    }

    public class InnerClass{
    }

    public InnerClass getAnInnerClass(){
        return new InnerClass();
    }

    //This method doesn't work
    public static InnerClass getAnInnerClassStatically(){
        return new InnerClass();
    }
}

class OtherClass{
    //Use of a static nested class:
    private OuterClass.StaticNestedClass staticNestedClass = new OuterClass.StaticNestedClass();

    //Doesn't work
    private OuterClass.InnerClass innerClass = new OuterClass.InnerClass();

    //Use of an inner class:
    private OuterClass outerclass= new OuterClass();
    private OuterClass.InnerClass innerClass2 = outerclass.getAnInnerClass();
    private OuterClass.InnerClass innerClass3 = outerclass.new InnerClass();
}

Źródła:

Na ten sam temat:

 461
Author: Colin Hebert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:22

Więc, spóźnię się na imprezę, ale oto moje dwa grosze-filozoficznie dodając do odpowiedzi Colina Heberta.

Na wysokim poziomie twoje pytanie dotyczy różnicy między obiektami i typami. Chociaż istnieje wiele samochodów (obiektów), istnieje tylko jedna klasa samochodów (Typ). Deklarowanie czegoś jako statycznego oznacza, że działasz w przestrzeni "type". Jest tylko jeden. Słowo kluczowe klasy najwyższego poziomu definiuje już typ w przestrzeni "type". W rezultacie " publiczny samochód klasy statycznej" jest zbędny.

 31
Author: Eric Jankowski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-27 21:18:18

Klasy najwyższego poziomu są domyślnie statyczne. Klasy wewnętrzne są domyślnie niestatyczne. Możesz zmienić domyślne klasy wewnętrzne, wyraźnie oznaczając je statycznie. Klasy najwyższego poziomu, z racji tego, że są klasami najwyższego poziomu, nie mogą mieć semantyki statycznej, ponieważ nie może istnieć Klasa nadrzędna, do której można by się odwoływać. Dlatego nie ma możliwości zmiany domyślnej dla klas najwyższego poziomu.

 30
Author: necromancer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-18 21:12:12

Klasa z prywatnym konstruktorem jest statyczna.

Zadeklaruj swoją klasę w ten sposób:

public class eOAuth {

    private eOAuth(){}

    public final static int    ECodeOauthInvalidGrant = 0x1;
    public final static int    ECodeOauthUnknown       = 0x10;
    public static GetSomeStuff(){}

}

I możesz używać bez inicjalizacji:

if (value == eOAuth.ECodeOauthInvalidGrant)
    eOAuth.GetSomeStuff();
...
 29
Author: Sergey Vakulenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-31 16:55:49

Pewnie, że mogą, ale tylko wewnętrzne zagnieżdżone klasy. Oznacza to, że instancje klasy zagnieżdżonej nie wymagają zamykającej instancji klasy zewnętrznej.

Ale dla klas najwyższego poziomu, projektanci języka nie mogli wymyślić nic użytecznego do zrobienia ze słowem kluczowym, więc nie jest to dozwolone.

 12
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 14:42:55

Możesz utworzyć klasę narzędzia (która nie może mieć utworzonych instancji), deklarując Typ enum bez instancji. czyli konkretnie deklarujesz, że nie ma żadnych przypadków.

public enum MyUtilities {;
   public static void myMethod();
}
 12
Author: Peter Lawrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 22:13:30
public class Outer {
   public static class Inner {}
}

... może być zadeklarowana jako statyczna - o ile jest klasą członkowską.

Z JLS:

Klasy Członkowskie mogą być statyczne, w którym to przypadku nie mają dostępu do zmiennych instancji otaczającej klasy; lub mogą być klasami wewnętrznymi (§8.1.3).

I tutaj:

Słowo kluczowe statyczne może modyfikować deklarację elementu typu C wewnątrz ciała nie-wewnętrznej klasy T. jego efektem jest deklaracja, że C nie jest klasą wewnętrzną. Podobnie jak statyczna metoda T nie ma bieżącej instancji T w swoim ciele, C również nie ma bieżącej instancji T, ani nie ma żadnych leksykalnie zamykających się instancji.

Statyczne słowo kluczowe nie miałoby sensu dla klasy najwyższego poziomu, tylko dlatego, że klasa najwyższego poziomu nie ma typu zamkniętego.

 8
Author: Andreas_D,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 12:42:31

Jak wyjaśniono powyżej, Klasa nie może być statyczna, chyba że jest członkiem innej klasy.

Jeśli chcesz zaprojektować klasę "której nie może być wiele instancji", możesz zajrzeć do wzorca "Singleton".

Początkujący Singleton info tutaj .

Zastrzeżenie:

Jeśli myślisz o użyciu singleton wzór, oprzeć się wszystkim twoja siła. Jest to jeden z najprostszych DesignPatterns do zrozumienia, prawdopodobnie najbardziej popularne, a na pewno najbardziej maltretowany. (źródło: JavaRanch jak wyżej)

 5
Author: S.Jones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-27 12:57:34

Oprócz tego, jak Java definiuje statyczne klasy wewnętrzne, istnieje inna definicja statycznych klas według Świata C# [1]. Klasa statyczna to taka, która ma tylko statyczne metody (funkcje) i ma wspierać programowanie proceduralne. Takie klasy nie są tak naprawdę klasami, ponieważ użytkownik klasy jest zainteresowany tylko funkcjami pomocniczymi, a nie tworzeniem instancji klasy. Chociaż klasy statyczne są obsługiwane w C#, w Javie nie ma takiej bezpośredniej obsługi. Możesz jednak użyj enums do naśladowania klas statycznych C# w Javie, aby użytkownik nigdy nie mógł utworzyć instancji danej klasy (nawet używając reflection) [2]:

public enum StaticClass2 {
    // Empty enum trick to avoid instance creation
    ; // this semi-colon is important

    public static boolean isEmpty(final String s) {
        return s == null || s.isEmpty();
    }
}
 4
Author: shams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-13 21:36:09

Jedynymi klasami, które mogą być statyczne, są klasy wewnętrzne. Poniższy kod działa dobrze:

public class whatever {
    static class innerclass {
    }
}

Punktem statycznych klas wewnętrznych jest to, że nie mają odniesienia do zewnętrznego obiektu klasy.

 2
Author: user2645256,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 09:01:37

Wszystko co kodujemy w Javie trafia do klasy. Ilekroć uruchamiamy klasę JVM tworzy instancję obiektu. JVM może tworzyć wiele obiektów, z definicji statyczne oznacza, że masz ten sam zestaw kopii do wszystkich obiektów.

Tak więc, jeśli Java pozwoliłaby, aby Klasa top była statyczna przy każdym uruchomieniu programu, tworzy ona obiekt i utrzymuje nadpisywanie do tego samego miejsca pamięci.

Jeśli po prostu zastępujesz obiekt za każdym razem, gdy go uruchamiasz, to jaki jest sens tworzenia to?

Dlatego Java pozbyła się statycznej klasy najwyższego poziomu.

Mogą być bardziej konkretne powody, ale to miało dla mnie logiczny sens.

 2
Author: user2626445,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-26 19:45:17

Myślę, że jest to tak proste, jak wypicie szklanki kawy!. Spójrz na to. Nie używamy jawnie statycznego słowa kluczowego podczas definiowania klasy.

public class StaticClass {

    static private int me = 3;
    public static void printHelloWorld() {
       System.out.println("Hello World");
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}

Czy to nie jest definicja klasy statycznej? Używamy po prostu funkcji połączonej z klasą. Bądź ostrożny, że w tym przypadku możemy użyć innej klasy w tym zagnieżdżonym. Zobacz też:

class StaticClass1 {

    public static int yum = 4;

    static void  printHowAreYou() {
        System.out.println("How are you?");
    }
}

public class StaticClass {

    static int me = 3; 
    public static void printHelloWorld() {
       System.out.println("Hello World");
       StaticClass1.printHowAreYou();
       System.out.println(StaticClass1.yum);
    }



    public static void main(String[] args) {
        StaticClass.printHelloWorld();
        System.out.println(StaticClass.me);
    }
}
 1
Author: Erfankam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 14:51:53

Można spojrzeć na PlatformUI W Eclipse dla klasy ze statycznymi metodami i prywatnym konstruktorem, która sama w sobie jest ostateczna.

public final class <class name>
{
   //static constants
   //static memebers
}
 1
Author: user175881,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-28 07:12:57

Jeśli korzyścią z użycia klasy statycznej nie było utworzenie instancji obiektu i użycie metody, to po prostu zadeklaruj klasę jako publiczną, a tę metodę jako statyczną.

 0
Author: eeadev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-31 10:52:41