• Hallo liebe Userinnen und User,

    nach bereits längeren Planungen und Vorbereitungen sind wir nun von vBulletin auf Xenforo umgestiegen. Die Umstellung musste leider aufgrund der Serverprobleme der letzten Tage notgedrungen vorverlegt werden. Das neue Forum ist soweit voll funktionsfähig, allerdings sind noch nicht alle der gewohnten Funktionen vorhanden. Nach Möglichkeit werden wir sie in den nächsten Wochen nachrüsten. Dafür sollte es nun einige der Probleme lösen, die wir in den letzten Tagen, Wochen und Monaten hatten. Auch der Server ist nun potenter als bei unserem alten Hoster, wodurch wir nun langfristig den Tank mit Bytes vollgetankt haben.

    Anfangs mag die neue Boardsoftware etwas ungewohnt sein, aber man findet sich recht schnell ein. Wir wissen, dass ihr alle Gewohnheitstiere seid, aber gebt dem neuen Board eine Chance.
    Sollte etwas der neuen oder auch gewohnten Funktionen unklar sein, könnt ihr den "Wo issn da der Button zu"-Thread im Feedback nutzen. Bugs meldet ihr bitte im Bugtracker, es wird sicher welche geben die uns noch nicht aufgefallen sind. Ich werde das dann versuchen, halbwegs im Startbeitrag übersichtlich zu halten, was an Arbeit noch aussteht.

    Neu ist, dass die Boardsoftware deutlich besser für Mobiltelefone und diverse Endgeräte geeignet ist und nun auch im mobilen Style alle Funktionen verfügbar sind. Am Desktop findet ihr oben rechts sowohl den Umschalter zwischen hellem und dunklem Style. Am Handy ist der Hell-/Dunkelschalter am Ende der Seite. Damit sollte zukünftig jeder sein Board so konfigurieren können, wie es ihm am liebsten ist.


    Die restlichen Funktionen sollten eigentlich soweit wie gewohnt funktionieren. Einfach mal ein wenig damit spielen oder bei Unklarheiten im Thread nachfragen. Viel Spaß im ngb 2.0.

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

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
Hallo,

wir sind im Studium bei der Objektorientierung angelangt.
Nun haben wir eine Programmieraufgabe bekommen und ich habe Probleme beim Zugriff auf Methoden mit Objekten, die in der main-Methode initialisiert wurden.

Ich habe folgende Klasse mit der main-Funktion:

[src=java]
package beispiel;

public class Interface {

public static void main(String[] args) {

Person p = new Person("feuerteufel");

}

private void printname(){
System.out.println(p.getName());
}
}
[/src]

Dann habe ich noch eine Klasse, in der das Objekt angelegt wird und die Funktion
zur Namensausgabe [src=java]getName()[/src] liegt:

[src=java]

package beispiel;

public class Person {

private String name;
private int id;


public Person(String name) {
this.name = name;
this.id = 1;
}

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

[/src]


Wieso funktioniert das nicht?

Wenn ich [src=java]Person p = new Person("feuerteufel");[/src] außerhalb der main-Funktion
schreibe, meckert er nicht rum.

Anmerkung: Das ist nicht der Code, den ich programmiere, sondern nur ein Code, der mein Problem beschreibt und da auch nur ein Teil davon.

Dann habe ich noch eine andere Frage: Wann benutze ich am besten private wann final bei Variablen?

Freue mich über jede Antwort, die mich weiterbringt. :)
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Puh....
es ist doch schon Ende des Semesters..

Wo 'lebt' p denn?
Willst du printname() gar nicht aufrufen?
private: Das ist alles was die Klasse intern verwendet und für die Verwendung der Klasse nicht erforderlich ist. Typischerweise sind das alle Attribute (dafür gibts getter/setter) und ein Teil der Methoden mit der die Klasse interne Berechnungen vornimmt.

Dann habe ich noch eine Klasse, in der das Objekt angelegt wird
In der Klasse wird nicht ein Objekt der Klasse angelegt. Du definierst die Klasse und in der main erzeugst du ein Objekt dieser Klasse.
 

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
  • Thread Starter Thread Starter
  • #3
Hi,

Puh....
es ist doch schon Ende des Semesters..

