# Datenkapselung



## Codix (7. Jul 2020)

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


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> 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 (7. Jul 2020)

Codix hat gesagt.:


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


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


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


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


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 (7. Jul 2020)

temi hat gesagt.:


> Du hast dabei berücksichtigt, dass die Klasse Elefant im Package "tiere" ist?


Ja@temi


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


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


@temi: ich habe die Getter-Methode genannt (als 3.te Variante), aber ich habe sie nicht am Bsp. angewendet. Vllt sollte ich das tun. Was denkst du?


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> 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 (7. Jul 2020)

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 (7. Jul 2020)

mihe7 hat gesagt.:


> 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 (7. Jul 2020)

Codix hat gesagt.:


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


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> Ja@temi



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


Codix hat gesagt.:


> Über welche Aufgabe schreibst du => "Du musst hier berücksichtigen, dass vor den Variablen kein Zugriffsmodifizierer steht."?


Genau diese (die Erste).


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> @temi: ich habe die Getter-Methode genannt (als 3.te Variante), aber ich habe sie nicht am Bsp. angewendet. Vllt sollte ich das tun. Was denkst du?


Du sollst die drei Möglichkeiten auch bewerten, also welche ist die Beste und warum.


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> 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_



Nein. Es steht doch sogar drüber, um was es sich handelt.


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> 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 (7. Jul 2020)

temi hat gesagt.:


> Nein. Es steht doch sogar drüber, um was es sich handelt.



es handelt sich um ein Objekt "Ziege"


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> es handelt sich um ein Objekt "Ziege"


Na, es handelt sich um die Klasse Ziege. Aber deine Antwort trifft es nicht. Lies noch mal nach

```
//ein Konstruktor
private Ziege(int gewicht, char geschlecht)
```


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> 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 (7. Jul 2020)

Codix hat gesagt.:


> 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 (7. Jul 2020)

temi hat gesagt.:


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


Codix hat gesagt.:


> 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 (7. Jul 2020)

temi hat gesagt.:


> Na, es handelt sich um die Klasse Ziege. Aber deine Antwort trifft es nicht. Lies noch mal nach
> 
> ```
> //ein Konstruktor
> ...



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


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> Du sollst nichts wählen.



Dann antworte ich mit Ja und bringe das public & protected Bsp. Wäre das korrekt?


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


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


----------



## mihe7 (7. Jul 2020)

Codix hat gesagt.:


> Über welche Aufgabe schreibst du => "Du musst hier berücksichtigen, dass vor den Variablen kein Zugriffsmodifizierer steht."?


Mein Fehler, das sind ja - eigentlich unübersehbar - drei Aufgaben  OK, ich meinte die erste.


----------



## Codix (7. Jul 2020)

mihe7 hat gesagt.:


> 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."?


----------



## Codix (7. Jul 2020)

mihe7 hat gesagt.:


> Mein Fehler, das sind ja - eigentlich unübersehbar - drei Aufgaben  OK, ich meinte die erste.


kein Ding, wir alle machen Fehler.


----------



## mihe7 (7. Jul 2020)

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


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> wofür gelten denn die Syntaxregeln?


Wie lauten denn die Syntaxregeln für Variablennamen?


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


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


Es handelt sich um den Konstruktor der Klasse. Mit diesem erzeugt man eine Instanz der Klasse, z.B. `new Ziege(23,'w');`


----------



## Codix (7. Jul 2020)

mihe7 hat gesagt.:


> Ä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?!


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> Wie lauten denn die Syntaxregeln für Variablennamen?



beim Datentyp char darf als Bezeichner (Variable) nur ein Buchstabe stehen.  z.B.: char a oder char b, aber nicht char vielebuchstaben


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


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



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.


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


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



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


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> 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 (7. Jul 2020)

Codix hat gesagt.:


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



Das ist die Klasse:

```
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 (7. Jul 2020)

temi hat gesagt.:


> Das ist falsch. Wie kommst du auf so einen Unsinn?
> 
> Die Regeln für Variablennamen in Java:
> 
> ...


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 (7. Jul 2020)

temi hat gesagt.:


