OK Ich lerne OOP im Moment, und es gibt ein paar Dinge, die ich nicht verstehe. Zum Beispiel habe ich eine Klasse namens PersonProgram, die mein Haupt enthält. Ich habe mehrere Methoden und Funktionen außerhalb meiner Hauptmethode innerhalb der Klasse. Warum kann ich diese Methoden und Funktionen nicht aus dem main aufrufen, ohne ein neues Objekt der Klasse zu erstellen? Da sie alle in der gleichen Klasse sind, warum macht es keinen Sinn, sie einfach wie jede andere Methode ohne
PersonProgram p = new PersonProgram(); zuerst?Warum muss ich eine Instanz der Klasse erstellen, in der ich arbeite?
Antwort
Warum kann ich diese Methoden und Funktionen nicht aus dem Haupt aufrufen, ohne ein neues Objekt der Klasse zu erstellen?
Weil sie nicht static
sind Sie haben eine Instanz zu schaffen, um sie zu nutzen. Fügen Sie den Modifizierer hinzu, damit Sie darauf zugreifen können. Zum Beispiel
private static getSomething()
Und dann rufen sie aus dem Haupt als:
getSomething()
auch darauf achten, was der allmächtige @JonSkeet sagte in den Kommentaren.
Dies ist im Wesentlichen, weil Sie mehrere Instanzen der gleichen Klasse haben könnten.
Dog bigDog = new Dog();
Dog littleDog = new Dog();
Was nun, wenn Sie den Namen Ihres Hundes wissen wollten? Dog.GetName();
, richtig? Welcher Hund würde das zurückkehren? Dies müssen Sie dem Compiler mitteilen, indem Sie die Funktion für eine Instanz der Klasse aufrufen.
bigDog.GetName();
Wenn Sie mehr als 2 Personen in Ihrem Produkt zu handhaben wollen, dann mit Ihnen zu tun,
PersonProgram p1 = new PersonProgram();// Have p1.name="First person"
PersonProgram p2 = new PersonProgram();// Have p2.name="Second person"
so weiter ...
Wenn Sie wissen, nur eine Person gibt, dann ist Sie können eine statische Klasse erstellen, und Sie müssen kein neues Objekt erstellen und direkt verwenden, ohne eine Instanz zu erstellen.
so OOP gibt Ihnen beide Option, wählen Sie eine, die Sie entspricht.
Verstehen, dass die treibende Kraft hinter der Erstellung von Object Oriented Programming
ist, Speicher/Daten mit den Operationen zu koppeln, die darauf ausgeführt werden können. In OOP sind Objekte meistens dazu gedacht, Dienste für die Daten bereitzustellen, die sie enthalten, während statische Methoden grundsätzlich für zustandslose Prozesse vorgesehen sind.
Die kurze Antwort: Weil die Hauptmethode ist statische, was bedeutet, dass es zu der Klasse und nicht ein bestimmtes Objekt gehört. Statische Kontexte können nicht auf nicht statische Kontexte verweisen, da keine Referenz für ein bestimmtes Objekt vorhanden ist.
Aber Sie könnten auch alle anderen Variablen und Methoden static
auch machen, und dort, Problem gelöst, oder?
Nein. Tun Sie das nicht.
Die lange Antwort:
Die wichtigste Methode ist static
, weil keiner von Ihrer Anwendung benutzerdefinierten definierten Objekte vorhanden sein, bevor seine gestartet. Schließlich kann man in einem Raum nicht existieren, bevor das Zimmer existiert. Die JVM benötigt jedoch einen Einstiegspunkt für Ihr Programm, daher muss die Hauptmethode frei von allen Objektreferenzen sein, daher static
.
Java ruft PersonProgram.main(args)
auf, sobald Ihre Anwendung gestartet wird. Nehmen wir an, Sie haben definiert, was eine "Person" in Ihrer Klasse PersonProgram
ist. Vielleicht hat eine PersonProgram
einen Namen, ein Alter usw. Aber Sie haben noch keine PersonProgram
Objekte, also wie weiß die main
Methode, mit welchem Namen oder Alter sie arbeiten soll?
Hier ist eine Möglichkeit, die Dinge für Sie klarer zu machen: Machen Sie eine neue Klasse namens Application
und legen Sie nur Ihre Hauptmethode darin. Versuchen Sie nun, auf die Instanzvariablen PersonProgram
zu verweisen. Sie können das erst, wenn Sie zuerst ein Objekt PersonProgram
erstellen.
Sie haben gerade begonnen, OOP-Konzepte zu lernen, und die Idee, die main
-Methode in Ihre Klassendefinitionen zu übernehmen, kann verwirrend werden. Es macht es einfacher zu lernen, zu programmieren, aber Sie sollten versuchen, Ihre main
Methode von Ihrer Klassenlogik getrennt zu halten, während Sie versuchen, OOP-Prinzipien zu lernen.
Das hat sehr geholfen, danke. –
Grund OOP Regel:
Eine Klasse macht seine nicht-privaten, nicht-statischen Mitglieder nur über sein instanzierte Objekt.
Dies gilt auch, wenn die Mitglieder von der gleichen Klasse angefordert werden. Sie können jedoch auch auf private Mitglieder Ihrer Klasse zugreifen.
Um zu verwenden, müssen Sie die Methode statisch machen.
- 1. Muss ich jede Instanz der neuen Klasse zerstören?
- 2. Wie kann ich Instanz der HttpRequestHeaders Klasse erstellen
- 3. Eine Instanz für Klasse erstellen?
- 4. Warum Java erlaubt nicht Instanz der inneren Klasse zu erstellen?
- 5. Warum muss ich in MFC eine globale Instanz von CWinApp erstellen?
- 6. Wissen, wann eine Instanz der Klasse erstellt werden muss, anstatt eine Unterklasse zu erstellen?
- 7. Wie kann ich eine neue Instanz einer Klasse erstellen?
- 8. Wie erstelle ich eine Instanz einer Klasse?
- 9. Muss ich eine Instanz einer Klasse erstellen, um ihr einen Delegaten zuzuordnen?
- 10. Wie wird eine Instanz der Konfiguration beim Erstellen der Instanz der eingefügten Klasse injiziert?
- 11. Instanz der generischen Klasse durch Reflektion erstellen
- 12. Kann ich in Java eine Instanz einer Unterklasse "basierend auf" einer Instanz der Oberklasse erstellen?
- 13. Wie kann ich eine neue Instanz der Schnittstelle erstellen Microsoft.Office.Interop.Word.Application
- 14. Eine Instanz von einer Instanz einer Klasse in PHP erstellen?
- 15. Warum wird der Kopierkonstruktor aufgerufen, wenn ich keine Instanz der Klasse überlasse?
- 16. Coffeescript: Instanz der Klasse dynamisch erstellen Eine Methode wird aufgerufen
- 17. Ich arbeite mit statischen Daten, muss meine Anwendung eine Datenbank erstellen?
- 18. Öffentliche Instanz der privaten inneren Klasse in Kotlin erstellen
- 19. Wie referenziere ich die Instanz der äußeren Klasse in Kotlin?
- 20. Der Designer muss eine Instanz erstellen ... kann nicht, weil der Typ als abstrakt deklariert wird
- 21. Speichern der Instanz der Klasse in onSavedInstance()
- 22. Warum muss ich Clone überschreiben, wenn ich klonbare Klasse möchte?
- 23. Muss ich eine Instanz von Long erstellen, um ein Long als Parameter zu senden?
- 24. Warum muss ich den Konstruktor der Oberklasse aufrufen, wenn ich das der Unterklasse definiere?
- 25. Es scheint, dass ich eine Eigenschaft für eine Klasse direkt von der Instanz in PHP erstellen kann?
- 26. Ich arbeite an Angular2 Projekt und muss über Routing wissen
- 27. Warum muss ich [ProtoInclude] verwenden?
- 28. Warum kann ich nicht mehr als eine Instanz meiner Klasse erstellen?
- 29. Warum muss ich eine geschachtelte Klasse in die definierte Klasse importieren?
- 30. Warum muss ich eine Grammatik umschreiben?
Nun, wenn sie Instanzmethoden sind, müssen sie auf einer Instanz operieren. Die 'main'-Methode ist statisch - sie * * operiert nicht auf einer Instanz. Entweder sind Ihre Methoden nicht vom Instanzzustand abhängig, in diesem Fall sollten sie * möglicherweise * statisch sein oder sie tun, in welchem Fall es sicherlich sinnvoll ist, eine Instanz zu erstellen. –
Es macht keinen Sinn, das Objekt zuerst zu erstellen, denn so funktioniert OOP – Jayfray
Dies war auch meine allererste Frage, als ich anfing, Java zu lernen: Warum in der Welt brauche ich eine Klasse, um "Hello, World!" ? Freut mich zu wissen, dass ich nicht der Einzige bin, der sich fragt. –