Frage

Um genau zu sein, ich habe versucht, diesen Code ein:

package hello;

public class Hello {

    Clock clock = new Clock();

    public static void main(String args[]) {
        clock.sayTime();
    }
}

Aber es gab den Fehler

  

Kein Zugriff auf nicht-statische Feld in statische Methode main

Also habe ich die Erklärung von clock dazu geändert:

static Clock clock = new Clock();

Und es funktioniert. Was bedeutet es, dass Schlüsselwort vor der Erklärung zu setzen? Was genau wird es tun und / oder in Bezug auf die beschränken, was auf das Objekt zu tun?

War es hilfreich?

Lösung

static Mitglieder gehören zur Klasse statt einer bestimmten Instanz.

Es bedeutet, dass nur eine Instanz eines static Feld existiert [1] , auch wenn Sie eine Million Instanzen der Klasse erstellen, oder Sie erstellen nicht. Es wird von allen Instanzen gemeinsam genutzt werden.

Da static Methoden nicht auch auf eine bestimmte Instanz gehören, können sie beispielsweise Mitglieder beziehen sich nicht. In dem gegebenen Beispiel, weiß main nicht die Instanz der Hello Klasse (und damit die Instanz der Clock Klasse) es beziehen sich auf sollte. static Mitglieder können nur verweisen Mitglieder static. Instanzmitglieder können natürlich Zugang static Mitglieder.

Randbemerkung:. Natürlich static Mitglieder Instanz Mitglieder zugreifen können durch einen Objektverweis

Beispiel:

