Erste Schritte Fragen zu alter Java Klausur

TJ-DEXTER

Mitglied
Guten Abend,
ich hab hier eine Java-Klausur von einem alten Kurs vor mir liegen und komme mit den meisten Fragen wirklich überhaupt nicht klar. Wir schreiben kommenden Montag eine warscheinlich sehr ähnliche Klausur, deswegen hoffe, dass mir hier irgendwie geholfen werden kann :).

z.B. ist hier eine Aufgabe, bei der ich einfach nicht weiss warum die Ausgabe so und nicht anders ist
Java:
abstract class A {
          public A(){
                   init();
          }
             protected abstract void init();
             public abstract void aus();
}

public class Aufgabe8 extends A {
         private String s = "Test";
         public Aufgabe8(){
            super();
         }
         protected void init(){
            s = "Hallo!";
            System.out.println("ich bin da");
        }
        public void aus(){
            System.out.println(this.s);
        }
        public static void main(String []args){
            Aufgabe8 b = new Aufgabe8();
            b.aus();
        }
}
Hier wird Test ausgegeben, obwohl doch dem String in der Methode init Hallo zugewiesen wird.
Warum also Test?

Danke schonmal im vorraus
 
Zuletzt bearbeitet:

ARadauer

Top Contributor
@marcinek: was soll er sehen? Dass die initialiserung der Member erst nach dem super passiert? WTF das wusste ich selber nicht...
 

TJ-DEXTER

Mitglied
ah sieht schon viel besser aus mit den Java-tags ^^.
Also ich habe das Programm getestet, es gibt wie schon gesagt Test aus, aber ich versteh nicht warum
 
M

Marcinek

Gast
Dies ist bei uns eine typische Fehlerquelle.

Ursache hierür ist, dass zunächst super() bearbeitet wird. Hierdurch werden die Member der Super-Klasse und hier in diesem Fall die init() methode bearbeitet. Diese ist überschrieben und wird ebenfalls in der abgeleiteten klasse. Die setzte die Variable auf "Hallo"

Dann ist super() zu ende dann kommt der Konstruktor der eigentlichen klasse und auch dessen member BUMM.

Und in der komischen Formatierung habe ich das nicht gesehen.
 
Zuletzt bearbeitet von einem Moderator:

bobbsen

Mitglied
mein Wissensstand:

Beim Compilieren fügt der Compiler super() in den Konstruktor ein, wenn kein super(...) oder this(...) vorhanden ist.

Somit wird beim Erzeugen eines Objektes als erstes die Objekt-Hierarchie hoch bis Object durchlaufen. Von Oben herab gehts dann immer so:

1. static Variablen/Bereiche werden initialisiert/ausgeführt
2. "normale" Variablen/Bereiche werden initialisiert/ausgeführt
3. Der Konstruktor wird ausgeführt


Bei dir gibt es keine statics, von daher sieht dein Programm so aus:

Object (A erbt von Object):
statics (was auch immer)
Variablen (was auch immer)
Konstruktor (was auch immer)

A:
statics (keine vorhanden)
Variablen (keine vorhanden)
Konstruktor (init() -> s = "Hallo!"; "ich bin da")

B:
statics (keine vorhanden)
Variablen (s = "Test")
Konstruktor (Kein weiterer Code nach super())

Danach kommt mit b.aus() ein Aufruf, der nach den Variablenzuweisungen von B kam, daher kommt hier "Test" raus.
 

TJ-DEXTER