> Das ist die Klasse:
> 
> ```
> package tiere;
> ...



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


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


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


Da brauch ich nicht zu googeln: Das ist totaler Schwachsinn! Vergiss das einfach!


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> 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 (7. Jul 2020)

temi hat gesagt.:


> 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 (7. Jul 2020)

Codix hat gesagt.:


> ich meinte diese Antwort:
> 
> Also es kommt drauf an welchen Zugriffsmodifizierer wir wählen.
> 
> ...


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 (7. Jul 2020)

temi hat gesagt.:


> Da brauch ich nicht zu googeln: Das ist totaler Schwachsinn! Vergiss das einfach!


keine Antwort


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> 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?


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> ich habe doch geantwortet: mit Ja. Und die Begründung gebracht.  Wo liegt jetzt das Problem?


Die Antwort ist falsch.


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> 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 (7. Jul 2020)

Codix hat gesagt.:


> keine Antwort


Das war ernst gemeint. Die Formulierung war, zugegeben, nicht sehr feinfühlig, aber trotzdem: Vergiss den Unsinn!


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> Antwort:
> 
> JA
> 
> ...



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 (7. Jul 2020)

temi hat gesagt.:


> Das war ernst gemeint. Die Formulierung war, zugegeben, nicht sehr feinfühlig, aber trotzdem: Vergiss den Unsinn!


char ist einer der 8 primitiven Datentypen, dem nur 1 Buchstabe als Bezeichner der Variablen zugeordnet werden darf.


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> Die Antwort ist falsch.
> 
> Korrekte Antwort:





temi hat gesagt.:


> 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 (7. Jul 2020)

Codix hat gesagt.:


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


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> char ist einer der 8 primitiven Datentypen, dem nur 1 Buchstabe als Bezeichner der Variablen zugeordnet werden darf.


Und kannst das so oft wiederholen wie du möchtest, es wird dadurch nicht wahrer. Es ist einfach falsch.

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> Und kannst das so oft wiederholen wie du möchtest, es wird dadurch nicht wahrer. Es ist einfach falsch.
> 
> https://docs.oracle.com/javase/tutorial/java/nutsandbolts/variables.html


es ist jetzt auch egal


----------



## Codix (7. Jul 2020)

jetzt muss noch die Frage 2 & 3 beantwortet bzw. die Antwort korregiert werden.


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> es ist jetzt auch egal


Tatsächlich ist es nicht egal, sofern du weiterhin darauf beharrst, weil du dadurch etwas falsches lernst und das wäre ja schade.


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> jetzt muss noch die Frage 2 & 3 beantwortet bzw. die Antwort korregiert werden.


Mach das. Du hast ja viele Hinweise erhalten. Du kannst gerne noch mal nachfragen, wenn du soweit bist, dann können wir Unklarheiten noch beseitigen.


----------



## temi (7. Jul 2020)

Codix hat gesagt.:


> jetzt muss noch die Frage 2 & 3 beantwortet bzw. die Antwort korregiert werden.


Hast du denn die Lösung der ersten Aufgabe verstanden, oder ist noch was unklar?


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> Hast du denn die Lösung der ersten Aufgabe verstanden, oder ist noch was unklar?


ich habe die Lösung verstanden. Danke.


----------



## Codix (7. Jul 2020)

temi hat gesagt.:


> Hast du denn die Lösung der ersten Aufgabe verstanden, oder ist noch was unklar?


alles klar.


----------



## Codix (8. Jul 2020)

temi hat gesagt.:


> Mach das. Du hast ja viele Hinweise erhalten. Du kannst gerne noch mal nachfragen, wenn du soweit bist, dann können wir Unklarheiten noch beseitigen.


@temi   2Antwort auf die 2.te Aufgabe: welche ist die beste Möglichkeit? protected, public oder getter? 
Begründung: Also ich finde public am besten. Weil wir mit public aus derselben Klasse, demselben Paket, der Unterklasse im gleichen Paket und der Unterklasse im anderen Paket auf die Variablen zugreifen können. Von überall. 
TOP 1 = public. 
Was sagst du hierzu? @ Temi.

===

3.te Aufgabe: es muss heissen: protected oder public Ziege heissen. So kann man auf die Instanzvariable Ziege zugreifen.

mehr fällt mir hierzu nicht ein. 

Hat die Antwort etwas mit der Veränderung des Konstruktors zu tun? z.B. new Ziege(23,'w');

Bitte um eine Antwort.


----------



## kneitzel (8. Jul 2020)

Also zu 2: Das Topic ist doch die Datenkapselung. Wenn Du ein Feld public machst, dann hebst Du die Kapselung komplett auf. Also nicht gut.
Und es kann auch nicht zwischen lesendem und schreibendem Zugriff unterschieden werden.

Zu 3: Da wirfst Du Begriffe durcheinander. Ich sehe keine Instanzvariable Ziege, daher kann deine Antwort nur falsch sein. 

Aber ja: wenn der Konstruktor private ist, dann kann von außen nicht auf den Konstruktor zugegriffen werden. Damit Instanzen der Klasse erzeugt werden können, muss der Konstruktor zugreifbar sein. Du erwähnst protected und public. Wie sind da jeweils die Zugriffsmöglichkeiten? Und welche erlauben den geforderten Zugriff ("in einem Quelltext in einem anderen Paket")?

Und ist der text bzgl. Datentyp char aus dem ersten Post noch irgendwie akut? Oder hast Du das selbst schon gestrichen oder wurde das im Thread bereits behandelt?


----------



## Codix (8. Jul 2020)

JustNobody hat gesagt.:


> Also zu 2: Das Topic ist doch die Datenkapselung. Wenn Du ein Feld public machst, dann hebst Du die Kapselung komplett auf. Also nicht gut.
> Und es kann auch nicht zwischen lesendem und schreibendem Zugriff unterschieden werden.
> 
> Zu 3: Da wirfst Du Begriffe durcheinander. Ich sehe keine Instanzvariable Ziege, daher kann deine Antwort nur falsch sein.
> ...




Danke @ JustNobody

Ziege ist keine Instanzvariable, das ist richtig. Ziege ist eine Klasse (in dem Fall).

public: Zugriff von überall möglich.

protected: Wir können aus derselben Klasse, demselben Paket, der Unterklasse im gleichen Paket und der Unterklasse im anderen Paket auf den code zugreifen. 

*Sollen wir den modifizierer des Konstruktors auf public ändern? *

char. darüber haben wir diskutiert. Ich denke, dass char auf int geändert werden muss.

Was denkst du @ JustNobody


----------



## kneitzel (8. Jul 2020)

Ja, public wäre besser, denn Quelltext in einem anderen Paket muss ja keine Unterklasse sein. Daher wäre protected zu wenig.

Und wieso sollte char gewechselt werden? Was ist denn bei int anders oder besser? Was unterscheidet denn die beiden Typen von einander?


----------



## Codix (14. Jul 2020)

back on track mit der Lösung dieser Aufgaben. 
@JustNobody: 

Der Unterschied zwischen den Datentypen int & char:
int = ganze Zahlen, char = einzelne Character

@Und wieso sollte char gewechselt werden?  => wir müssen es nicht wechseln. Dann lass uns char nehmen.


also muss es in der Klasse Ziege : 

public class Ziege {
*public *int gewicht;
*public* int geschlecht;

heissen.

Sind das die Stellen, die im Quelltext geändert werden müssten, um in einem anderen Paket eine Instanz der Klasse Ziege zu erstellen? 

Bitte um eure Antworten, ist die Aufgabe hiermit gelöst? 

Danke im Voraus


----------



## Codix (14. Jul 2020)

Nobody schrieb: 
Also zu 2: Das Topic ist doch die Datenkapselung. Wenn Du ein Feld public machst, dann hebst Du die Kapselung komplett auf. Also nicht gut.
Und es kann auch nicht zwischen lesendem und schreibendem Zugriff unterschieden werden.

Antwort: 
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 ändern:


```
protected int gewicht;
```

somit hätten wir 2 Lösungsvarianten: get-Methode & Protected.

wir brauchen noch eine Variante (ausser protected), die direkt mit der Veienbarung der Instanzvariablen zusammenhängt.

Was sind eure Lösungen? 

Danke im Voraus


----------



## temi (14. Jul 2020)

Codix hat gesagt.:


> Sind das die Stellen, die im Quelltext geändert werden müssten, um in einem anderen Paket eine Instanz der Klasse Ziege zu erstellen?


Nein.


Codix hat gesagt.:


> ist die Aufgabe hiermit gelöst?


Nein.


----------



## temi (14. Jul 2020)

Codix hat gesagt.:


> somit hätten wir 2 Lösungsvarianten: get-Methode & Protected.
> 
> wir brauchen noch eine Variante (ausser protected), die direkt mit der Veienbarung der Instanzvariablen zusammenhängt.


Du hattest schon im allerersten Beitrag für diese Aufgabe drei richtige Varianten angegeben. Das einzige was fehlte war die Bewertung dieser Varianten. Das wurde dir in diesem Thema schon mehrfach mitgeteilt. Hast du eigentlich Probleme Texte (ob nun Aufgaben oder Lösungshinweise) richtig zu interpretieren?


----------



## Codix (14. Jul 2020)

temi hat gesagt.:


> Du hattest schon im allerersten Beitrag für diese Aufgabe drei richtige Varianten angegeben. Das einzige was fehlte war die Bewertung dieser Varianten. Das wurde dir in diesem Thema schon mehrfach mitgeteilt. Hast du eigentlich Probleme Texte (ob nun Aufgaben oder Lösungshinweise) richtig zu interpretieren?



ich dachte die 3 Varianten wären die richtigen, aber anscheinend ist die Variante privat nicht richtig. (s. Kommentare von JustNobody). Deswegen habe ich die letzten Posts geschrieben.

also du sagst. public, protected und get-Methode sind die richtigen 3 Varianten.

Ich bewertete public als die beste Methode (s. vorige threads), aber s. #53 JustNobody's Kommentar zu der public Wahl.

Deswegen blieb nur noch get-Methode und protected übrig, so meine Entscheidung anhand des Data von JustNobody.

aber wir können diese Entscheidung wieder rückgängig machen wegen deiner Bewertung der Lage.


----------



## Meniskusschaden (14. Jul 2020)

Ich habe den Eindruck, du verstrickst dich in Details, bevor du dir über das Grundsätzliche des Themas Gedanken gemacht hast. Es geht um Datenkapselung. Ist das nun etwas Gutes oder Schlechtes? Will man Datenkapselung erreichen oder verhindern? Warum will man das? Was sind die Vor- und Nachteile? Sobald du das heraus gefunden hast, musst du nur noch bewerten, inwieweit sich die verschiedenen Lösungsansätze im Hinblick darauf unterscheiden. Bevor du das verstanden hast, kannst du nur raten.


----------



## kneitzel (15. Jul 2020)

Neben den Punkten von Meniskusschaden möchte ich nur noch einmal die Aussage "drei richtige Varianten" ansprechen:
public, protected und Getter sind da genannt und für richtig erachtet?

public und (public) Getter können wir abhaken - da hat man von überall aus Zugriff. Aber protected hatten wir ja eigentlich betrachtet:

a) Aufgabe besagt: Zugriff "in einem Quelltext in einem anderen Paket" - also da geht es um irgend einen Quelltext, das muss also keine abgeleitete Klasse sein.

b) Du hast geschrieben: "protected: Wir können aus derselben Klasse, demselben Paket, der Unterklasse im gleichen Paket und der Unterklasse im anderen Paket auf den code zugreifen." wobei ich letzteres zusammenfassen würde zu: Wir können aus derselben Klasse, dem selben Paket oder von Unterklassen zugreifen.

c) Ist protected also eine valide Lösung? Kann ich da von irgend einem Quelltext in einem anderen Paket zugreifen oder nicht? Sprich: Ist es die selbe Klasse? Ist es das selbe Paket? Ist es eine Unterklasse? Wenn Du alles mit Nein beantwortest, dann würde das was genau bedeuten?


Ansonsten probiere es doch einfach aus:
In package1 eine Klasse Test1 mit einem `private int variable;`
In package2 eine Klasse Test2 (ohne Vererbung!) mit einer Methode:

```
public void testAccess() {
  Test1 testInstanz = new Test1();
  testInstanz.variable = 1;
}
```
(Natürlich mit den notwendigem Krimskrams: package Zeilen in beiden Dateien, Test2 braucht ein Import von package1.Test1 ...)

Lässt sich dies übersetzen oder nicht?


----------



## temi (15. Jul 2020)

JustNobody hat gesagt.:


> Aufgabe besagt: Zugriff "in einem Quelltext in einem anderen Paket" - also da geht es um irgend einen Quelltext, das muss also keine abgeleitete Klasse sein.


Es geht hier um Aufgabe 2 und die zeigt eindeutig eine abgeleitete Klasse...


JustNobody hat gesagt.:


> public und (public) Getter können wir abhaken - da hat man von überall aus Zugriff.


Es ist eine mögliche Lösung. In Hinblick auf Kapselung eine ungünstige Lösung, aber das muss einfach so in der Bewertung der Lösung geschrieben werden.


----------



## kneitzel (15. Jul 2020)

Ah danke, da habe ich dann etwas aus der Aufgabe 3 mit reingemischt. Blöd, wenn man bei so einem Thread den Ursprungspost mit der Zeit etwas zu sehr aus den Augen verliert.


----------



## temi (15. Jul 2020)

Codix hat gesagt.:


> also du sagst. public, protected und get-Methode sind die richtigen 3 Varianten.
> Ich bewertete public als die beste Methode (s. vorige threads), aber s. #53 JustNobody's Kommentar zu der public Wahl.
> Deswegen blieb nur noch get-Methode und protected übrig, so meine Entscheidung anhand des Data von JustNobody.
> aber wir können diese Entscheidung wieder rückgängig machen wegen deiner Bewertung der Lage.


Mein letzter Versuch in dieser Sache. Ich habe dir ja schon mehrmals geschrieben, dass die Aufgabe eine Bewertung der drei Möglichkeiten verlangt. Die hast du bisher komplett ignoriert. Da das Thema Datenkapselung ist, geht es um eine Bewertung aus Sicht der Datenkapselung. @Meniskusschaden  hat es dir ja schon geschrieben und ich stelle es jetzt einfach mal klar: Ja, Datenkapselung ist gut und gewollt. Je gekapselter, desto besser.

Mit dieser Information sollst du die drei o.g. Möglichkeiten bewerten.


----------



## handshake45 (15. Jul 2020)

temi hat gesagt.:


> Ja, Datenkapselung ist gut und gewollt.


Na, ich habe schon "bessere" (also umfangreichere) Gegenüberstellungen gesehen.


----------



## temi (15. Jul 2020)

handshake45 hat gesagt.:


> Na, ich habe schon "bessere" (also umfangreichere) Gegenüberstellungen gesehen.


Wer oder was steht sich denn hier gegenüber?


----------



## handshake45 (15. Jul 2020)

Es geht doch um einen Vergleich oder? Und dieser dürfte schon ausdifferenziert sein, falls du weißt was das bedeutet...


----------



## temi (15. Jul 2020)

handshake45 hat gesagt.:


> Es geht doch um einen Vergleich oder? Und dieser dürfte schon ausdifferenziert sein, falls du weißt was das bedeutet...


Ich habe keine Ahnung was du mir sagen möchtest, Tobias. Es geht doch nicht um einen Vergleich. Es geht darum die drei genannten Möglichkeiten in Bezug auf ihren Einfluss auf die Datenkapselung zu bewerten. Da es sich nicht um meine Aufgabe handelt, werde _ich_ das ganz sicher nicht tun. Das kann @Codix ruhig selbst machen.


----------



## handshake45 (15. Jul 2020)

temi hat gesagt.:


> Tobias


Sind hier alle verrückt geworden?

Ist aber auch egal, schau nach was eine Gegenüberstellung ist: "Vergleich zwischen zwei Dingen" https://de.wiktionary.org/wiki/Gegenüberstellung


----------



## kneitzel (15. Jul 2020)

Ein Vergleich ist erst einmal nur eine Ermittlung von Unterschieden. Aber es geht uns um eine Bewertung. Damit ist es kein reiner Vergleich sondern geht deutlich darüber hinaus.

Und im Gegensatz zu Dir versuchen wir, Leute nur zu führen, so dass sie verstehen und selbst die Lösung erarbeiten. Daher bringen wir eben keine Lösung sondern erwarten da einen entsprechenden Einsatz vom TE.

Und somit ist es erst einmal egal, wie man das nun nennt. Wenn du es unbedingt Gegenüberstellung nennen willst, dann nenn es so. Um Begriffe zu streiten bringt uns / den TE nicht wirklich weiter.


----------



## temi (16. Jul 2020)

handshake45 hat gesagt.:


> Ist aber auch egal, schau nach was eine Gegenüberstellung ist: "*Vergleich zwischen zwei Dingen*"



Den Begriff "Gegenüberstellung" hast du ins Spiel gebracht.
Da es sich um drei Dinge handelt, kann es sich nicht um eine Gegenüberstellung handeln 
@Codix: Wenn du Verständnisprobleme z.B. mit dem Begriff "Datenkapselung" hast, dann kannst du hier gerne danach fragen und es werden sich sicher Helfer finden, die es dir erläutern können. Dieses Verständnis ist hier wichtig.


----------



## kneitzel (16. Jul 2020)

Wobei man da sehr viel online zu findet. Ein guter erster Schritt ist ggf. https://de.wikipedia.org/wiki/Datenkapselung_(Programmierung) - inkl. der Nennung von Vor- und Nachteilen ...


----------



## mihe7 (16. Jul 2020)

temi hat gesagt.:


> und es werden sich sicher Helfer finden, die es dir erläutern können.


Du brauchst gar nicht versuchen, Dich hier abzuseilen


----------



## temi (16. Jul 2020)

mihe7 hat gesagt.:


> Du brauchst gar nicht versuchen, Dich hier abzuseilen


Ich wollte mich nur nicht als alleiniger Retter der Welt darstellen


----------



## Codix (17. Aug 2020)

also nochmals: 
ich habe jetzt folgende Lösungsvorschläge als richtig empfunden und will wissen, was ihr dazu denkt: 

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ösung: 
Nein, da die Variablen default im private sind. Erst mit gettern und settern ist das 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ösung: 
Das ist einmal über eine Parameterübergabe im Konstruktor möglich, sowie mit gettern und settern oder aber man setzt die variablen nicht private sondern public oder protected.*

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ösung: 
Nein, da der Konstruktor in private ist. Dieser sollte public sein.
Also: public Ziege(…*


Die Lösungen wurden fett geschrieben.

Was denkt ihr über die Lösungen? Sind sie richtig?  


Danke im Voraus

Codix


----------



## temi (17. Aug 2020)

Codix hat gesagt.:


> Nein, da die Variablen default im private sind. Erst mit gettern und settern ist das möglich.


Das "Nein" ist richtig, aber Instanzvariablen sind nicht default "private".



Codix hat gesagt.:


> Das ist einmal über eine Parameterübergabe im Konstruktor möglich, sowie mit gettern und settern oder aber man setzt die variablen nicht private sondern public oder protected.


Wie soll denn der Zugriff über Parameterübergabe funktionieren?
Getter/Setter ist richtig.
Public/protected ist auch richtig.
Es fehlt die Bewertung, der unterschiedlichen Lösungen in Hinblick auf die Datenkapselung.



Codix hat gesagt.:


> Nein, da der Konstruktor in private ist. Dieser sollte public sein.


Das ist richtig.


----------



## Codix (18. Aug 2020)

temi hat gesagt.:


> Das "Nein" ist richtig, aber Instanzvariablen sind nicht default "private".


wie sind sie dann?



temi hat gesagt.:


> Wie soll denn der Zugriff über Parameterübergabe funktionieren?


Man übergibt die Parameter mit dem Konstruktor und hat die Parameter.



temi hat gesagt.:


> Getter/Setter ist richtig.
> Public/protected ist auch richtig.
> Es fehlt die Bewertung, der unterschiedlichen Lösungen in Hinblick auf die Datenkapselung.


ich denke dass Getter & Setter die beste Lösung ist im Hinblick auf die Datenkapselung, weil es die sicherste Methode ist.
als 2.tes würd eich public/protected nehmen & als 3.te Möglichkeit die Parameterübergabe.

was denkt ihr dazu?

Danke im Voraus, Ihr seid Klasse.


----------



## kneitzel (18. Aug 2020)

Controlling Access to Members of a Class (The Java™ Tutorials >                     Learning the Java Language > Classes and Objects)
		


Per default sind Instanzvariablen package-private.


----------



## temi (18. Aug 2020)

Codix hat gesagt.:


> Man übergibt die Parameter mit dem Konstruktor und hat die Parameter.


Da Instanzvariablen sind private, d.h. nur die Klasse Katze hat Zugriff darauf. Wie sollen die als Parameter eines Konstruktors der Klasse ElternKatze verwendet werden? Zeig mal den Code dazu!



Codix hat gesagt.:


> ich denke dass Getter & Setter die beste Lösung ist im Hinblick auf die Datenkapselung, weil es die sicherste Methode ist.
> als 2.tes würd eich public/protected nehmen


Sicherheit in Bezug auf was? Die Instanzvariablen public oder sie protected zu machen sind schon zwei Möglichkeiten und sie unterscheiden sich auch immens in Hinblick auf Datenkapselung. Überdenke deine Bewertung noch einmal und versuch endlich eine ordentliche Bewertung für jede der drei Möglichkeiten zu machen. Das ist schon seit der ersten Seite dieses Themas dein Hauptproblem bei dieser Aufgabe.


----------



## Codix (20. Aug 2020)

temi hat gesagt.:


> Da Instanzvariablen sind private, d.h. nur die Klasse Katze hat Zugriff darauf. Wie sollen die als Parameter eines Konstruktors der Klasse ElternKatze verwendet werden? Zeig mal den Code dazu!
> 
> 
> Sicherheit in Bezug auf was? Die Instanzvariablen public oder sie protected zu machen sind schon zwei Möglichkeiten und sie unterscheiden sich auch immens in Hinblick auf Datenkapselung. Überdenke deine Bewertung noch einmal und versuch endlich eine ordentliche Bewertung für jede der drei Möglichkeiten zu machen. Das ist schon seit der ersten Seite dieses Themas dein Hauptproblem bei dieser Aufgabe.



ich komme einfach nicht drauf, kannst du mir mit der Antwort bitte helfen?


----------



## kneitzel (20. Aug 2020)

Codix hat gesagt.:


> ich komme einfach nicht drauf, kannst du mir mit der Antwort bitte helfen?


Das war ja, worauf @temi dich stoßen wollte: das mit den Parametern macht keinen Sinn. Es geht um Zugriff auf die Instanzvariablen. Da macht eine Übergabe als Parameter keinen Sinn. Parameter werden immer über Call by Value übertragen. Somit kannst du nur die aktuellen Werte der Instanzvariablen übergeben. Die Frage war aber, wie man Zugriff auf die Instanzvariablen bekommen kann.

Und die Bewertung steht immer noch aus. Drei Optionen sind genannt worden von Dir: Bewerte die bitte noch. Was für Vor- und Nachteile hat jede Variante bezüglich Datenkapselung?


----------



## Codix (20. Aug 2020)

JustNobody hat gesagt.:


> Das war ja, worauf @temi dich stoßen wollte: das mit den Parametern macht keinen Sinn. Es geht um Zugriff auf die Instanzvariablen. Da macht eine Übergabe als Parameter keinen Sinn. Parameter werden immer über Call by Value übertragen. Somit kannst du nur die aktuellen Werte der Instanzvariablen übergeben. Die Frage war aber, wie man Zugriff auf die Instanzvariablen bekommen kann.
> 
> Und die Bewertung steht immer noch aus. Drei Optionen sind genannt worden von Dir: Bewerte die bitte noch. Was für Vor- und Nachteile hat jede Variante bezüglich Datenkapselung?



ich komme auf keine bessere Bewertung, tut mir leid. Könnt ihr mir bei der Bewertung bitte helfen?


----------



## kneitzel (20. Aug 2020)

Kannst du denn beschreiben, was Datenkapselung ist? Evtl. mal den Linke aus #79 gelesen?

Da sind ja Vor- und Nachteile benannt. Da kannst Du dann ja mal schauen, was bei den jeweiligen Lösungen zutrifft oder nicht zutrifft.

Das wäre aus meiner Sicht eine Vorgehensweise, die Sinn machen könnte....


----------



## Codix (20. Aug 2020)

Bewertung: bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können. Innerhalb des Konstruktors scheint mir als keine gute Lösung, da je nach Variableanzahl der Konstruktor unübersichtlich wird. 

was haltet ihr von dieser Bewertung?


----------



## temi (20. Aug 2020)

Codix hat gesagt.:


> Bewertung: bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können. Innerhalb des Konstruktors scheint mir als keine gute Lösung, da je nach Variableanzahl der Konstruktor unübersichtlich wird.
> 
> was haltet ihr von dieser Bewertung?


Leider nicht so viel 

Das mit dem Konstruktor sollte doch abgehakt sein; es ist keine durchführbare Lösung für das Problem.

Kannst du kurz erläutern was du unter Datenkapselung verstehst? Ist es besser Daten zu kapseln oder eher nicht?

Da du anscheinend noch Probleme mit den Zugriffsmodifizierern hast, hier noch einmal eine Übersicht:


ModifierClassPackageSubclassWorldpublicYYYYprotectedYYYNno modifierYYNNprivateYNNN


----------



## Codix (20. Aug 2020)

Datenkapselung in Java: Hauptsächlich Festlegung der Sichtbarkeit von Methoden und Variablen. Es ist besser Daten zu kapseln, weil sie somit sicherer sind. Sonst könnte ja jede/r drauf zugreifen.


----------



## temi (20. Aug 2020)

Codix hat gesagt.:


> Datenkapselung in Java: Hauptsächlich Festlegung der Sichtbarkeit von Methoden und Variablen. Es ist besser Daten zu kapseln, weil sie somit sicherer sind. Sonst könnte ja jede/r drauf zugreifen.


Passt doch im Grunde genommen. Es geht im Grunde darum, dass eine Klasse ihre Interna so weit wie möglich verbergen sollte. Änderungen von außen, sollten idealerweise über fachliche Methoden erfolgen.

Das nur am Rande: Fachliche Methode meint z.B.

```
// Eine Klasse Auto
Auto auto = new Auto();
auto.geschwindigkeit = 50; // schlechte Lösung, weil direkter Zugriff
auto.setGeschwindigkeit(50); // besser, aber immer noch fast direkter Zugriff
auto.beschleunigen(); // fachliche Methode: ein Auto wird beschleunigt
```

Jetzt nimm die Tabelle oben und bewerte die möglichen Lösungen. Aktuell sind die Instanzvariablen "private", d.h. nur mittels Zugriffmodifizierern hast du folgende drei Möglichkeiten:
package private, protected, public.


----------



## Codix (20. Aug 2020)

bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können.

Zugriffsmöglichkeiten:
Getter/Setter
Public/protected

_Was ist dann die dritte Möglichkeit? Kann bitte eine/r helfen?_


----------



## kneitzel (20. Aug 2020)

Was hast du schon wieder mit dem Konstruktor?

Die Aufgabe besagte doch:


> Die Klasse ElternKatze soll auf die Instanzvariable gewicht der Klasse Katze zugreifen können. Welche Möglichkeiten kennen Sie, diesen Zugriff zu ermöglichen? 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.



Also 3 Varianten. 2 bezüglich Vereinbarung der Instanzvariablen (protected / public) und 3. waren Getter/Setter ... Wieso reitest Du auf dem Konstruktor herum? Was kannst Du im Konstruktor von Katze oder ElternKatze machen, so dass ElternKatze Zugriff auf die beiden Instanzvariablen bekommt?

Also entweder kennst Du eine Möglichkeit im Konstruktor, dann solltest Du diese klar benennen / Code zeigen. Oder wenn Du da doch keine Lösung siehst, dann vergiss es in diesem Zusammenhang.



Codix hat gesagt.:


> Datenkapselung in Java: Hauptsächlich Festlegung der Sichtbarkeit von Methoden und Variablen. Es ist besser Daten zu kapseln, weil sie somit sicherer sind. Sonst könnte ja jede/r drauf zugreifen.



Und was die Datenkapselung angeht: https://de.wikipedia.org/wiki/Datenkapselung_(Programmierung) war schon einmal genannt. Das ist zwar recht kurz, aber es enthält diverse Punkte als Vor- und Nachteil. Hast Du Dir das einmal angesehen? Da sind 5 Vorteile genannt. Angesehen und verstanden?

Diese Aussage von Dir würde mir so nicht reichen, denn es ist einiges nicht wirklich enthalten.


----------



## temi (20. Aug 2020)

Codix hat gesagt.:


> _Was ist dann die dritte Möglichkeit? Kann bitte eine/r helfen?_


Das wären drei Möglichkeiten: package private, protected, public.

Schau dir noch mal die Beiträge weiter oben an, ich hatte noch etwas editiert...


----------



## kneitzel (20. Aug 2020)

Codix hat gesagt.:


> bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können.
> 
> Zugriffsmöglichkeiten:
> Getter/Setter
> ...



Du hast doch drei Möglichkeiten genannt:
1. Instanzvariablen public machen
2. Instanzvariablen protected machen
3. Getter / Setter erstellen

Datenkapselung beinhaltet, dass nicht direkt auf die internen Daten zugegriffen werden kann sondern nur über eine Schnittstelle. Dadurch sind die Internas der Klasse wirklich nur intern und die Klasse kann jederzeit angepasst werden. Also wenn man Gewicht und Farbe betrachtet, dann kann die Variable jederzeit geändert werden:
Die Farbe ist derzeit ein int Wert. Das soll evtl. später eine Instanz einer Klasse Farbe sein. Dann kann es dennoch weiterhin eine Methode int getFarbe() geben, in der dann von der Farbe-Instanz erst irgend ein int Wert ausgerechnet wird.

Oder Gewicht: getGewicht() gibt von mir aus das Gewicht in Gramm zurück. Aber die Applikation wird leider vor allem in den USA entwickelt und die wollen das nicht mehr in Gramm angeben. Die haben halt ihre Ounce und speichern daher das Gewicht als double in ounce. Dann gibt halt getGewicht() das Gewicht in Ounce * 28,35 zurück.
Oder vielleicht speichert man auch einfach das Volumen + spezifisches Gewicht und dann berechnet getGewicht daraus das Gewicht der Katze?
Was weiss ich, auf was für Ideen da ein Entwickler kommen kann....

Was die Katze intern also genau speichert ist das Geheimnis der Katze. Es gibt lediglich ein Interface nach Außen, das definiert und eingehalten werden muss (also z.B., dass int getGewicht() das Gewicht der Katze in Gramm ausgibt).


----------



## Codix (20. Aug 2020)

Danke& Respekt an alle!

drei Möglichkeiten:
1. Instanzvariablen public machen
2. Instanzvariablen protected machen
3. Getter / Setter erstellen 

Bewertung: bei protected können die Variablen aus dem selben Paket verändert werden. Ansonsten bei public von überall und bei private nur innerhalb der Klasse. Die getter und setter scheinen mir hier eine gute Lösung, da so die Variablen innerhalb der Klasse verändert werden können.

===

kann man das so stehen lassen?


----------



## temi (20. Aug 2020)

Codix hat gesagt.:


> Danke& Respekt an alle!
> 
> drei Möglichkeiten:
> 1. Instanzvariablen public machen
> ...


Hast du dir die Tabelle weiter oben mal angeschaut?

Bei protected können die Variablen aus dem selben Paket und aus abgeleiteten Klassen verändert werden.

getter/setter haben natürlich ebenfalls Sichtbarkeitsmodifizierer. Sie können public sein oder auch private (sinnlos) package-private oder protected.

Geht man von public getter/setter aus, dann würde mir eine bessere Lösung einfallen als 3. Immer daran denken es geht um Kapselung und mehr Kapselung ist besser!


----------



## thecain (20. Aug 2020)

Wenn du das als Bewertung verstehst, dann ja... Für mich ist das jetzt nur eine Erklärung was es bedeutet, aber keine Bewertung.


----------



## kneitzel (20. Aug 2020)

Die Bewertung ist zuerst nur eine Beschreibung. Es geht aber bei der Bewertung nicht darum zu erläutern, was protected oder public machen .... das kann zwar mit enthalten sein, aber das bewertet erst einmal nichts.

Bewertung könnte also etwas sein wie:
Durch das zugreifbar machen der Instanzvariablen über public oder protected gibt es Abhängigkeiten auf dieses Implementationsdetail. Änderungen an der Speicherung der Daten erfordern dann weitergehende Änderungen an Abhängigen Klassen (z.B. ElternKatze). Daher ist die Einführung von Gettern/Settern besser: die Art und Weise, wie die Daten gespeichert werden, kann jederzeit angepasst werden. Lediglich das nach außen definierte Interface muss beibehalten werden. Diese können aber jederzeit in Ihrer Funktionalität angepasst werden (also z.B. Speichern der Farbe als String und Getter/Setter wandeln von int zu String und umgekehrt).


----------



## temi (20. Aug 2020)

JustNobody hat gesagt.:


> Durch das zugreifbar machen der Instanzvariablen über public oder protected gibt es Abhängigkeiten auf dieses Implementationsdetail. Änderungen an der Speicherung der Daten erfordern dann weitergehende Änderungen an Abhängigen Klassen (z.B. ElternKatze). Daher ist die Einführung von Gettern/Settern besser: die Art und Weise, wie die Daten gespeichert werden, kann jederzeit angepasst werden. Lediglich das nach außen definierte Interface muss beibehalten werden. Diese können aber jederzeit in Ihrer Funktionalität angepasst werden (also z.B. Speichern der Farbe als String und Getter/Setter wandeln von int zu String und umgekehrt).


Wobei es darum geht einer Unterklasse den Zugriff zu ermöglichen und nicht jedem. Insofern wären hier protected getter/setter eine bessere Wahl (auch wenn das gewöhnlich nicht der Fall ist).

Außerdem würde ich public und protected nicht zusammen bewerten. Das ist schon ein deutlicher Unterschied in der Sichtbarkeit.

EDIT: Da es sich hier auch um eine Anfängeraufgabe handelt, gehe ich davon aus, dass hier als beste Lösung "protected" oder "package-private" gesucht ist. Dennoch hast du mit deiner Ausführung natürlich recht. Auf diese Weise würde die Elternklasse ihre Implementierungsdetails gegenüber der Kindklasse nicht verbergen. Wobei public getter/setter die Situation auch nicht verbessern würden.


----------



## Codix (20. Aug 2020)

temi hat gesagt.:


> Hast du dir die Tabelle weiter oben mal angeschaut?
> 
> Bei protected können die Variablen aus dem selben Paket und aus abgeleiteten Klassen verändert werden.
> 
> ...



@temi: schlag einfach eine bessere Bewertung vor, wenn du eine bessere hast. Das ich mich bemüht habe, habe ich ja schon gezeigt. Nun welche Expertenbewertung schlägst du vor?


----------



## Codix (20. Aug 2020)

also du sagst: protected, package private & getter/setter.


----------



## temi (20. Aug 2020)

Codix hat gesagt.:


> Nun welche Expertenbewertung schlägst du vor?


Lies einfach, es steht alles da. Eine beste Lösung gibt es wohl auch nicht, jede hat Vor- und Nachteile. Aber genau darum geht es bei der Bewertung.

Was ich sicher bewerten kann:

Die Instanzvariablen public zu machen, ist eine schlechte Lösung, weil dadurch voller Zugriff für Alle auf die internen Variablen möglich ist. Neben dem Sicherheitsproblem, das jeder die Werte beliebig ändern kann, kann auch die Klasse nicht geändert werden (z.B. andere Typen verwendet werden) ohne Änderung an den abhängigen Klassen machen zu müssen.


----------



## Codix (20. Aug 2020)

temi hat gesagt.:


> Lies einfach, es steht alles da. Eine beste Lösung gibt es wohl auch nicht, jede hat Vor- und Nachteile. Aber genau darum geht es bei der Bewertung.



du wolltest mal wissen wie man Parameter hier mit dem Konstruktor übergeben kann:

Katze k = new Katze(1,6);

Und in kostruktor katze werden jetzt die variablen auf 1/ 6 geändert z.b.


----------



## temi (20. Aug 2020)

Codix hat gesagt.:


> Du wolltest mal wissen wie man Parameter hier mit dem Konstruktor übergeben kann:
> 
> Katze k = new Katze(1,6);
> 
> Und in kostruktor katze werden jetzt die variablen auf 1/ 6 geändert z.b.



Es geht allerdings darum, dass die Klasse ElternKatze auf die Variablen von Katze zugreifen soll und Zugriff ist nicht nur einmaliges Schreiben beim Erzeugen einer Instanz. Du kannst zwar einen Konstruktor von ElternKatze schreiben, der über den Konstruktor von Katze diese Werte einmalig setzt, aber du kannst sie weder ändern noch lesen.


----------



## kneitzel (20. Aug 2020)

Also das war auch nur ein schneller Schuss einer Bewertung die zeigen soll, wie es prinzipiell aussehen könnte. Das hätte ich deutlicher machen müssen.

Und ja: Welcher Zugriff genommen wird könnte da auch noch betrachtet werden. Aber weiterhin alle Punkte des Wikipedia Artikels.

Dann kommt man zu einer guten Beurteilung. Denn da gehören ja auch kritische Punkte dazu. Getter / Setter zu schreiben macht ja etwas mehr Arbeit und so ....

Also um es noch einmal deutlich zu machen: Bewertung von Zu Fuß gehen, Fahrrad nutzen oder Auto nutzen um einen Brief in einen 5m entfernten Briefkasten einzuwerfen (Auto ist in der gemieteten Garage 100m entfernt, Fahrrad im Fahrradkeller der leider schwer zugänglich ist, ....) ...
Da ist eine Aussage wie "Fahrrad hat zwei Räder, das Hinterrad wird mit einer Kette über Pedale angetrieben und das Auto hat 4 Räder und ein Verbrennungsmotor, hat die Farbe Schwarz, .... " nett, aber natürlich keine Bewertung.

Bewertung ist aber die Betrachtung von:
- Zeit (wie lange dauert es)
- Aufwand (wie weit muss ich gehen, was muss ich alles machen?)
- Umwelt (Schädigung durch Abgase und so ...)
...

Man kann viel Bewerten, aber nur der ist Zustand sagt nichts aus.

Anton hat 100€.
Das ist ein Fakt, aber keine Bewertung.
Ist Anton 3 Jahre alt und will dieses Geld in Eis investieren, dann ist das eine andere Bewertung (so viel Eis kann er gar nicht essen, zu viel Geld!) als wenn Anton mit dem Geld unterwegs ist zum Notar um da ein Eigenheim in bar zu bezahlen (100€? Grundstück mit Haus ist dafür kaum zu kriegen ...)

Daher meine Bewertung nur als ersten Hinweis nehmen, in welche Richtung es gehen müsste. Und es führt kein Weg daran vorbei: um etwas in Hinsicht auf die Datenkapselung zu bewerten muss man verstehen, was Datenkapselung ist....


----------



## Codix (20. Aug 2020)

hiermit ist die Aufgabe erledigt und vom Tisch. Ich bedanke mich bei allen Unterstützern. Respekt und Danke an euch.


----------