public class Example {
    private static boolean staticField;
    private boolean instanceField;
    public static void main(String[] args) {
        // a static method can access static fields
        staticField = true;

        // a static method can access instance fields through an object reference
        Example instance = new Example();
        instance.instanceField = true;
    }

[1]. In Abhängigkeit von den Laufzeiteigenschaften, kann es ein pro Classloader oder AppDomain oder Faden sein, aber das ist neben dem Punkt

Andere Tipps

Es bedeutet, dass es nur eine Instanz von „Uhr“ in Hallo, nicht eine für jede separate Instanz der „Hallo“ Klasse oder mehr-so bedeutet es, dass es eine gemeinsam geteilten „Uhr“ Referenz wird unter alle Instanzen des „Hallo“ -Klasse.

Also, wenn Sie waren ein „neues Hallo“ überall in Ihrem Code zu tun: A im ersten Szenario (vor der Änderung, ohne „statisch“ verwendet wird), wäre es eine neue Uhr ein „neues Hallo“ jedes Mal machen heißt, aber B- im zweiten Szenario (nach der Änderung mit „statisch“), jede „neuer Hallo“ Instanz würde noch teilen und verwenden, um die Anfangs- und gleiche „Uhr“ erstellen hier zuerst.

Es sei denn, man benötigt „Uhr“ irgendwo außerhalb der Haupt, würde dies funktionieren genauso gut:

package hello;
public class Hello
{
    public static void main(String args[])
    {
      Clock clock=new Clock();
      clock.sayTime();    
    }
}

Das static Schlüsselwort bedeutet, dass etwas (ein Feld, Methode oder verschachtelte Klasse) mit dem verwandt Typ , anstatt eine bestimmte Instanz des Typs. So zum Beispiel, nennt man Math.sin(...) ohne Instanz der Klasse Math, und in der Tat Sie nicht erstellen eine Instanz der Klasse Math.

siehe

Weitere Informationen finden Sie im entsprechende Bit von Oracles Java Tutorial .


Nebenbei bemerkt

Java leider können Sie statische Member zuzugreifen, als ob sie beispielsweise Mitglieder waren, z.

// Bad code!
Thread.currentThread().sleep(5000);
someOtherThread.sleep(5000);

Das macht es aussehen als ob sleep ist eine Instanz-Methode, aber es ist eigentlich eine statische Methode - es immer Schlaf den aktuellen Thread macht. Es ist besser Praxis dies deutlich in dem anrufenden Code zu machen:

// Clearer
Thread.sleep(5000);

Das static Schlüsselwort in Java bedeutet, dass die Variable oder Funktion zwischen allen Instanzen dieser Klasse geteilt wird, wie es in den Typ gehört , nicht die eigentlichen Objekte selbst.

Wenn Sie also eine Variable: private static int i = 0; und Sie erhöhen sie (i++) in einem Fall, wird die Änderung in allen Fällen berücksichtigt werden. i wird nun 1 in allen Fällen sein.

Statische Methoden können ohne instanziieren ein Objekt verwendet werden.

Die grundsätzliche Verwendung von statischen Mitgliedern ...

public class Hello
{
    // value / method
    public static String staticValue;
    public String nonStaticValue;
}

class A
{
    Hello hello = new Hello();
    hello.staticValue = "abc";
    hello.nonStaticValue = "xyz";
}

class B
{
    Hello hello2 = new Hello(); // here staticValue = "abc"
    hello2.staticValue; // will have value of "abc"
    hello2.nonStaticValue; // will have value of null
}

Das ist, wie Sie in alle Klassenmitglieder ohne Absenden Klasseninstanz Hallo an andere Klasse gemeinsame Werte haben können. Und Whit statisch Sie brauchen keine Instanz der Klasse zu erstellen.

Hello hello = new Hello();
hello.staticValue = "abc";

Sie können nur statische Werte oder Methoden von Klassennamen nennen:

Hello.staticValue = "abc";

Static in Java:

Static ist eine Non Zugriffsmodifikator. Das Schlüsselwort static gehört zur Klasse als Instanz der Klasse. kann verwendet werden, um eine Variable oder Methode eine Klasse zu befestigen.

Static Schlüsselwort kann mit verwendet werden:

Methode

Variable

Klasse innerhalb einer anderen Klasse geschachtelt

Initialisierungsbaustein

nicht mit verwendet werden:

Klasse (nicht verschachtelt)

Constructor

Schnittstellen

Methode Lokale innere Klasse (Differenz dann verschachtelte Klasse)

Inner Klassenmethoden

Instanzvariablen

Lokale Variablen

Beispiel:

Stellen Sie sich das folgende Beispiel, die ein Instanzvariable count genannt hat, die in im Konstruktor erhöht:

package pkg;

class StaticExample {
    int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

Ausgang:

  

1 1 1

Da Instanzvariable den Speicher zum Zeitpunkt der Objekterstellung wird jedes Objekt wird die Kopie der Instanzvariable hat, wenn es erhöht wird, wird es nicht auf andere Objekte zu reflektieren.

Wenn wir jetzt die Variable count auf eine statische Instanz ändern ein, dann wird das Programm unterschiedliche Ausgabe erzeugen:

package pkg;

class StaticExample {
    static int count = 0;// will get memory when instance is created

    StaticExample() {
        count++;
        System.out.println(count);
    }

    public static void main(String args[]) {

        StaticExample c1 = new StaticExample();
        StaticExample c2 = new StaticExample();
        StaticExample c3 = new StaticExample();

    }
}

Ausgang:

  

1 2 3

In diesem Fall statische Variable wird nur einmal den Speicher erhalten, wenn jedes Objekt den Wert der statischen Variablen ändert, wird es seinen Wert behalten.

Static mit Final:

Die globale Variable, die als deklariert endgültig und statisch bleibt unverändert für die gesamte Ausführung. Da sind statische Elemente in der Klasse gespeichert und sie werden nur einmal in der gesamten Ausführung geladen. Sie sind für alle Objekte der Klasse üblich. Wenn Sie statische Variablen als final deklarieren, kann eines der Objekte ihren Wert nicht ändern, da es endgültig. Daher deklarierten Variablen als endgültig und statisch werden manchmal als Konstanten bezeichnet. Alle Felder von Schnittstellen sind als Konstanten bezeichnet, weil sie standardmäßig endgültig und statisch sind.