Mitglied
hab zwar nun wirklich ne ganze Weile gebraucht, aber hab es denke ich mal verstanden.
Danke vielmals erstmal. Hab da noch paar mehr Sachen bei denen ich bin mir nicht ganz sicher bin.
z.B. hier hab ich mal ein kurzes programm geschrieben bei dem ein integer im postfix zurückgegeben wird.
Java:
public class test {
    public class test {
    int bla(int e){
        return  e--;
    }
    public static void main (String []args){
        test r = new test();
        System.out.println(r.bla(5));
    }
}
Wann verändert sich bei einem postfix return der Wert ?
 

bobbsen

Mitglied
der Postfix-Operator ändert den Wert erst hinterher, deswegen auch POST

Java:
int postInc(int x){
  int tmp = x;
  x = x + 1;
  return tmp;
}

so in etwa, wenn es eine Funktion wäre (Auch wenn das x = x+1 keine Wirkung hätte)

Bei dir kopiert er deinen original Wert, erhöht das Original und gibt die Kopie dann zurück.


der Prefix-Operator (++x) wäre übrigens

Java:
int preInc(int x){
  x = x + 1;
  return x;
}
 
Zuletzt bearbeitet:

TJ-DEXTER

Mitglied
nochmal ne Frage, hab hier eine Klausurenfrage bei der einfach überhaupt kein Ansatz bzw Verständnis vorhanden ist.

Es sei das Interface MaterialGewicht gegeben.

Java:
interface MaterialGewicht
{
    boolean validMaterialTyp(int materialTyp);
    int getGewicht(int materialTyp);
}

Gegegeben sei ein Objekt g vom Typ MaterialGewicht. Implementieren sie eine Klasse GewichtVerdoppler, welche das Interface Materialgewicht implementiert und das Gewicht, welches man von g bekommen hat, verdoppelt und zurückgibt.


Ich verstehe schon überhaupt nicht wie man überhaupt ein Objekt von Typ g haben soll. Ich dachte von Interfaces lassen sich keine Objekte erstellen.
 

bobbsen

Mitglied
Die meinen wahrscheinlich nicht die Klasse selber, sondern den Typ der Variable.

Java:
MaterialGewicht mg = new KlasseDieMaterialGewichtImplementiert();

und gesucht wird wohl sowas sein:

Java:
class KlasseDieMaterialGewichtImplementiertMitDoppeltemGewicht implements MaterialGewicht {
	MaterialGewicht mg = null;
	public KlasseDieMaterialGewichtImplementiert(MaterialGewicht mg) {
		this.mg = mg;
	}
	public boolean validMaterialTyp(int materialTyp) {
		return mg.validMaterialTyp(materialTyp);
	}
	public int getGewicht(int materialTyp) {
		return 2 * mg.getGewicht(materialTyp);
	}
}

KlasseDieMaterialGewichtImplementiert mg = new KlasseDieMaterialGewichtImplementiert();
KlasseDieMaterialGewichtImplementiert doppelt = new KlasseDieMaterialGewichtImplementiertMitDoppeltemGewicht(mg);
 

TJ-DEXTER

Mitglied
Darauf wär ich nie gekommen, danke.

noch eine letzte Frage,

hab hier das Programmstück
Java:
ActionListener al1 = new MyActionListener();
ActionListener al2 = new MyActionListener();
ActionListener al3 = new MyActionListener();
JButton b = new JButton();
b.addActionListener(al1);
b.addActionListener(al2);
b.addActionListener(al3);
b.addActionListener(al1);

Welcher Listener wird hier zuerst benachrichtigt, oder ist das garnicht definiert und wie oft wird al1 notified?
 

TJ-DEXTER

Mitglied
also ich hab hier noch 2 weitere Programme getestet, bei denen ich auch nicht ganz nachvollziehen kann warum und weshalb

in diesem programm soll ein fehler sein, jedoch kann ich ihn nicht finden und der compiler zeigt mir auch nichts an
Java:
public class Test1 {
   protected Integer []wert = new Integer[4];
   public static void main(String []s){
             Test1 t = new Test1();
             for (int i=0;i<4;i++){
                  System.out.println(t.wert[i].toString());
             }
   }
}

hier wird natürlich überall eine 0 ausgegeben aber das ist doch kein Fehler, sondern Definitionssache

und hier noch eins was ich nicht ganz versteh
Java:
class Data {
    protected int daten = 0;
    Data (int x){setData(x); }
    public void setData(int x){ daten = x; }
    public int getData() {return data++;}
}

//Hier ist das main
Data d1 = new Data(10);
Data d2 = new Data(10);
Data d3=  d1;
d1.setData(20);
d1 = newData(30);
System.out.println(d1.getData());
System.out.println(d2.getData());
System.out.println(d3.getData());

Die Ausgabe ist hier d1=30 d2=10 und d3 = 20(WARUM UM GOTTES WILLEN 20?)
Ich würde bei d3 ja eigetlich nur 30 nachvollziehen können.
Ich dachte die Referenz d3 zeigt auf d1, dem zu Folge zeigt d3 immer auf das selbe Objekt wie d1,
ergo sollte doch 30 rauskommen, bitte um Hilfe :(
 
Zuletzt bearbeitet:
M

Marcinek

Gast
Bei der ersten Schleife ist for(int i) hier fehlt ein Leerzeichen und die Elemente im Array sind alle null.

Du erhälst hier eine NPE wenn du .toString() ausführtst. Lass doch das Programm einmal laufen?


d1 und d3 sind identisch. Danach machst du new Data() und hast in dem einen eine andere adresse als vorher drin.
 

Marco13

Top Contributor
1. Es wird nur ein Array erstellt, der aber keine Elemente enthält (bzw. alle Elemente sind "null").
2. Mit
d1 = new Data(30);
wird ein neues Objekt erstellt. Die Referenz d1 zeigt nun auf dieses Neue Objekt (mit dem Wert 30), während d3 noch auf das alte Objekt (mit dem Wert 20) zeigt.
 

TJ-DEXTER

Mitglied
1. Es wird nur ein Array erstellt, der aber keine Elemente enthält (bzw. alle Elemente sind "null").
2. Mit
d1 = new Data(30);
wird ein neues Objekt erstellt. Die Referenz d1 zeigt nun auf dieses Neue Objekt (mit dem Wert 30), während d3 noch auf das alte Objekt (mit dem Wert 20) zeigt.

Also ist der Fehler im ersten Programm, dass die Elemente nicht initialisiert wurden und ich dadurch die NullPointerException erhalte, oder warum kompiliert das Programm ohne toString problemlos, jedoch mit toString eben nicht ?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Bei
System.out.println(irgendwas);
wird GROB SINNGEMÄSS sowas gemacht wie
Java:
if (irgendwas == null) gibAus("null");
else gibAus(irgendwas.toString());
 

Neue Themen


Oben