Bei mir leider nicht. Noch zwei Wochen und das Bangen um die Klausurzulassung, weil die Bedingungen so hart sind. :( Aber egal.

Wo 'lebt' p denn?

Das verstehe ich leider nicht.

Die Funktion printname() will ich in einer anderen Klasse aufrufen. Wie gesagt das ist alles nur beispielhaft und sieht in dem Code, den ich programmieren soll anders aus. Soll jetzt nur ein vereinfachtes Beispiel sein, das mein Problem beschreibt.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
@feuerteufel:

wo lebt p?

Antwort innerhalb der Klammern { } in dennen du das Objekt erzeugt hast. Wenn du es außerhalb verwenden willst musst du p als Parameter übergeben. Das ist der erste Schritt zur Lösung.

Was ist das den für ein Klassenname? Such dir einen besseren Bezeichner


[src=java]
public class Interface {[/src]

der nächste Schritt und damit dein nächstes Problem ist wie rufe ich printname() auf? Hier gäbe es zwei Möglichkeiten.

Die Funktion printname() will ich in einer anderen Klasse aufrufen.

in welcher Klasse?
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Ende der Vorlesungszeit, meinte ich.
Was sind denn lokale Variablen?


Ich möchte noch ein halbwegs sinnvolles Beispiel für private Methoden und Attribute anbieten.
Deine Klasse Person hat ja das Attribut "id". Typisch wäre die Id im Konstruktor irgendwie zu generieren und einen getter, aber keinen setter dafür anbieten. Aber angenommen, aus irgendeinem Grund soll es möglich sein die Id nachträglich zu ändern. Dann ist es sicherlich wünschenswert das nicht die neue Id schon längst an eine andere Person vergeben ist. Deswegen ist das Attribut id private und du bietest einen public setter an, der aber prüft ob die Id nicht schon vergeben ist.
Die Klasse verwaltet dazu (code fehlt unten) eine Liste mit allen Personen und die Methode isUnique überprüft damit ob die gewollte Id schon vergeben ist oder nicht. Diese Methode ist aber uninteressant für die Verwendung der Klasse, deswegen ist sie private.

[src=java]
package beispiel;

public class Person {

private String name;
private int id;
private static Collection<Person> personList;

private boolean isUnique(int id) {
for(Person p: personList)
if(p.getId() == id) return false;
return true;
}

public Person(String name) {
this.name = name;
this.id = 1;
}

public String getName(){
return this.name;
}
public void setId(int id) {
if(isUnique(id)) this.id = id;
}
[/src]
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
Zur ID ein Tipp

[src=java]private String name;
private static int ID = 1;
private int id;


public Person(String name) {
this.name = name;
this.id = ID++;
}[/src]
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Aber keine Zuweisung ohne Prüfung auf Einzigartigkeit wenn es einen setter gibt für die Id ;-).
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
das ist aber eine böse Methode

[src=java] public void setId(int id) {
if(isUnique(id)) this.id = id;
}
[/src]

Why?
Ich rufe sie auf und will die auf 1 setzen. Die im if-Ausdruck habe ich aber ein false. Da aber nichts passiert gehe ich davon aus, dass er es auf 1 gesetzt hat.

Also entweder Exception werfen oder true oder false zurück geben.

if(isUnique(id))
{
this.id = id;
return true;
} else {
return false;
}
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Nunja, der Designflaw besteht imo darin, dass überhaupt eine Setter Methode für die Id angeboten wird, was natürlich Absicht war um auf das bestehende Beispiel zurückgreifen zu können.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
Hallo,
Dann habe ich noch eine andere Frage: Wann benutze ich am besten private wann final bei Variablen?

Also wenn du es vor eine primitive Variable (int, char, ... ) schreibst, dann ist der Wert den du der Variable zuweist schreibgeschützt. Also eine Konstante

private -> Geheimnisprinzip. Variable oder Methode ist innerhalb der Klasse sichtbar. Wenn später Vererbung ins Spiel kommt, dann kannst du protected verwenden, damit diese auch in den abgeleiteten Klassen sichtbar sind. Aber man sollte sich an das Geheimnisprinzip halten und möglichst private verwenden. Dann kannst du entscheiden ob du den Inhalt der Variable verändern lassen willst -> setter-Methode schreiben. Wenn du den "sichtbar" machen willst damit die Eigenschaft des Objektes ausgelesen werden kann -> getter Methode schreiben.

Bei den setter Methoden kannst du noch Vorbedinungen stellen. Ein Beispiel hat dir BurnerR mit if(isUnique()) bereits gegeben.
 

Mr_J

Neu angemeldet

Registriert
14 Juli 2013
Beiträge
991
Was für eine IDE wird für den Code denn verwendet? Ich würde Eclipse empfehlen, da man dort relativ viel Hilfe kriegt was man falsch macht.

MfG
Mr. J
 

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
  • Thread Starter Thread Starter
  • #12
Hey,

danke für eure zahlreichen Antworten!

Also private sind alle Variablen, die man nur innerhalb der Klasse benutzen möchte und die auch nur dort sichtbar sein sollen.
Ich kriege manchmal die Meldung, dass nur "final" erlaubt ist - wieso?

Euren Antworten nach zu urteilen habe ich zwei Möglichkeiten für die Lösung meines Problems:

1. Das Objekt außerhalb der main-Methode anlegen. Dann ist es sichtbar in der ganzen Klasse (bitte bestätigen oder mich berichtigen)
2. Den Objektnamen per Parameter an die Methode übergeben. Was für mich leider nicht so hilfreich ist, weil alle Methoden vorgegeben sind und nicht verändert werden dürfen.

Die IDE die benutzt wird ist Eclipse. :)
 

BurnerR

Bot #0384479

Registriert
20 Juli 2013
Beiträge
5.507
Es wäre allerdings schön, wenn du vorher Google benutzt bevor du hier fragst und das durchscheinen lässt durch gute Fragen die Vorkenntnisse deutlich machen.
Darüber hinaus werden solche Fragen "nur final erlaubt" als unhöflich erachtet, weil die Informationen meist nicht ausreichen für eine Frage, man dir also mehr Infos aus der Nase ziehen muss oder herumraten, was als unangemessen angesehen wird da du derjenige bist der etwas haben möchte.
Möglichkeiten: Minimalbeispiel, welches den Fehler reproduziert, das ist am besten. Mindestens die genaue Fehlermeldung und besser noch mit Code wo der Fehler auftritt.


Ich kriege manchmal die Meldung, dass nur "final" erlaubt ist - wieso?
1. Vermutung: Anonyme Klasse. Google, wie gesagt.
 
Zuletzt bearbeitet:

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
zu final ??? Ohne Beispiel kann man nur Vermutungen anstellen. Vllt meinst du static?

1. Das Objekt außerhalb der main-Methode anlegen. Dann ist es sichtbar in der ganzen Klasse (bitte bestätigen oder mich berichtigen)

Dir ist bestimmt schon aufgefallen, dass es Methoden gibt bei dennen static davor steht? Diese kannst du aufrufen ohne ein Objekt von der Klasse erstellen zu müssen. In dennen sind die Datenfelder der Klasse nicht sichtbar.
 

Mr_J

Neu angemeldet

Registriert
14 Juli 2013
Beiträge
991
Konkreter Code, Fehlermeldungen, Screenshots wären hilfreich. Ich erkenne die Probleme nicht.

MfG
Mr. J
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
das Problem ist simpel

Diese Methode hier muss aufgerufen werden. Das Objekt p gibt es aber nicht. Signatur der Methode darf nicht geändert werden. Da hier aber ein Minimalbeispiel gepostet wurde kann man nicht sagen was wohin gehört.

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

Mr_J

Neu angemeldet

Registriert
14 Juli 2013
Beiträge
991
Okay,
bringen wir mal etwas Ordnung ins Chaos. Du hast also ein Object in einer eigenen Klasse und dann noch das eigentliche Hauptprogramm.

Hauptprogramm:
[src=java]
package beispiel;

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

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


Person Klasse
[src=java]

package beispiel;

public class Person
{
private String name;
private int id;

public Person(String name)
{
this.name = name;
this.id = 1;
}

public String getName()
{
return this.name;
}
}
[/src]

Nun geht das Programm wie folgt vor:
1. In der main wird ein Object p vom Typ Person erzeugt. Dabei wird der Konstruktur der Klasse Person mit dem Argument "feuerteufel" aufgerufen. Es wird also der Name auf "feuerteufel" gesetzt und id auf 1. Anschließend wird in der main die Methode getName() von p aufgerufen, welches den gespeicherten Namen ausgeben sollte. Ich würde übrigens davon abraten noch irgendwelche Sachen wie Methoden in der main zu schreiben, dort würde ich nur noch mein Programm ausführen und fertig.

MfG
Mr. J
 

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
  • Thread Starter Thread Starter
  • #18
Hi Mr_J,

danke für deine Antwort. Ich habe das soweit auch verstanden:
Das Objekt p hat seine Gültigkeit nur innerhalb der main-Methode.

Wenn ich aber in der Klasse Prog noch eine andere Methode einbaue, die den Zugriff auf das Objekt p braucht, muss ich das Objekt außerhalb der main-Methode definieren oder? Und dann als static soweit ich das verstanden habe. Und zwar damit die statische Methode main damit arbeiten kann.

Geht dann nicht irgendwie der Sinn von der Objektorientierung verloren.

Ich weiß, dass man außer der main-Methode eigentlich nichts anderes stehen haben sollte, jedoch ist das Programm so vorgegeben, dass es noch andere Methoden gibt.
Halte ich mich nicht an die Vorgabe gibt es Punktabzug.

Ich werde aber am Montag nochmal den Tutor fragen.
 

evillive

EXIL

Registriert
24 Juli 2013
Beiträge
930
also in Prog könntest du außerhalb

private Collection<Person> personList;

oder

private Person p;

deklarieren.

In der main() schreibst du dann

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


siehst du da noch irgendwo etwas mit static?

axo und p musst du natürlich vorher initialisieren.
 

feuerteufel

gesperrt

Registriert
14 Juli 2013
Beiträge
351
  • Thread Starter Thread Starter
  • #20
Nein sehe ich nicht.

Ich werde das morgen früh mal ausprobieren. Danke für den Hinweis. :T
 
Oben