# Fragen zu Quelltext



## wernom (1. Mrz 2012)

Hallo ich hab ein paar Fragen zu dem folgenden Quelltext:


```
(01) class Office {
(02)
(03) public static void main(String[] args) {
(04) Stationery s1 = new PaperClips(100);
(05) /* PaperClips clip = new Stationery("Bueroklammern"); */
(06) /* s1.putBack(10); */
(07) /* s1.use(3); */
(08) printInfo(s1);
(09) printInfo((PaperClips) s1);
(10) s1.use();
(11) ((Stationery) s1).use();
(12) s1.init(15);
(13) ((PaperClips) s1).init(15);
(14) /*
(15) Consumable c1 = new Stationery("Schere");
(16) Out.println("Das Verbrauchsmaterial wurde "
(17) + (c1.getUsed() ? "" : "nicht ") + "verbraucht");
(18) */
(19) /*
(20) Consumable c2 = new Tea(500);
(21) Out.println("Das Verbrauchsmaterial wurde "
(22) + (c2.getUsed() ? "" : "nicht ") + "verbraucht");
(23) */
(24) }
(25)
(26) static void printInfo(Stationery s) {
(27) if (s instanceof PaperClips) {
(28) Out.println("Diese Bueroklammern zaehlen als Bueromaterial.");
(29) }
(30) }
(31)
(32) static void printInfo(PaperClips clips) {
(33) Out.println("Dies sind Bueroklammern.");
(34) }
(35)
(36) }
```


```
(37) public class Stationery {
(38)
(39) double price;
(40) String description;
(41) boolean used = false;
(42)
(43) public Stationery() { };
(44) public Stationery(String description) { this.description = description; }
(45)
(46) public void use() {
(47) Out.println(description + " wurde verbraucht");
(48) used = true;
(49) }
(50)
(51) public boolean getUsed() {
(52) return used;
(53) }
(54)
(55) public void init(double price) {
(56) this.price = price;
(57) }
(58)
(59) }
```


```
(60) public class PaperClips extends Stationery {
(61)
(62) static final double PRICE_PER_CLIP = 0.0083;
(63) int numberClips;
(64)
(65) public PaperClips() { }
(66) public PaperClips(int numberClips) {
(67) this.numberClips = numberClips;
(68) description = "Packung Bueroklammern";
(69) }
(70)
(71) public void use() {
(72) if (numberClips > 0) { numberClips--; }
(73) else { super.use();}
(74) }
(75)
(76) public void use(int howMany) {
(77) if (numberClips >= howMany) { numberClips -= howMany; }
(78) else { numberClips = 0; }
(79) if (numberClips == 0) { super.use(); }
(80) }
(81)
(82) public void init(int numberClips) {
(83) this.numberClips = numberClips;
(84) price = numberClips * PRICE_PER_CLIP;
(85) }
(86)
(87) public void putBack(int howMany) {
(88) this.numberClips += howMany;
(89) }
(90)
(91) }
```

Das ist aus einem Übungsblatt, das ich zur Klausurvorbereitung noch einmal durcharbeiten möchte, aber gemerkt habe einiges noch nicht richtig verstanden zu haben.

Zunächst einmal zur Frage: Was ist ein Objekt?
In der Vorlesung haben wir folgendes gehört: Objekt = gedankliche oder reale Einheit in der Umwelt
und/oder in Software. Also ein Objekt beschreibt praktisch die Gegenstände der Umwelt. 

Zu Zeile 04: Hier wird also ein Objekt Stationery erzeugt mit dem Namen s1. s1 ist also einfach nur ein Name. Zugewiesen wird dem ein Objekt aus paperClips mit dem Wert 100. 
Da der Konstruktor mit einer Zahl aufgrufen wird, wird nicht der Konstruktor aus Zeille 65 gewählt, sondern der aus Zeile 66. 
Stimmt das soweit?


----------



## x22 (1. Mrz 2012)

Ein Objekt ist eine Instanz einer Klasse.

Stell dir das so vor:

Deine Klasse heisst Fahrzeug.

Fahrzeug auto= new Fahrzeug();

das Objekt vom Typ Fahrzeug, in diesem Fall "auto" ist also eine Instanz von Fahrzeug.