 image description hier

Bild Ressource: final static

Static bedeutet, dass Sie müssen nicht eine Instanz der Klasse erstellen, die Methoden oder Variablen mit der Klasse zugeordnet zu verwenden. In Ihrem Beispiel könnten Sie rufen:

Hello.main(new String[]()) //main(...) is declared as a static function in the Hello class

direkt, statt:

Hello h = new Hello();
h.main(new String[]()); //main(...) is a non-static function linked with the "h" variable

Aus dem Innern einer statischen Methode (das gehört zu einer Klasse) können Sie keine Mitglieder zugreifen, die nicht statisch sind, da ihre Werte auf Ihrem Instanziierung der Klasse abhängen. Ein nicht-statisches Clock-Objekt, das eine Instanz Mitglied ist, wäre für jede Instanz der Hallo-Klasse einen anderen Wert / Bezug hat, und deshalb könnte man es nicht aus dem statischen Teil der Klasse zugreifen.

Diese Diskussion hat bisher Classloader Überlegungen ignoriert. Streng genommen Java statische Felder sind geteilt zwischen allen Instanzen einer Klasse für einen bestimmten Classloader .

Um die bestehenden Antworten hinzufügen, lassen Sie mich mit einem Bild versuchen:

ein Zinssatz von 2% wird auf alle Sparkonten angelegt. Daher ist es statisch .

Ein Gleichgewicht sollte sein, einzelne , so dass es nicht statisch.

 image description hier

Ein Feld kann entweder die Klasse oder eine Instanz einer Klasse zugeordnet werden. Standardmäßig Felder sind Instanzvariablen. Durch die Verwendung von static das Feld eine Klassenvariable wird, so gibt es eine und nur eine clock. Wenn Sie eine Änderung an einem Ort machen, dann ist es überall sichtbar. Instanz varables sind unabhängig voneinander geändert werden.

Das Schlüsselwort static wird verwendet, um ein Feld oder ein Verfahren zu bezeichnen, als zugehörig zu der Klasse selbst und nicht die Instanz. Verwenden Sie den Code, wenn das Objekt Clock statisch ist, alle Instanzen der Hello Klasse teilt dieses Clock Datenelement (Feld) gemeinsam. Wenn Sie es nicht statisch machen, jede einzelne Instanz von Hello ein einzigartiges Clock Feld haben kann.

Das Problem ist, dass Sie eine main Methode Ihrer Klasse Hello hinzugefügt, so dass Sie den Code ausführen könnten. Das Problem hierbei ist, dass die main Methode ist statisch und als solches kann es nicht in der es zu nicht-statischen Feldern oder Methoden beziehen. Sie können dies auf zwei Arten lösen:

  1. Erstellen Sie alle Felder und Methoden der Hello Klasse statisch, so dass sie innerhalb der bezeichnet werden könnte main Methode. Das ist wirklich nicht eine gute Sache zu tun (oder der falsche Grund t ein Feld und / oder ein Verfahren statisch machen)
  2. Erstellen Sie eine Instanz Ihrer Hello Klasse im Hauptverfahren und Zugang zu allen seinen Feldern und Methoden, um die Art, wie sie in erster Linie bestimmt waren.

Für Sie bedeutet das die folgende Änderung an Ihrem Code:

package hello;

public class Hello {

    private Clock clock = new Clock();

    public Clock getClock() {
        return clock;
    }

    public static void main(String args[]) {
        Hello hello = new Hello();
        hello.getClock().sayTime();
    }
}

In Java kann das static Schlüsselwort einfach als Hinweis auf die folgende betrachtet werden:

  

„ohne Rücksicht oder Beziehung auf eine bestimmte Instanz“

Wenn Sie static auf diese Weise denken, wird es leichter, seine Verwendung in den verschiedenen Kontexten zu verstehen, in denen sie auftritt:

  • Ein static Feld ist ein Feld, das zu der Klasse gehört, anstatt auf eine bestimmte Instanz

  • Ein static Verfahren ist eine Methode, die keine Ahnung von this hat; es wird auf die Klasse definiert und weiß nicht, über eine bestimmte Instanz dieser Klasse, es sei denn ein Verweis auf sie übergeben wird

