[JAVA] Objektorientierung: Zugriff außerhalb der main-Methode

Du kannst mit Sixherheit auch eine Ausgabemethode in dee main noch definieren, aber für mich macht das keinen Sinn. Aber mal als Beispiel:

[src=java]
public static void printPersonName(Person x)
{
System.out.println(x.getName());
}
[/src]

Das sollte funktionieren. In der main ruft man dann printPersonName(p) nach der Deklaration von p auf.

MfG
Mr. J
 
Dann ist die Aufgabenstellung Müll. Was da dann gefordert wird ist programmiertechnischer Rotz.

MfG
Mr. J
 
Ich unterstelle mal, daß man das in Java auch so lösen könnte:

[src=java]package beispiel;

public class Interface {

Person p;
public static void main(String[] args) {

p = new Person("feuerteufel");

}

private void printname(){
System.out.println(p.getName());
}
}

}
[/src]
 
Mr_J:
Wäre ich nicht so schnell mit einer Beurteilung.
Die eigentliche Aufgabenstellung ist unbekannt, ebenso was durch sie vermittelt werden soll.

Bangen um die Klausurzulassung, weil die Bedingungen so hart sind.
Über die Bedingungen weiß ich nichts, aber was du uns fragt sehe ich durchaus auf der Ebene von Klausurzulassung.



Da es diverse Möglichkeiten gibt ist es meiner Meinung nach jetzt an feuerteufel ausführlicher auf die Antworten einzugehen und nochmal Code zu liefern oder die genaue Aufgabenstellung.
 
  • Thread Starter Thread Starter
  • #26
Hallo,

tut mir leid dafür, dass ich nicht geantwortet habe, aber ich habe auf eine Antwort von meinem Tutor gewartet.

Also ich zeige euch im folgenden noch ein kommentiertes Beispiel, das sehr nah ist an dem, was ich machen soll.

Geht dabei bitte weg von dem Gedanken eines Personenverzeichnisses.

Folgendes soll realisiert werden:


UI.class

[src=java]package example;

public class UI {
public static void main(String[] args){
Person p = new Person();
p.setname("Name"); // Name wird per scanner eingelesen.
}


public void printall(){
// Hier werden alle getter aufgerufen. funktion ist vorgegeben, es muss so gemacht werden

p.getname();
}
}[/src]


Person.class

[src=java]package example;

public class Person {

private String name;
private int id; // id und con werden auch per getter zurückgegeben
private int con;

public Person(){
this.id = 1;
this.con = 20; // Hier kommen festgelegte Werte rein, die der Benutzer nicht übergeben muss -> Von Programmierer vorgegeben
}

public void setname(String n){
this.name = n;
}

public String getname(){
return this.name;
}

//... weitere getter
}
[/src]


Das kann ja nicht funktionieren, weil p nur in der main existiert.
Deshalb dachte ich mir, dass ich folgendes mache:


[src=java]package example;

public class UI {
static Person p = new Person();
public static void main(String[] args){

p.setname("Name"); // Name wird per scanner eingelesen.
}


public void printall(){
// Hier werden alle getter aufgerufen. funktion ist vorgegeben, es muss so gemacht werden

p.getname();
}
}[/src]

Wie man sehen kann wurde p vor der main deklariert.

Laut Tutor ist das aber falsch, weil ich die Objekte erst dann initialisieren soll, wenn ich sie brauche und nicht davor.

Ich hoffe, dass das jetzt verständlicher ist.

Viele Grüße
feuerteufel
 
Sollte aber unproblematisch sein. Man kann das Objekt p ja deklarieren ohne es zu initialisieren. Also einfach:

[src=java]
Person p;
[/src]

In der main selbst kann man p dann initialisieren.

[src=java]
p = new Person("feuerteufel");
[/src]

Allerdings halte ich es immer noch für absoluten Schwachsinn weitere Methoden in der main-Klasse zu schreiben...

MfG
Mr. J
 
jetzt schaust du dir noch die Postings #19 und #24 an und postet deine Lösung


Sollte aber unproblematisch sein. Man kann das Objekt p ja deklarieren ohne es zu initialisieren. Also einfach:In der main selbst kann man p dann initialisieren.


