Datenkapselung

Codix

Bekanntes Mitglied
Hallo zusammen, hier sind 3 Aufgaben aus dem Bereich Datenkapselung.

Könnt Ihr mir bitte helfen, ob ich bei den Lösungsvorschlägen richtig liege:

Aufgabe1:

Sie haben folgende Klassenvereinbarung:

public class Elefant{
int gewicht;
int groesse;
}

Die Klasse Elefant befindet sich in einem Paket tiere. Kann eine andere Klasse, die sich im Paket meinetests befindet, direkt auf die Werte der Instanzvariablen gewicht und groesse der Klasse Elefant zugreifen? Begründen Sie bitte Ihre Antwort.

===

Lösungsvorschlag1:

es ist ja public class, also gilt: Unterklasse aus anderen Paketen darf zugreifen.

wenn sich also im Paket meinetests eine Unterklasse des public class Elefant befindet, dann kann sie darauf zugreifen.

ansonsten ist der Zugriff nicht nicht möglich.

=============================================================================================================

Aufgabe2:

Sie haben folgende Klassenvereinbarungen in getrennten Quelltextdateien:

package tiere;

public class Katze {

private int gewicht;

private int farbe;

private int groesse;

}

package tiere;

public class ElternKatze extends Katze {

private int kinderzahl;

}

Die Klasse ElternKatze soll auf die Instanzvariable gewicht der Klasse Katze zugreifen können. Welche Möglichkeiten kennen Sie, diesen Zugriff zu ermög
lichen? Bewerten Sie diese Möglichkeiten bitte auch. Achten Sie dabei besonders auf die Datenkapselung.

Ein Tipp: Sie sollten mindestens drei verschiedene Varianten nennen können. Zwei hängen direkt mit der Vereinbarung der Instanzvariablen zusammen, die dritte dagegen nicht.

===

Lösungsvorschlag2: Instanzvariablen sind private. Damit die Subklassen darauf zugreifen können, müssen die Instanzvariablen entweder protected oder public sein - oder du brauchst eine get-Methode dafür.

also auf protected oder public ändern:

protected int gewicht;

oder

public int gewicht;

=============================================================================================================

Aufgabe3:

Bitte sehen Sie sich die folgende Klassenvereinbarung genau an.

public class Ziege {

private int gewicht;

private char geschlecht;

//ein Konstruktor

private Ziege(int gewicht, char geschlecht) {

this.gewicht = gewicht;

this.geschlecht = geschlecht;

}…


Können Sie in einem Quelltext in einem anderen Paket eine Instanz der Klasse Ziege erstellen? Begründen Sie bitte Ihre Antwort und nennen Sie gegebenenfalls die Stellen im Quelltext der Klasse Ziege, die geändert werden müssten.

===

Lösungsvorschlag3:

char muss geändert werden, dieser Datentyp ist nicht korrekt.
char gilt ja nur für einzelne Character, also einzelne Buchstaben.
es muss: "private int geschlecht" heissen.

Vom anderen Paket aus auf die private Instanzvariable Ziege zugreifen.
es muss heissen: protected oder public Ziege heissen. So kann man auf die Instanzvariable Ziege zugreifen.

korregierter Quelltext:

public class Ziege {

private int gewicht;

private int geschlecht;

//ein Konstruktor

public Ziege(int gewicht, int geschlecht) {

this.gewicht = gewicht;

this.geschlecht = geschlecht;

}…



Danke für die Antworten im Voraus.

Codix
 

Anhänge