  • Ein static Mitglied Klasse ist eine verschachtelte Klasse ohne jede Vorstellung oder Kenntnis von einer Instanz von seiner umgebenden Klasse (es sei denn, ein Verweis auf eine umschließende Klasseninstanz wird an sie übergeben)

Static macht das Taktelement ein Klassenmitglied anstelle eines Instanzenmitglied. Ohne das Schlüsselwort static müssen Sie eine Instanz der Hallo-Klasse (die ein Taktmembervariable hat) - z. B.

Hello hello = new Hello();
hello.clock.sayTime();

statische Methoden verwenden keine Instanzvariablen der Klasse, die sie in definiert sind. Eine sehr gute Erklärung des Unterschieds kann auf diese Seite

Ich habe eine Vorliebe für statische Methoden entwickelt (nur, wenn möglich) in „Helfer“ Klassen.

Die Berufung Klasse muss nicht ein anderes Mitglied (Instanz) Variable der Hilfsklasse erstellen. Sie rufen die Methoden der Hilfsklasse. Auch die Hilfsklasse wird verbessert, weil Sie nicht mehr einen Konstruktor benötigen, und Sie müssen kein Element (Beispiel) Variablen.

Es gibt wahrscheinlich auch andere Vorteile.

Kann denkt auch an statischen Mitgliedern nicht einen „diesen“ Zeiger haben. Sie werden von allen Instanzen gemeinsam genutzt.

Das Verständnis Statische Konzepte

public class StaticPractise1 {
    public static void main(String[] args) {
        StaticPractise2 staticPractise2 = new StaticPractise2();
        staticPractise2.printUddhav(); //true
        StaticPractise2.printUddhav(); /* false, because printUddhav() is although inside StaticPractise2, but it is where exactly depends on PC program counter on runtime. */

        StaticPractise2.printUddhavsStatic1(); //true
        staticPractise2.printUddhavsStatic1(); /*false, because, when staticPractise2 is blueprinted, it tracks everything other than static  things and it organizes in its own heap. So, class static methods, object can't reference */

    }
}

Second Class

public class StaticPractise2 {
    public static void printUddhavsStatic1() {
        System.out.println("Uddhav");
    }

    public void printUddhav() {
        System.out.println("Uddhav");
    }
}
//Here is an example 

public class StaticClass 
{
    static int version;
    public void printVersion() {
         System.out.println(version);
    }
}

public class MainClass 
{
    public static void main(String args[]) {  
        StaticClass staticVar1 = new StaticClass();
        staticVar1.version = 10;
        staticVar1.printVersion() // Output 10

        StaticClass staticVar2 = new StaticClass();
        staticVar2.printVersion() // Output 10
        staticVar2.version = 20;
        staticVar2.printVersion() // Output 20
        staticVar1.printVersion() // Output 20
    }
}

main() ist eine statische Methode, die zwei grundlegende Einschränkungen hat:

  1. Die statische Methode kann keine nicht-statisches Datenelement verwenden oder direkt aufrufen nicht-statische Methode.
  2. this() und super() kann nicht in statischen Kontext verwendet werden.

    class A {  
        int a = 40; //non static
        public static void main(String args[]) {  
            System.out.println(a);  
        }  
    }
    
  

Ausgabe: Compile Zeitfehler

Statische Variablen können nur nur in statischen Methoden zugegriffen werden, so dass, wenn wir die statischen Variablen diese Getter und Setter-Methoden deklarieren werden statische Methoden sein

statische Methoden ist eine Klassenstufe wir Klassennamen zugreifen können mit

Hier finden Sie Beispiel für statische Variablen Getter und Setter:

public class Static 
{

    private static String owner;
    private static int rent;
    private String car;
    public String getCar() {
        return car;
    }
    public void setCar(String car) {
        this.car = car;
    }
    public static int getRent() {
        return rent;
    }
    public static void setRent(int rent) {
        Static.rent = rent;
    }
    public static String getOwner() {
        return owner;
    }

    public static void setOwner(String owner) {
        Static.owner = owner;
    }

}
  

Wenn einige Projekt laufen zunächst laden statische Dinge (Variablen, Methoden, Blöcke ..).

Wenn dieses Projekt Hauptmethode Last zuerst ausgeführt. Weil sein static method. Dann ist es Aufgabe "a" object aussehen .aber noch ein nicht definieren Objekt. Wegen seiner nicht statisch. Dann kommen wie dieser Fehler.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top