aber nicht direkt in der main() sondern im Konstruktor (das ist der Hacken) der Klasse UI,


Allerdings halte ich es immer noch für absoluten Schwachsinn weitere Methoden in der main-Klasse zu schreiben...

ja aber kennst du die ganze Aufgabe?

Es ist ein Minimalbeispiel. Ich kann mich daran erinnern, dass man anfangs nicht umedingt eine extra Klasse hat in der sich nur die main() befindet. Man schreibt sie dort rein, wo man sein Programm starten will und fertig. Später wenn man mit mehr als 5 Klassen arbeitet oder so, merkt man, dass man die main Funktion suchen muss. Aus diesem Grund legt man, dann eine extra Klasse an. Aber bei zwei, drei Klassen kann man sich diese sparen.

@feuerzeug

dafür steinigt dich dein Prof
[src=java]Person p;[/src]

wieso?
weil private fehlt

dafür steinigt er dich gleich zweimal
[src=java] static Person p = new Person();[/src]
wieso?
weil private fehlt
und weil static davor steht
und vllt noch ein drittes Mal, weil du die Initalisierung nicht im Konstruktor durchführst
und vllt noch einmal weil du keine eindeutigen Variablennamen verwendet hast.
bzw. für den Klassennamen UI und die anderen Bezeichner jeweils noch einmal
 
Zuletzt bearbeitet:
Also ich zeige euch im folgenden noch ein kommentiertes Beispiel, das sehr nah ist an dem, was ich machen soll.
Ich kann in deinem letzten Beitrag keine Frage sehen. Lautet die Frage "Könnt ihr mir bitte das machen was ich eigentlich als Hausaufgabe für die Klausurzulassung machen muss?"
Von dem was du bisher geliefert hast würde ich sagen du solltest die Klausurzulassung nicht kriegen.
 
  • Thread Starter Thread Starter
  • #30
Sollte aber unproblematisch sein. Man kann das Objekt p ja deklarieren ohne es zu initialisieren.

Ist aber nicht im Sinne von der Objektorientierung, oder?

jetzt schaust du dir noch die Postings #19 und #24 an und postet deine Lösung

Nunja ich bin jetzt auf die Idee gekommen das Objekte/ die Objekte in einer Liste zu speichern und dann per get() aufzurufen.

Dadurch würden dann zum Beispiel die Probleme entfallen, dass Person p static ist, die Initialisierung außerhalb der main() erfolgt usw.

Dachte mir, dass das dann so in etwa aussehen könnte:

[src=java]package example;

import java.util.ArrayList;
import java.util.List;

public class UI {

private static List<Person> personList= new ArrayList<Person>();

public static void main(String[] args){
Person p = new Person();
p.setname("Name"); // Name wird per scanner eingelesen.
personList.add(p);

printall();
}

public static void printall(){
// Hier werden alle getter aufgerufen. funktion ist vorgegeben, es muss so gemacht werden
Person object = personList.get(0);
object.getname();
}
}[/src]

Der Haken ist dann in der Ausgabe. Ich vermute mal, dass dieses object.getname(); nicht so funktioniert wie ich mir gedacht habe.

j
Es ist ein Minimalbeispiel. Ich kann mich daran erinnern, dass man anfangs nicht umedingt eine extra Klasse hat in der sich nur die main() befindet. Man schreibt sie dort rein, wo man sein Programm starten will und fertig. Später wenn man mit mehr als 5 Klassen arbeitet oder so, merkt man, dass man die main Funktion suchen muss. Aus diesem Grund legt man, dann eine extra Klasse an. Aber bei zwei, drei Klassen kann man sich diese sparen.

Ja genau so ist das in diesem Fall. Es sind weitere Methoden vorgegeben. Jedoch hat der Professor selbst gesagt, dass man später so programmiert, dass man nur eine main() in einer Klasse hat und das wars.

Ich kann in deinem letzten Beitrag keine Frage sehen. Lautet die Frage "Könnt ihr mir bitte das machen was ich eigentlich als Hausaufgabe für die Klausurzulassung machen muss?"

Nein. Einen Hinweis geben, weil Learning-by-doing bei mir schon immer gut geklappt hat.
Wenn Du noch etwas sagen möchtest, dass nicht zum Thema beiträgt, dann schreibe mir eine PN. Wir können das dann gerne ausdiskutieren.
 