  • Kapselung.png
    Kapselung.png
    87,1 KB · Aufrufe: 4

temi

Top Contributor
es ist ja public class, also gilt: Unterklasse aus anderen Paketen darf zugreifen.

wenn sich also im Paket meinetests eine Unterklasse des public class Elefant befindet, dann kann sie darauf zugreifen.

ansonsten ist der Zugriff nicht nicht möglich.
Du hast dabei berücksichtigt, dass die Klasse Elefant im Package "tiere" ist?
 

temi

Top Contributor
Lösungsvorschlag2: Instanzvariablen sind private. Damit die Subklassen darauf zugreifen können, müssen die Instanzvariablen entweder protected oder public sein - oder du brauchst eine get-Methode dafür.

also auf protected oder public ändern:

protected int gewicht;

oder

public int gewicht;
Was ist deine Begründung dafür, warum du "protected" und nicht getter-Methoden verwendest?
 

temi

Top Contributor
char muss geändert werden, dieser Datentyp ist nicht korrekt.
char gilt ja nur für einzelne Character, also einzelne Buchstaben.
es muss: "private int geschlecht" heissen.

Vom anderen Paket aus auf die private Instanzvariable Ziege zugreifen.
es muss heissen: protected oder public Ziege heissen. So kann man auf die Instanzvariable Ziege zugreifen.
Was haben denn die beiden chars mit der Erzeugung von Instanzen zu tun?

Ein Geschlecht kann man ja durchaus durch einzelne Buchstaben ausdrücken, siehe m/w/d.

private Ziege(int gewicht, char geschlecht) ist keine Instanzvariable, sondern?
 

Codix

Bekanntes Mitglied
Was haben denn die beiden chars mit der Erzeugung von Instanzen zu tun?

Ein Geschlecht kann man ja durchaus durch einzelne Buchstaben ausdrücken, siehe m/w/d.

private Ziege(int gewicht, char geschlecht) ist keine Instanzvariable, sondern?

@temi: ich dachte in dem Fall nicht daran, dass char geschlecht als w/m/d zu deuten ist. Es gilt doch eigentlich, dass char im Code mit einem Buchstaben zu schreiben ist. deswegen ist der Ausdruck char geschlecht ein Syntaxfehler. Diesen Datentyp darf man der Variable geschlecht nicht zuweisen.
Würde es char m oder char w, etc. heissen, dann wäre es syntaktisch korrekt.
Würden wir das Geschlecht schreiben wollen, dann müssten wir int geschlecht schreiben.
Oder bringe ich etwas durcheinander?

===

Zitat temi: "private Ziege(int gewicht, char geschlecht) ist keine Instanzvariable, sondern?"

@temi: private Ziege ist eine Variable mit Eigenschaften int gewicht und char geschlecht
 

mihe7

Top Contributor
Wieso machst Du drei Lösungsvorschläge? Das hört sich eher nach raten an.

Du musst hier berücksichtigen, dass vor den Variablen kein Zugriffsmodifizierer steht. Herauszufinden, was das zu bedeuten hat, ist nun Deine Aufgabe :)
 

Codix

Bekanntes Mitglied
Wieso machst Du drei Lösungsvorschläge? Das hört sich eher nach raten an.

Du musst hier berücksichtigen, dass vor den Variablen kein Zugriffsmodifizierer steht. Herauszufinden, was das zu bedeuten hat, ist nun Deine Aufgabe :)
@mihe7
Wie soll ich denn die 3 Antworten auf 3 Aufgaben nennen. Was ist dein Vorschlag?
Über welche Aufgabe schreibst du => "Du musst hier berücksichtigen, dass vor den Variablen kein Zugriffsmodifizierer steht."?
 

temi

Top Contributor
Diesen Datentyp darf man der Variable geschlecht nicht zuweisen.
Würde es char m oder char w, etc. heissen, dann wäre es syntaktisch korrekt.
Würden wir das Geschlecht schreiben wollen, dann müssten wir int geschlecht schreiben.
Oder bringe ich etwas durcheinander?
Ich habe keine Ahnung was du damit sagen möchtest. Du kannst (im Rahmen der Vorgaben von Java) jede Variable so nennen wie du möchtest. Es ist ausdrücklich auch erlaubt eine Variable vom Typ char z.B. "schlumpf" zu nennen.
 

Codix

Bekanntes Mitglied
Ich habe keine Ahnung was du damit sagen möchtest. Du kannst (im Rahmen der Vorgaben von Java) jede Variable so nennen wie du möchtest. Es ist ausdrücklich auch erlaubt eine Variable vom Typ char z.B. "schlumpf" zu nennen.
soweit ich weiss: nein. char & int gehören den 8 wichtigsten Datentypen an. datentyp char darf nur einen Buchstaben als Variable haben & Datentyp int oder string mehrere Buchstaben. Google: "8 Datentypen Java"
 

Codix

