Skip to content

Commit

Permalink
Beginn der Überarbeitung.
Browse files Browse the repository at this point in the history
  • Loading branch information
denkspuren committed Jan 15, 2017
1 parent e4dcdfe commit 3123c26
Showing 1 changed file with 123 additions and 27 deletions.
150 changes: 123 additions & 27 deletions Fragen/Kap.10.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,28 @@ Herr Kofler nennt welche Vorteile, die Objektorientierung bietet?

ifdef::solution[]
.Antwort
// TODO
* Bessere Strukturierung des Codes
* Kapselung von Daten
* Bessere Wiederverwertbarkeit
* Pakete und Klassenbibliotheken
endif::solution[]

### Frage
Wann ist eine Klasse *keine* _top level_-Klasse?

ifdef::solution[]
.Antwort
Wenn sie innerhalb von geschweiften Klammern steht.
endif::solution[]
[question,mc]
--
Wann ist eine Klasse *keine* Top-Level-Klasse?

- [ ] Wenn die Klasse nicht oben im Quellcode steht.
- [x] Wenn die Klasse innerhalb von geschweiften Klammern steht.
- [ ] Wenn die Klasse `static` ist.
- [ ] Wenn die Klasse `abstract` ist.
--
### Frage
[question,mc]
--
Kann man eine Klasse derart in einer Methode deklarieren und nutzen?
----
void foo() {
class StrangeThing {
Expand All @@ -32,72 +42,158 @@ void foo() {
System.out.println(thing.isStrange);
}
----
Geht das?

ifdef::solution[]
.Antwort
Das geht. Es handelt sich hier um eine lokale Klassendefinition, die nur innerhalb der Methode `foo` verwendet werden kann.
endif::solution[]
- [x] Ja, es handelt sich hier um eine lokale Klassendefinition
- [ ] Ja, es ist egal, ob eine Klasse in einer Methode deklariert wird oder umgekehrt
- [ ] Nein, die Klasse müsste `public` sein.
- [ ] Nein, die Klasse müsste `static` sein.
--
### Frage
Wie sieht schematisch die Syntax zur Klasse aus? [ohne Annotationen und Generics]
Wie sieht schematisch die Syntax zur Deklaration einer Klasse aus [ohne Annotationen und Generics]?

ifdef::solution[]
.Antwort
----
[Modifizierer] class Name [extends KlassenName] [implements I1, I2, ...]
[Modifizierer] `class` Name
[`extends` NameOberKlasse]
[`implements` I1, I2, ...] `{`
// Klassenrumpf (class body)
`}`
----
endif::solution[]

### Frage
[question,mc]
--
In einer `.java`-Datei können mehrere Klassen deklariert werden. Allerdings gilt eine Einschränkung, was den Namen der Datei angeht. Welche?

- [ ] Der Name der Datei muss mit dem Namen der ersten Klasse in der Datei übereinstimmen.
- [ ] Der Dateiname muss wie der Klassenname mit einem Großbuchstaben beginnen.
- [ ] Der Dateiname muss die Endung `.class` haben.
- [x] Wenn eine der Klassen `public` ist, muss der Name der Datei dem Namen dieser Klasse entsprechen.
--
### Frage
[question,mc]
--
Schreibe `class test` und schon ist der Kopf ab, bevor auch nur ein `{` folgt. Warum? [Gemeint ist Ihr Kopf, nicht der der Klassendeklaration (-:]

- [ ] Vor `class` fehlt ein `public`.
- [ ] Es muss `Class test` heißen.
- [x] Es muss `class Test` heißen.
- [ ] Der Name `test` ist reserviert und darf nicht benutzt werden.
--
ifdef::solution[]
.Antwort
Wenn eine der Klassen öffentlich (`public`) ist, muss der Name der Datei dem Namen dieser Klasse entsprechen.
Namen von Klassen beginnen immer mit einem Großbuchstaben! Zwar ist das eine Konvention, an die sich aber ausnahmslos alle Java-Entwickler/innen halten.
endif::solution[]

### Frage
Schreibe `class test` und schon ist der Kopf ab, bevor auch nur ein `{` folgt. Warum? [Gemeint ist Ihr Kopf, nicht der der Klassendeklaration :upside_down_face:!)
[question,mc]
--
Eine Top-Level-Klasse darf wie *nicht* deklariert sein?

- [ ] public
- [ ] paketsicher
- [x] private
- [x] protected
--
### Frage
Gibt es in Java das Laufzeitkonstrukt der Klasse?

ifdef::solution[]
.Antwort
Es sollte `class Test` heißen. Namen von Klassen werden großgeschrieben.
Nein. Zu einer Klasse `class A {}` gibt es kein Laufzeitkonstrukt, womit man auf die Klasse direkt zugreifen könnte. Mit `A.class` erhält man lediglich Zugriff auf ein Objekt, das eine Beschreibung der Klasse `A` darstellt. Diese Fähigkeit zur Selbstauskunft über die deklarierten Eigenschaften der Klasse nennt man Reflektion (_reflection_). Für eine Instanz der Klasse bekommt man mit `getClass()` an das Objekt, das die Klasse `A` beschreibt.
endif::solution[]

### Frage
Eine _top level_-Klasse darf welche Sichtbarkeiten *nicht* haben?
Gibt es in Java das Laufzeitkonstrukt des Objekts?

ifdef::solution[]
.Antwort
`private` und `protected` sind nicht erlaubt, da eine Toplevel-Klasse sich nicht im Kontext einer anderen Klasse befindet und diese Sichtbarkeiten somit keinen Sinn ergeben.
Ja. Die Instanzen einer Klasse, gemeinhin als Objekte bezeichnet, existieren ausschließlich zur Laufzeit.
endif::solution[]

### Frage
Gibt es in Java das Laufzeitkonstrukt der Klasse?
[source,java]
----
class Thing {
private class PartOfThing {
String name = "part";
}
}
----
Geht das?

ifdef::solution[]
.Antwort
Nicht direkt, man kann nur darauf zugreifen mittels _reflection_ ( `Objektname.getClass()` bzw. `Klassenname.class`).
Ja, das geht. Die Klasse `PartOfThing` ist allerdings nur innerhalb des Rumpfs von `Thing` verwendbar.
endif::solution[]

### Frage
Gibt es in Java das Laufzeitkonstrukt des Objekts?
[question,mc]
--
[source,java]
----
class Thing {
private class PartOfThing { }
public PartOfThing pot = new PartOfThing();
}
----
Wie kann auf `pot` innerhalb des Pakets zugegriffen werden?

- [ ] `Thing.pot`
- [ ] `new Thing().pot`
- [ ] `new Thing.PartOfThing().pot`
- [x] gar nicht
--
ifdef::solution[]
.Antwort
Ja.
Auf die private, innere Klasse kann von außen weder zugegriffen werden, noch sind Instanzen dieser privaten Klassen zugreifbar, selbst wenn die Klassenvariable `public` ist!

----
jshell> Thing.pot
| Error:
| non-static variable pot cannot be referenced from a static context
| Thing.pot
| ^-------^
jshell> new Thing().pot
| Error:
| Thing.PartOfThing has private access in Thing
| new Thing().pot
| ^
jshell> new Thing.PartOfThing().pot
| Error:
| Thing.PartOfThing has private access in Thing
| new Thing.PartOfThing().pot
----
endif::solution[]

### Frage
[question,mc]
--
[source,java]
----
class Thing {
private class PartOfThing {
String name = "part";
}
class PartOfThing { }
public PartOfThing pot = new PartOfThing();
}
----
Geht das?
Wie kann auf `pot` innerhalb des Pakets zugegriffen werden?

- [ ] `Thing.pot`
- [x] `new Thing().pot`
- [ ] `new Thing.PartOfThing().pot`
- [ ] gar nicht
--
// XXX HIER

### Frage
Auf welcher Ebene ist die Klasse `class A {}` sichtbar?
Expand Down Expand Up @@ -461,7 +557,7 @@ jshell> $38.foo(3)
$39 ==> 3
----

Eine _top level_-Klasse als `static` zu deklarieren ist sinnfrei, da die Klasse an nichts "hängt" und nur Teil eines Pakets ist.
Eine Top-Level-Klasse als `static` zu deklarieren ist sinnfrei, da die Klasse an nichts "hängt" und nur Teil eines Pakets ist.
endif::solution[]

### Frage
Expand Down

0 comments on commit 3123c26

Please sign in to comment.