hast du dir die Beiträge #19 und #24 angeschaut? da steht alles drin

langsam verwendest du immer mehr static und das ist der falsche Weg

[src=java]public class Prog{
private Person p;

public Prog()
{
p = new Person();
}



// wie heißt die Methode ? printname oder printAll ?
public void printAll (){
System.out.println("Vorname " + p.getVorname() + " Nachname " + p.Nachname());
}

public static void main(String[] args){

Prog prog = new Prog();
prog.printAll ();

}
}[/src]
 
Zuletzt bearbeitet:
  • Thread Starter Thread Starter
  • #32
Okay, da oben hat in der Zeile 21 das System.out.print(); gefehlt deshalb der Fehler.

[src=java]package example;

public class UI {

private Person p;

public UI() {
p = new Person();
}

public static void main(String[] args) {
UI p = new UI();
p.printall();
}

public void printall() {
System.out.println(p.getname());
}
}[/src]

Wäre demnach das einzig richtige?

Also lege ich durch public UI() ein Objekt p an, dass seine Gültigkeit auch außerhalb der main() hat. Damit kann ich dann die anderen Mehoden aufrufen.

Es wird aber erst durch
Code:
Expand Collapse Copy
UI p = new UI();
angelegt. Die Beziehungen lassen sich ja in der Eclipse nachverfolgen.

Man könnte dann doch auch public UI() als private setzen, oder?
 
Wäre demnach das einzig richtige?

du hast uns nicht alle Unterlagen zur Verfügung gestellt. Da kann man halt nichts garantieren. Heute hast du noch "Scanner" erwähnt. Also könnte es sein, dass du da noch einiges anpassen musst, wenn man mehrere "Personen" einlesen soll

Um was handelt es sich den bei

[src=java] public UI() { ... }

public Person() {.... }[/src]

Man könnte dann doch auch public UI() als private setzen, oder?

ja kann man machen. Was bringt dir das? Du kannst ja mal folgnde Änderung machen:

[src=java]
// aus public -> private
private Person() {.... }[/src]

Was passiert dann?
Der Konstruktor ist nur noch innerhalb der eigenen Klasse sichtbar. Also kannst du außerhalb keine Objekte mehr erzeugen

Axo und positioniere die main() als letztes innerhalb der Klasse. Du solltest halt die Sachen, die Zusammengehören Gruppieren. Also erst alle Instanzvariablen, Konstrutoren, getter, setter und ähnliches und zum Schluss statische Methoden.

und UI p = new UI(); <-- eindeutige oder bessere Bezeichner solltest du auch verwenden.
 
Zuletzt bearbeitet:
Ich nehme alles zurück und verweise aus #32
 
Zuletzt bearbeitet:
@accC
Ich bin nun kein Java-Experte, aber du hast doch einen Bug drin. Wo soll denn die statische main() ein this herkriegen?
 
Zuletzt bearbeitet:
private Person p = null; // Initialisierung sollte man im Konstruktor machen und nicht außerhalb. Sobald man mehr als einen Konstruktor hat...

this.p = new Person(); // in einer statischen Methode kann man nicht auf die Instanzvariablen (hier p) des Objektes (der Klasse UI) zugreifen. Woher soll der den wissen um welches Objekt der Klasse UI es sich gerade handelt?

außerdem ist wohl #32 die richtige Lösung (ausgehend der Infromationen, die hier vorliegen)
 
@Brother John, evillive: In der Tat, daran habe ich gar nicht gedacht.
 
Allerdings ist die Benennung der Variablen etwas ungeschickt wenn sowohl die Person als auch die UI jeweils p heißen.

MfG
Mr. J
 
  • Thread Starter Thread Starter
  • #39
Hi,

ich habe jetzt das was evillive mir an Hinweisen gegeben hat auf meine Aufgabe angewandt und es funktioniert alles wunderbar. :T

Zu den Variablennamen und Klassennamen möchte ich anmerken, dass ich natürlich sinnvollere benutzt habe.

Danke für eure Hilfe und vor allem für eure Geduld mit mir. :)
 
Zurück
Oben