# Fragen Klasse vs Instanz



## kathrin1 (2. Feb 2011)

hallo,

ich hab hier ein paar fragen, bei denen ich mir nicht so ganz sicher bin, ob ich die richtig beantwortet habe.

"objekte einer klasse können ausschließlich durch einen konstruktor aufruf erzeugt werden"

würde ich sagen ja.


"instanzmethoden dürfen auf klassenattribute zugreifen"
richtig?

"Klassenmethoden drüfen auch instanzattribute zugreifen"
soweit ich weiß ist das falsch weil klassenmethoden nur auf klassenattribute zugreifen können?

"zwei objekte der selben klassen besitzen stehts identische methoden"

falsch?

"pro quelldatei darf es in einem java programm nur eine public klasse geben"

richtig?

"ein private attribut darf nur durch public methoden verändert werden"
wahrscheinlich falsch?


gruß kathrin


----------



## maki (2. Feb 2011)

*verschoben*


----------



## SlaterB (2. Feb 2011)

wäre schön wenn du bei jedem noch Begründung zu deinen Vermutungen schreiben würdest, 
auf die man eingehen könnte statt nur Lösungen zu nennen (bzw. zu versuchen),

> "Klassenmethoden drüfen auch instanzattribute zugreifen"
> soweit ich weiß ist das falsch weil klassenmethoden nur auf klassenattribute zugreifen können?

wenn du weißt was ein Objekt ist und was stattdessen statisch ist, sind solche Zusammenhänge doch klar,
Instanzattribute gibt es nur wenn es auch Instanzen gibt, eine statische Methode könnte aber auch ausgeführt werden, ohne dass je ein Objekt dieser Klasse existiert hat, dann ist doch klar dass der Zugriff gar nicht denkbar ist,
falls es aber ein oder mehrere Objekte der Klasse gibt und die statische Methode diese kennt, dann kann sie strenggenommen auch auf dessen Instanzattribute zugreifen, sogar wenn diese private sind

sofern das zählt wäre also der Zugriff denkbar, strukturell im Grunde nicht vorgesehen,
was du nun daraus machen willst als Antwort musst du selber wissen


----------



## Swoop (2. Feb 2011)

> "zwei objekte der selben klassen besitzen stehts identische methoden"
> 
> falsch?



ich würde sagen richtig. Ein Object a hat die gleichen Methoden wie Object b!



> "pro quelldatei darf es in einem java programm nur eine public klasse geben"
> 
> richtig?



meinst du die Main methode? 



> "ein private attribut darf nur durch public methoden verändert werden"
> wahrscheinlich falsch?



genau falsch.

Gruß Swoop


----------



## Marco13 (2. Feb 2011)

kathrin1 hat gesagt.:


> "objekte einer klasse können ausschließlich durch einen konstruktor aufruf erzeugt werden"
> 
> würde ich sagen ja.



Dein Lehrer will "Ja" hören. Die Wahrheit ist: "Nein". Siehe JNI Functions :smoke:


----------



## kathrin1 (2. Feb 2011)

Swoop hat gesagt.:


> meinst du die Main methode?



hmm weiß nicht. der satz stand genauso da. und man soll halt mit ja oder nein ankreuzen


----------



## Gonzo17 (2. Feb 2011)

Swoop hat gesagt.:


> meinst du die Main methode?



Ne, wie kommst du dadrauf? Es geht bei der Frage denke ich einfach nur darum, ob in einer Datei mehrere Klassen sein dürfen, die dann auch noch public sind. Das ist nicht erlaubt, es darf nur genau eine public class in einer Datei geben.


----------



## schalentier (2. Feb 2011)

Gonzo17 hat gesagt.:


> Das ist nicht erlaubt, es darf nur genau eine public class in einer Datei geben.




```
public class Foo {
  public class Bar {
  }
}
```

Das sind zwei public Klassen in einer Quellcodedatei. Das ist halt das Problem an Multiple Choice, es ist oftmals nicht eindeutig. Ich wuerde vermutlich "richtig" ankreuzen (nur eine Klasse pro Datei), oder "falsch" und obige 4 Zeilen mit auf den Zettel kritzeln und hoffen das der Test von einem Mensch korrigiert wird...


----------



## Andi_CH (2. Feb 2011)

kathrin1 hat gesagt.:


> "zwei objekte der selben klassen besitzen stehts identische methoden"
> 
> falsch?


Nein: richtig! Die Objekte sind identisch haben identische Methoden und identische Attribute
Nur die Werte der Attribute unterscheiden sich im Allgemeinen.



kathrin1 hat gesagt.:


> "pro quelldatei darf es in einem java programm nur eine public klasse geben"
> 
> richtig?


Jein - Es gibt genau eine public Klasse die gleich heisst wie die Datei. Innerhalb dieser public klasse darf es weitere public Klassen geben. Im folgenden Code ist die Klasse Test50 korrekt, aber eigentlich heisst die ja Test5.Test50

Die Klasse Test51 ist nicht korrekt: Fehlermeldung 
	
	
	
	





```
The public type Test51 must be defined in its own file
```

Die Klassen Test52 und Test53 sind auch ok ist hingegen korrekt und gültig. Ich würde zwar davon abraten Konstrukte wie 52 und 53 zu verwenden. Klassen innerhalb von Klassen ist schon eher sauber, auch wenn es nicht exzessiv betrieben werden sollte 


```
public class Test5 {
	public class Test50 {
	}
}
public class Test51 {
}

abstract class Test52 {
}

final class Test53 {
}
```


----------



## kathrin1 (2. Feb 2011)

Swoop hat gesagt.:


> genau falsch.



