2017-01-23 1 views
5

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?

+9

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. –

+0

Es macht keinen Sinn, das Objekt zuerst zu erstellen, denn so funktioniert OOP – Jayfray

+0

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. –

Antwort

4

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.

0

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

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.

0

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.

1

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.

+0

Das hat sehr geholfen, danke. –

0

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.

Verwandte Themen