Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Nun soll geklärt werden, auf welche der drei Attribute eine Methode der Klasse3 zugreifen kann, wenn ein Objekt der Klasse1 sowie entsprechende import-Statements gegeben sind. Sehe ich richtig, dass dann die Klasse3 auf int var1 sowie public int var3 zugreifen kann ???:L?
Dann soll noch geklärt werden, auf welche der drei Attribute eine Klassenmethode der Klasse1 zugreifen kann. Liege ich falsch, wenn ich sage, dass diese auf alle Attribute zugreifen kann :rtfm:?
Kann eine Objektmethode der Klasse Klasse1 auch auf alle diese Attribute zurückgreifen?
Kann eine Objektmethode der Klasse Klasse2 auch auf alle Attribute zugreifen, wenn ein Objekt der Klasse Klasse 1 gegeben ist? Oder kann diese dann auf private int var 2 zugreifen, weil diese als private deklariert wurde ?
Wäre euch echt dankbar, wenn ihr mir etwas Erleuchtung geben könntet .
Zu 1: Bei var1 steht weder public, protected noch private - diese Zugriffsart nennt sich "package private" und bedeutet, dass nur Klassen aus dem gleichen package zugreifen können.
Zu 2: Klassenmethode bedeutet normalerweise, dass die Methode static ist - da musst du mal genau nachlesen, ob das bei euch auch so präzise ist. static-Methoden können nur auf static-Variablen zugreifen.
Zu 3: Ah, da steht Objektmethode - also unterscheidet ihr die Begriffe präzise, hier ist es dann ohne static. Dann ist Aufgabe 2 damit klar, hoffe ich - und diese auch
Zu 4: Dazu musst du prüfen, ob die Klasse im gleichen Package ist (dann geht package-private-Zugriff und public - ansonsten nur public)
Versuch's mir diesen Hinweisen nochmal, dann schauen wir deine Lösung nochmal an
nochmal zum Verständnis, ob ich das richtig geschnallt habe :rtfm::
zu 1.) also wie ich das sehe, kann Klasse3 nur auf die public int var3 zugreifen, oder?
zu 2.) hier müsste die Klasse1 auf alles zugreifen, weil die ja erstens zum package1 gehört und weil es auch ihre eigenen Attribute sind und die Klassenmethode sowieso übergreifend als Rahmen über den Inhalt verfügen kann oder verdreh ich da was.
zu 3.) die Objektmethode kann ja nur auf die eigene Instanz die Attribute "ziehen". Das wären dann int var1 und public int var3. Wo ich mir unsicher bin ist, ob private int var2 sich auch auf die Objektmethode bezieht oder ob sie übergeordnet ist und nicht zur O.-methode gehört, so dass diese nicht darauf zugreifen kann.
zu 4.) Klasse2 ist ja im package1, worunter auch die Klasse1 und deren Attribute gehört. Somit würde ich sagen, dass Klasse 2 dann auf int var1 und public int var3 zurückgreifen kann.
2: Beachte den Unterschied zwischen Klassenmethode und Objektmethode. Eine Klassenmethode verfügt nicht über die "this"-Referenz und kann deshalb nur auf Klassenvariablen (static) und nicht auf Instanzvariablen zugreifen.
3: "private" verbietet allen anderen Objekten bzw. Klassen (im static-Fall) den Zugriff. Wäre es sinnvoll, den eigenen Objekten den Zugriff auf ihre Attribute zu verbieten?
4: Korrekt
Wenn du möchtest, könnte ich versuchen, die den Unterschied zwischen Objektmethoden und Klassenmethoden zu erklären - und wozu private usw. da sind bzw. wie sie sich unterscheiden. Aber vielleicht ist es dir im Prinzip ja schon klar und hat dich nur in dieser Aufgabe verwirrt
Danke rme . Warst wieder einmal eine große Hilfe :toll:. Ich glaube, in Prinzip ist mir der Unterschied klar, aber vllt. denke ich das auch nur. Wenn Du also mir das noch mal genauer erklären könntest, wäre ich Dir dankbar. Wahrscheinlich gibts da noch mehr Aspekte, die man berücksichtigen muss :rtfm:. Außerdem weiß ich gerne immer mehr .
dann hast du die Möglichkeit, Objekte dieser Klasse mittels [c]new[/c] anzulegen:
Java:
Tier meinHaustier = new Tier();
Erst an dieser Stelle wird in deinem Programm zum ersten Mal Speicher benötigt, denn erst [c]new[/c] sorgt dafür, dass ein Objekt der Klasse erzeugt wird. Nun soll die Klasse vermutlich irgendwelche Eigenschaften haben:
Java:
class Tier {
String art, name;
}
Jetzt wird beim Benutzen von [c]new[/c] auch Platz angelegt, der in den Objekten mit Variablen vom Typ String gefüllt werden kann:
Diese Eigenschaft der Klasse sind Objektvariablen, da sie sich immer auf ein bestimmtes Objekt beziehen - in diesem Fall auf das Objekt "meinHaustier". Manchmal möchte man aber Sachen tatsächlich in der Klasse speichern:
Java:
class Tier {
String art, name;
static Tier lieblingsTier;
}
Auf diese Weise habe ich die Möglichkeit, in der Klasse selbst etwas zu speichern - unabhängig davon, ob überhaupt Objekte dieser Klasse existieren. Ich könnte jetzt also das hier machen:
Java:
Tier.lieblingsTier = meinHaustier;
Interessant wird es jetzt, wenn ich zwei Tiere habe, also mal schnell ein weiteres anlegen:
Das liegt daran, dass die Information in der Klasse und nicht in einem einzelnen Objekt gespeichert ist - alle teilen sich den gemeinsamen Speicher. Das ist genau der Unterschied zwischen einer Objektvariable und einer Klassenvariable. In der Praxis nutzt man bei Klassenvariablen deshalb nur die letzte Variante, also über den Namen der Klasse auf Klassenvariablen zuzugreifen.
Manchmal möchte man Methoden haben, die auch ohne Objekte benutzbar sind:
Java:
class Tier {
String art, name;
static Tier lieblingsTier;
public static void gibLieblingsTierAus() {
System.out.println(lieblingsTier.name + " ist mir am liebsten, aber gefüttert werden sie alle");
}
}
Jetzt kann man auch ohne Objekt auf die Methode zugreifen:
Java:
Tier.gibLieblingsTierAus();
Der Zugriff auf "lieblingsTier" innerhalb der Methode funktioniert aber nur, weil die Variable eine Klassenvariable ist. Es handelt sich nämlich um eine Klassenmethode. Sie könnte unmöglich auf "art" oder "name" zugreifen, da dann gar nicht klar wäre, welches Objekt gemeint ist: meinHaustier oder deinHaustier?
Deshalb die erste Merkregel: Klassenmethoden können nur auf Klassenvariablen zugreifen, Objektmethoden können zusätzlich auf Objektvariablen zugreifen (da dann klar ist, welches Objekt gemeint ist, weil man ja immer das Objekt mit angeben muss, wie in meinHaustier.name).
Jetzt noch zur Sichtbarkeit: In den Beispielen habe ich keine explizite Sichtbarkeit angegeben, deshalb sind alle package-private. Den Teil hast du ja schon verstanden: Es können also nur Klassen aus demselben Package darauf zugreifen. Diese Art der Sichtbarkeit ist unabhängig davon, ob es eine Klassen- oder eine Objektvariable ist - man muss immer beides prüfen. Wenn ich kein Objekt habe, kann ich nur auf Klassenvariablen und -methoden zugreifen und wenn ich ein Objekt habe, kann ich auf die Objektvariablen dieses Objekts und trotzdem auf die Klassenvariablen der Klasse zugreifen, also auf beides.
Neben package-private gibt es noch:
private: Nur der Code der Klasse selbst kann darauf zugreifen
protected: Nur der Code der eigenen Klassen und abgeleiteter Klassen kann darauf zugreifen
public: Jeder kann zugreifen
Wenn du solche Aufgaben löst, musst du also immer zwei Sachen beachten: Ist die Variable static oder nicht static? Wenn sie nicht static ist, benötige ich ein Objekt der Klasse. Wenn sie static ist, benötige ich nur den Namen der Klasse.
Danach: Ist die Variable public, protected, private oder package-private? Wenn sie private ist, kann nur die Klasse selbst darauf zugreifen. Und so weiter.
Ich hoffe, jetzt ist es wieder ein bisschen klarer geworden
Die main-Methode ist übrigens immer static, weil Java dem Programmierer die Möglichkeit geben möchte, sich selbst die benötigten Objekte zu erzeugen. Deshalb kann man innerhalb von main nie auf Objektvariablen- oder Methoden zugreifen, sondern muss sich erst ein Objekt der eigenen Klasse anlegen - oder alles static machen, was aber unschön ist.