also darf ein privat attribute gar nicht mehr verändert werden? doch darf es wohl oder?
privat hat ja sowiso nix mit veränderugen zu tun sondern eher mit zugriff oder verändern wäre doch eher final? also das es nicht mehr geht.


----------



## Landei (2. Feb 2011)

"objekte einer klasse können ausschließlich durch einen konstruktor aufruf erzeugt werden"
nein, auch durch clone() oder Deserialisierung

"instanzmethoden dürfen auf klassenattribute zugreifen"
ja

"Klassenmethoden drüfen auch instanzattribute zugreifen"
nein.

"zwei objekte der selben klassen besitzen stehts identische methoden"
ja.

"pro quelldatei darf es in einem java programm nur eine public klasse geben"
ja.

"ein private attribut darf nur durch public methoden verändert werden"
nein.


----------



## kathrin1 (2. Feb 2011)

Landei hat gesagt.:


> "objekte einer klasse können ausschließlich durch einen konstruktor aufruf erzeugt werden"
> nein, auch durch clone() oder Deserialisierung
> 
> "instanzmethoden dürfen auf klassenattribute zugreifen"
> ...



danke


----------



## Gonzo17 (2. Feb 2011)

schalentier hat gesagt.:


> ```
> public class Foo {
> public class Bar {
> }
> ...







Landei hat gesagt.:


> "pro quelldatei darf es in einem java programm nur eine public klasse geben"
> ja.



Ja wie jetzt? ???:L


----------



## tfa (2. Feb 2011)

Eine public "Top-Level-Klasse".


----------



## Andi_CH (2. Feb 2011)

Das Beispiel von Schalentier und auch meines zeigen dasselbe (es zeigt sich auch wieder einmal mehr, dass die poster nicht den ganzen Thread lesen :-( )

Auf oberster Ebene darf es nur eine public Klasse geben!
Darin verschachtelt können weitere public Klassen vorkommen.

Beantworte die Frage ruhig mit "JA - es darf nur eine Klasse geben" denn die Klasse Bar von Schalentier oder meine Test50 sind nicht direkt ansprechbar sondern nur über die umschliessende Klasse

foo.bar.....

Aber jetzt mal eine Frage: warum probierst du das nicht einfach aus?


```
public class Test {

	public static void main (String[] args) {
		Foo bargruender = new Foo();
		Foo.Bar meineLieblingsbar =  bargruender.createBar();
		meineLieblingsbar.order("Capirinha");
	}
}
```


```
public class Foo {
	public class Bar {
		public void order(String drink) {
			System.out.println("Hey Mixer - make a " + drink);
		}
	}
	
	public Bar createBar() {
		return new Bar();
	}
}
```


(By the way: Gibt es echt keine Möglichkeit Bar direkt zu instanzieren? 

```
new Foo.Bar()
```


----------



## tfa (2. Feb 2011)

> Gibt es echt keine Möglichkeit Bar direkt zu instanzieren?




```
new Foo().new Bar();
```
sollte gehen.


----------



## Andi_CH (2. Feb 2011)

Also mehrere public Klassen sind unter bestimmten Bedingungen möglich und verwendbar


```
public class Test2 {
	public static void main (String[] args) {
		Foo bargruender = new Foo();
		Foo.Bar meineLieblingsbar =  bargruender.createBar("Strandbar");
		meineLieblingsbar.order("Capirinha");
		Foo.Bar meineLieblingsbar2 = new Foo().new Bar("Sandbar");
		meineLieblingsbar2.order("Sandwich");
	}
}
```


```
public class Foo {
	public class Bar {
		private String mName;
		public Bar (String pName) {
			mName = pName;
		}
		public void order(String drink) {
			System.out.println("Bar " + mName + " Hey Mixer - make a " + drink);
		}
	}
	
	public Bar createBar(String pName) {
		return new Bar(pName);
	}
}
```


----------



## schalentier (2. Feb 2011)

```
public class Foo {
  public static class Bar {
  }
}

new Foo.Bar();
```

Das geht auch. Und von Top-Level-Class (heisst das so?) hab ich nix gelesen in der Frage.


----------



## Andi_CH (2. Feb 2011)

Ja aber ich wollte eben nicht static hinschreiben  obwohl ich keinen grossen Unterschied weiss.


----------



## tfa (2. Feb 2011)

Andi_CH hat gesagt.:


> Ja aber ich wollte eben nicht static hinschreiben  obwohl ich keinen grossen Unterschied weiss.



Ohne static ist es eine "inner Class". Mit static eine ganz normale Klasse, die in einer anderen "nested" definiert ist. Ein Objekt einer inner Class braucht immer ein äußeres Objekt, deswegen new Foo().new Bar(). Bei der statischen Klasse ist das nicht so. Wenn möglich sollte man immer die statische Variante wählen.


----------



## reibi (2. Feb 2011)

schalentier hat gesagt.:


> Das geht auch. Und von Top-Level-Class (heisst das so?) hab ich nix gelesen in der Frage.



Bin der selben Meinung wie das Schalentier!

Absolut korrekte Ausdrucksweise kann man auch von einem, und gerade von einem (Programmier)Lehrer erwarten.(Boolsche Algebra !!!)
Gibt der Dir keine Punkte für die Frage, würd ich Ihm das Gegenteil beweisen und bei ner Diskussion ein Fass aufmachen


;-)


----------



## schalentier (2. Feb 2011)

Naja, ohne das static hat die Klasse Bar immer eine Referenz auf eine Instanz von Foo (Zugriff aus Bar: Foo.this). Deshalb brauchst du immer auch eine Instanz von Foo.

Mit static ist Bar eine ganz normale Klasse, ohne Bezug zu Foo, ausser das man halt immer Foo.Bar schreiben muss.


----------