In der Klasse legst du den Bauplan fest, nach dem du dein Objekt(auto) erstellen möchtest.


----------



## nillehammer (1. Mrz 2012)

Und zur Frage:


> Zu Zeile 04: Hier wird also ein Objekt Stationery erzeugt mit dem Namen s1. s1 ist also einfach nur ein Name. Zugewiesen wird dem ein Objekt aus paperClips mit dem Wert 100.
> Da der Konstruktor mit einer Zahl aufgrufen wird, wird nicht der Konstruktor aus Zeille 65 gewählt, sondern der aus Zeile 66.
> Stimmt das soweit?


Ja, das ist korrekt.


----------



## truesoul (1. Mrz 2012)

Erstmal die Antwort auf die Frage:


> Was ist ein Objekt?



Ein Objekt hat einen Zustand, ein Verhalten und eine Identität.
Ein Beispiel: 

```
public class Fahrzeug {

	// Zustand 
	private boolean isFahrtauglich = false;
	
	// Identität = fahrzeug = new Fahrzeug();
	public Fahrzeug() {}
	
	public Fahrzeug(boolean isFahrtauglich){
		this.isFahrtauglich = isFahrtauglich;
	}
	
	// Verhalten
	public void starteMotor(){
		// Führt ein Verhalten aus
	}

	public boolean isFahrtauglich() {
		return isFahrtauglich;
	}

	public void setFahrtauglich(boolean isFahrtauglich) {
		this.isFahrtauglich = isFahrtauglich;
	}
	
}
```


```
// In der Variable(fahrzeug) steckt die Identität, Verhalten und Zustand vom Objekt.
Fahrzeug fahrzeug = new Fahrzeug();
```

Edit: 

Ops, da hab ich aber ein bissl länger gebraucht als ich dachte


----------



## x22 (1. Mrz 2012)

truesoul hat gesagt.:


> Edit:
> 
> Ops, da hab ich aber ein bissl länger gebraucht als ich dachte




16 Minuten zu lange :bae:


----------



## wernom (1. Mrz 2012)

Aber in Zeile 4 wird doch s1 ein Objekt der Unterklasse zugewiesen. 

Das Erzeugen eines Objektes habe ich verstanden:
Ich habe eine Hauptklasse und eine Klasse, in der ich praktisch Methoden habe.

```
class hauptklasse{
 public static void main(String[] args){
  Klasse name1 = new Klasse();
 }
}
```
nun die Klasse

```
class Klasse{
 void methode(int zahl){
  zahl = zahl + 2;
 }
}
```

Ich habe also eine Hauptklasse, von der aus ich in der Klasse Klasse zum Beispiel mit der Methode methode die Zahl erhöhen kann.

Dies würde dann so gehen, oder?:

```
int neue zahl = name1.methode(2);
```

Ist die Klasse Klasse nun überhaupt ein Objekt? Weil meine Klasse hat ja kein Verhalten und keinen Zustand und keine Identität.

Welchen Sinn hat es denn dann überhaupt, einer Oberklassennamen ein Unterklassenobjekt so wie in Zeile 4 zuzuweisen?


----------



## nillehammer (1. Mrz 2012)

Geht es jetzt um Fragen zu Code oder um Grundlagen der Objektorientierung? Könntest du vielleicht mit einer einzelnen beantwortbaren Frage weiter machen? Bei Deinem letzten Post weiß ich jetzt nicht, wo ich ansetzen soll... ohne hier einen Roman zu schreiben.


----------



## wernom (1. Mrz 2012)

Am liebsten wäre mir eine Erklärung der Zeile 4 des Codes im Eingangstext. Also warum wird da s1 paperclips(100) zugewiesen.


----------



## ARadauer (1. Mrz 2012)

Tier tier = new Hund(); ;-)



> Also warum wird da s1 paperclips(100) zugewiesen.


zbw
Also warum wird da tier Hund() zugewiesen? ja weils da steht! oder ist die frage warum es geht? Das is besser.... Weil ein Hund ein Tier ist

public class Hund extends Tier...

ich würd mir einfach mal die Grundlagen durchlesen... 
"Was ist ein Objekt" ist echt keine Frage für ein Forum.....


----------