Bekanntes Mitglied
Der Zugriffsmodifizierer der Klasse ist eine Sache. Hier geht es in erster Linie um die Instanzvariablen. Die erlauben welchen Zugriff?

Genau diese (die Erste).
ja stimmt, das habe ich übersehen. Also es kommt drauf an welchen Zugriffsmodifizierer wir wählen.

public = wir können von überall zugreifen.
protected = wir könnten von einer Unterklassen aus einem anderen Paket auf die Variablen zugreifen.

package & private nutzen uns hier nichts.

oder?!
 

temi

Top Contributor
soweit ich weiss: nein. char & int gehören den 8 wichtigsten Datentypen an. datentyp char darf nur einen Buchstaben als Variable haben & Datentyp int oder string mehrere Buchstaben. Google: "8 Datentypen Java"
Eine Variable vom Typ char enthält ein einzelnes Zeichen, richtig, aber das hat ja nichts mit dem Namen der Variablen zu tun. Du kannst ja auch eine Variable vom Typ int, die nur Zahlen enthält, mit "Buchstabe" bezeichnen.
 

temi

Top Contributor
Eine Variable vom Typ char enthält ein einzelnes Zeichen, aber das hat ja nichts mit dem Namen der Variablen zu tun. Du kannst ja auch eine Variable vom Typ int, die nur Zahlen enthält, mit "Buchstabe" bezeichnen.
Du sollst nichts wählen.
Kann eine andere Klasse, die sich im Paket meinetests befindet, direkt auf die Werte der Instanzvariablen gewicht und groesse der Klasse Elefant zugreifen? Begründen Sie bitte Ihre Antwort.
 

Codix

Bekanntes Mitglied
Na, es handelt sich um die Klasse Ziege. Aber deine Antwort trifft es nicht. Lies noch mal nach
Java:
//ein Konstruktor
private Ziege(int gewicht, char geschlecht)

bitte um Hilfe! Um was handelt es sich denn? Eine Klasse Ziege mit einer Instanzvariable Ziege (Eigenschaften gewicht und geschlecht).
 

Codix

Bekanntes Mitglied
Eine Variable vom Typ char enthält ein einzelnes Zeichen, richtig, aber das hat ja nichts mit dem Namen der Variablen zu tun. Du kannst ja auch eine Variable vom Typ int, die nur Zahlen enthält, mit "Buchstabe" bezeichnen.

wofür gelten denn die Syntaxregeln? Genau für die "Namen der Variablen = Bezeichner".
 

Codix

Bekanntes Mitglied
Wieso machst Du drei Lösungsvorschläge? Das hört sich eher nach raten an.

Du musst hier berücksichtigen, dass vor den Variablen kein Zugriffsmodifizierer steht. Herauszufinden, was das zu bedeuten hat, ist nun Deine Aufgabe :)
@mihe7
Wie soll ich denn die 3 Antworten auf 3 Aufgaben nennen. Was ist dein Vorschlag?
Über welche Aufgabe schreibst du => "Du musst hier berücksichtigen, dass vor den Variablen kein Zugriffsmodifizierer steht."?
 

mihe7

Top Contributor
Ändert aber nichts daran, dass bei der ersten Aufgabe die Zugriffsmodifizierer der Instanzvariablen zu berücksichtigen sind :)
 

Codix

Bekanntes Mitglied
Ändert aber nichts daran, dass bei der ersten Aufgabe die Zugriffsmodifizierer der Instanzvariablen zu berücksichtigen sind :)

bereits beantwortet:

ja stimmt, das habe ich übersehen. Also es kommt drauf an welchen Zugriffsmodifizierer wir wählen.

public = wir können von überall zugreifen.
protected = wir könnten von einer Unterklassen aus einem anderen Paket auf die Variablen zugreifen.

package & private nutzen uns hier nichts.

oder?!
 

temi

Top Contributor
ich habe darauf eigentlich geantwortet:

ja stimmt, das habe ich übersehen. Also es kommt drauf an welchen Zugriffsmodifizierer wir wählen.

public = wir können von überall zugreifen.
protected = wir könnten von einer Unterklassen aus einem anderen Paket auf die Variablen zugreifen.

package & private nutzen uns hier nichts.

oder?!

Der Zugriffsmodifizierer ist doch bereits vorgegeben, indem kein expliziter Modifizierer angegeben wurde. Das hat auch eine Bedeutung.

Und jetzt sollst du mit dieser Information die Frage der Aufgabe 1 beantworten.
 

temi

Top Contributor
beim Datentyp char darf als Bezeichner (Variable) nur ein Buchstabe stehen. z.B.: char a oder char b, aber nicht char vielebuchstaben :)
Das ist falsch. Wie kommst du auf so einen Unsinn?

Die Regeln für Variablennamen in Java:
  • starten mit einem Zeichen, Währungssymbol oder Verbindungszeichen
  • starten nicht mit einer Ziffer
  • können nach dem ersten Zeichen alle Kombinationen von Zeichen, Ziffern, Währungssymbolen und Verbindungszeichen enthalten
  • theoretisch ist die Anzahl der Zeichen pro Name unbegrenzt
  • sind keine Java-Schlüsselwörter wie new
  • Namen sind case-sensitive, sprich Java unterscheidet zwischen Groß- und Kleinschreibung.
 

temi

Top Contributor
Frage: soll ich die Antwort nach dem Zugriffsmodifizierer der Klasse richten?

Das ist die Klasse:
Java:
package tiere;

public class Elefant{
int gewicht;
int groesse;
}
Und das die Aufgabe:

Die Klasse Elefant befindet sich in einem Paket "tiere".

Kann eine andere Klasse, die sich im Paket "meinetests" befindet, direkt auf die Werte der Instanzvariablen gewicht und groesse der Klasse Elefant zugreifen?

Begründen Sie bitte Ihre Antwort.

Es geht also um den Zugriff auf die Instanzvariablen.
 

Codix

Bekanntes Mitglied
Das ist falsch. Wie kommst du auf so einen Unsinn?

Die Regeln für Variablennamen in Java:
  • starten mit einem Zeichen, Währungssymbol oder Verbindungszeichen
  • starten nicht mit einer Ziffer
  • können nach dem ersten Zeichen alle Kombinationen von Zeichen, Ziffern, Währungssymbolen und Verbindungszeichen enthalten
  • theoretisch ist die Anzahl der Zeichen pro Identifier unbegrenzt
  • sind keine Java-Schlüsselwörter wie new
  • Identifier sind case-sensitive, sprich Java unterscheidet zwischen Groß- und Kleinschreibung.
das sind die Regeln für Variablennamen. Aber sobald ein Datentyp davor steht musst du andere Regeln beachten.

google einfach. Die 8 wichtigsten Datentypen in Java.
 

Codix

Bekanntes Mitglied
Das ist die Klasse:
Java:
package tiere;

public class Elefant{
int gewicht;
int groesse;
}
Und das die Aufgabe:

Die Klasse Elefant befindet sich in einem Paket "tiere".

Kann eine andere Klasse, die sich im Paket "meinetests" befindet, direkt auf die Werte der Instanzvariablen gewicht und groesse der Klasse Elefant zugreifen?

Begründen Sie bitte Ihre Antwort.

Es geht also um den Zugriff auf die Instanzvariablen.

das habe ich längst verstanden.
War meine Antwort nicht korrekt?
 

temi

Top Contributor
das habe ich längst verstanden.
War meine Antwort nicht korrekt?
Wenn du deine erste Antwort meinst, ja, die war nicht korrekt.

Die Antwort zur zweiten Frage ist zwar richtig, aber es fehlt die Begründung zu den drei Möglichkeiten.

Die dritte Antwort ist teilweise richtig, das war aber eher Zufall.
 

Codix

Bekanntes Mitglied
Wenn du deine erste Antwort meinst, ja, die war nicht korrekt.

Die Antwort zur zweiten Frage ist zwar richtig, aber es fehlt die Begründung zu den drei Möglichkeiten.

Die dritte Antwort ist teilweise richtig, das war aber eher Zufall.

ich meinte diese Antwort:

Also es kommt drauf an welchen Zugriffsmodifizierer wir wählen.

public = wir können von überall zugreifen.
protected = wir könnten von einer Unterklassen aus einem anderen Paket auf die Variablen zugreifen.

package & private nutzen uns hier nichts.

=>als Antwort auf die erste Frage.
 

temi

Top Contributor
ich meinte diese Antwort:

Also es kommt drauf an welchen Zugriffsmodifizierer wir wählen.

public = wir können von überall zugreifen.
protected = wir könnten von einer Unterklassen aus einem anderen Paket auf die Variablen zugreifen.

package & private nutzen uns hier nichts.

=>als Antwort auf die erste Frage.
Das ist nicht die Antwort auf die Frage. Die Frage war, ob du auf die Instanzvariablen von "Elefant" aus dem Package "meinetests" zugreifen kannst.

Im einfachsten Fall lautet die Antwort Ja oder Nein. In deinem Fall kommt noch eine Begründung dazu, warum es so ist.
 

Codix

Bekanntes Mitglied
Das ist nicht die Antwort auf die Frage. Die Frage war, ob du auf die Instanzvariablen von "Elefant" aus dem Package "meinetests" zugreifen kannst.

Im einfachsten Fall lautet die Antwort Ja oder Nein. In deinem Fall kommt noch eine Begründung dazu, warum es so ist.
ich habe doch geantwortet: mit Ja. Und die Begründung gebracht. Wo liegt jetzt das Problem?
 

Codix

Bekanntes Mitglied
Das ist nicht die Antwort auf die Frage. Die Frage war, ob du auf die Instanzvariablen von "Elefant" aus dem Package "meinetests" zugreifen kannst.

Im einfachsten Fall lautet die Antwort Ja oder Nein. In deinem Fall kommt noch eine Begründung dazu, warum es so ist.

Antwort:

JA

wenn wir folgende Modifizierer wählen:
public = wir können von überall zugreifen.
protected = wir könnten von einer Unterklassen aus einem anderen Paket auf die Variablen zugreifen.

package & private nutzen uns hier nichts.
 

temi

Top Contributor
Antwort:

JA

wenn wir folgende Modifizierer wählen:
public = wir können von überall zugreifen.
protected = wir könnten von einer Unterklassen aus einem anderen Paket auf die Variablen zugreifen.

package & private nutzen uns hier nichts.

Die Antwort ist falsch.

Korrekte Antwort:
Nein. Die beiden Instanzvariablen der Klasse Elefant sind beide package-private. Der Zugriff ist nur aus der eigenen Klasse und aus Klassen im gleichen Package möglich. Da sich die andere Klasse im Package "meinetests" befindet kann sie nicht direkt auf die Instanzvariablen zugreifen.
 

Codix

Bekanntes Mitglied
Die Antwort ist falsch.

Korrekte Antwort:

Die Antwort ist falsch.

Korrekte Antwort:

@Nein. Die beiden Instanzvariablen der Klasse Elefant sind beide package-private. Der Zugriff ist nur aus Kindklassen oder aus Klassen im gleichen Package möglich. Da sich die andere Klasse im Package "meinetests" befindet kann sie nicht direkt auf die Instanzvariablen zugreifen.


D.h. wir müssen immer über den Modifizierer der Klasse gehen, wenn bei den Instanzvariablen keine Modifizierer dabei stehen?
 

temi

Top Contributor
@Nein. Die beiden Instanzvariablen der Klasse Elefant sind beide package-private. Der Zugriff ist nur der eigenen Klasse oder aus Klassen im gleichen Package möglich. Da sich die andere Klasse im Package "meinetests" befindet kann sie nicht direkt auf die Instanzvariablen zugreifen.


D.h. wir müssen immer über den Modifizierer der Klasse gehen, wenn bei den Instanzvariablen keine Modifizierer dabei stehen?

Nein. Die Klasse ist weiterhin public und hat nicht direkt etwas mit dem Modifizierern der Instanzvariablen zu tun, sonst wären sie ja sichtbar und deine Antwort wäre richtig gewesen.

Es gibt folgende Modifizierer:

private, (package-private), protected, public

Der Modifizierer package-private steht in Klammern, weil man ihn nicht angeben muss (bzw. kann). Steht kein Modifizierer vor der Klasse/Instanzvariable/Methode dann ist sie package-private.
 

Ähnliche Java Themen

Neue Themen


Oben