Probleme mit Konstruktor

yxy

Lieutenant
Registriert
Juli 2014
Beiträge
556
Hallo,

beschäftige mich gerade etwas mit Klassen und Objekten.
Es geht um folgenden Code:
Code:
package Übung7_LaengeUndStrecke;

public class Point {

    //Objekteigenschaften
    private double x;
    private double y;
    private double z;

    //Klasseneigenschaften
    public static int anzahlErzeugterPunkte = 0;

    //Konstruktor
    public Point(double newX, double newY, double newZ) {

        anzahlErzeugterPunkte++;
        x = newX;
        y = newY;
        z = newZ;
    }

    //Methoden
    //Berechnung des Abstands von einem Punkt zum anderen
    public double distance(Point point2) {
        
        double distance = Math.sqrt(Math.pow(x - point2.x, 2) + Math.pow(y - point2.y, 2) + Math.pow(z - point2.z, 2));
        return distance;
    }

    @Override
    public String toString() {

        return "Koordinaten des Punktes (" + x + y + z + " )";
    }

}

Code:
package Übung7_LaengeUndStrecke;

import java.util.Scanner;
import java.awt.Point;

public class Geometry {
    
    Scanner kbdInput = new Scanner (System.in);
    
    public static void main (String[] args){
        run();
        //Geometry geoManager = new Geometry();
        //geoManager.run();
    }
    
    //Benutzerabfrage nach nächster Aktion
    public static void run(){
        
        //Punkte einlesen durch Aufruf von readPoint()
        Point newPoint = readPoint();
        
        //Abstand berechnen durch Aufruf von distance()
        
    }
    
    //Punkt erzeugen
    public static Point readPoint(){
    
        //Aufruf von readCoordinate() um Koordinaten einzulesen
        double x = readCoordinate("x");
        double y = readCoordinate("y");
        double z = readCoordinate("z");
        
        Point firstPoint = new Point(x, y, z); //Hier meckert er, dass er keine Konstruktor kennt mit 3 double als Parameter
        
        return firstPoint;
    }
    
    //Einlesen der Koordinaten eines Punktes
    public static double readCoordinate(String coorName){
        if(coorName == "x"){
            return 3.0;
        }
        if(coorName == "y"){
            return 4.0;
        }
        if(coorName == "z"){
            return 5.0;
        }
        return 0;
    }
}

Er meckert, dass er keinen Konstruktor in der Klasse Point kennt mit 3 double als Parameter.
Ergänzung ()

Habe den Fehler gefunden.
Ich darf die Bibliothek: import java.awt.Point;
nicht importieren, wenn ich die eigene Klasse Point nutzen will.
 
Wenn dein Import sagt "java.awt.Point", dann sind automatisch alle "Point" Typen in der Datei vom Typ java.awt.Point.

Die Import Anweisungen sind allerdings nur Shortcuts. D.h. Du kannst auch "new java.awt.Point(...)" schreiben, oder "new meinPackage.subPackage.KlassenName(...)".

Da du aber sonst nirgends "Point" benutzt, gehe ich davon aus, dass du überall DEINE Point Klasse benutzen willst. Also lösch die "import java.awt.Point" Zeile und importiere deine eigene Klasse.
 
Zuletzt bearbeitet:
Ok, danke.
Hätte aber noch kurz eine Frage zu oberem Code in der main Methode.

Mein Lehrer hatte schon folgendes Vorgegeben:
Code:
public class Geometry {
    
    Scanner kbdInput = new Scanner (System.in);
    
    public static void main (String[] args){
        Geometry geoManager = new Geometry();
        geoManager.run();
    }

Ich weiß aber nicht was er mit:
Code:
Geometry geoManager = new Geometry();
geoManager.run();
bezwecken will.

Ist Geometry eine vererbte Klasse?
 
Wenn Geometry irgendwas geerbt hätte, würde dort "class Geometry extends ..." oder "class Geometry implements ..." stehen.

Was er damit bezwecken möchte, kann ich dir nicht mit absoluter Gewissheit sagen. Aber ich vermute mal, dass es einfach "etwas objektorientierter" aussehen soll.

Beispiel(e):

Code:
public class Geometry {

  public static void main(String[] args) {
    // der hier ausgeführte Code steht zwar in der Geometry 
    // Klasse. Aber der Code hängt in keiner weise mit einem
    // Geometry Objekt zusammen.
    run();
  }

  public static void run() {
    // genau so wie der Code hier drin
  }

}

Code:
public class Geometry {

  public static void main(String[] args) {
    Geometry geo = new Geometry();
    geo.run();
  }

  public void run() { // hier steht KEIN static mehr
    // der Code hier drin ist an ein Geometry Objekt gekoppelt
  }

}

Die main Methode wird ja für gewöhnlich zum Starten der Programme benutzt. Aber der darin enthaltene Code ist eigentlich komplett unabhängig von der Klasse in der er steht.

In anderen Sprachen kann man auch sowas schreiben:
Code:
public class Geometry {
  public void run() {
    // ...
  }
}

Geometry geo = new Geometry();
geo.run();
Da sieht man dann deutlich, dass der "main" Code rein gar nichts mit der Klasse zu tun hat, in der er steht.
 
Code:
    public class Geometry {
     
      public static void main(String[] args) {
        Geometry geo = new Geometry();
        geo.run();
      }
     
      public void run() { // hier steht KEIN static mehr
        // der Code hier drin ist an ein Geometry Objekt gekoppelt
      }
     
    }

So ganz klar ist mir das leider noch nicht.

1. Ich sage mit
Code:
 Geometry geo = new Geometry();
dass ein neues Objekt von der Klasse Geometry erstellen werden soll.
Aber dieser Befehl steht doch selber in der Klasse Geometry.
Oder kann ich das so verstehen, dass die main "funktional" nicht in der Klasse steht?

2. Warum muss ich ein Objekt der Klasse Geometry erstellen? Bzw. welche Vorteile bietet das?
 
Ja, genau. Du erstellst damit ein neues Geometry Objekt.
So ein Objekt kannst du erstellen wo du willst (außer vielleicht im Geometry Konstruktor, weil du sonst eine Endlosschleife bekommen würdest).

Von der Funktionalität macht es keinen Unterschied wo das Objekt erstellt wird bzw. ob man überhaupt eins erstellt. In deinem Fall kann man das wohl als "Geschmackssache" bezeichnen.

Grundsätzlich kann man halt sagen, dass man in einer Objektorientierten Sprache (hauptsächlich) mit Objekten arbeitet. Und die "main" Methode ist quasi ein erzwungenes nicht-objektorientiertes Konstrukt, damit man das Programm irgendwie starten kann. Also will dein Lehrer mit dem Code einfach so schnell wie möglich in eine Objektorientierte Welt "wechseln".

Alles was in Java mit "static" versehen ist, ist quasi entkoppelt von den Objekten. So wie z.B. die main Methode oder auch deine "readCoordinate" Methode und dein "int anzahlErzeugterPunkte". Heißt: Diese Funktionen und Werte stehen unabhängig von einem Objekt zur Verfügung.

Oder noch ein anderer Ansatz / Grund: (trifft zwar nicht auf dein Beispiel zu, aber ...) Wenn man die Funktionalität der Geometry Klasse mehrfach braucht, dann sollte man auch Geometry Objekte erzeugen und damit arbeiten. Mit static Methoden kommt man sonst nicht weit.

Du kannst dein Programm natürlich auch komplett ohne Objekte zum laufen bringen. Wenn man den Code z.B. in C schreiben würde, dann wäre man dazu gezwungen. Das Ergebnis ist natürlich dasselbe, aber der Code sieht am Ende anders aus.

Hier ein bisschen Beispiel Code, vielleicht wird's dann etwas deutlicher:
Code:
public class Application {
	public static void main(String[] args) {
		// Foo.counter++; geht nicht, weil counter Teil eines Objekts ist
		Foo.staticCounter++;
		
		// Foo.bar(); geht nicht, weil bar() Teil eines Objekts ist
		Foo.staticBar();
		
		Foo fooObj = new Foo();
		fooObj.counter++;
		// fooObj.staticCounter++; das "kann" man zwar machen, aber man wird drauf
		// hingewiesen, dass man hier über das Objekt "fooObj" auf einen Wert zugreift
		// der unabhängig von fooObj ist. Der Wert ist Teil der Klasse selbst.
		
		fooObj.bar();
		// fooObj.staticBar(); hier gibt's denselben Hinweis: Möglich, aber nicht "schön". 
	}
}

public class Foo {

	int counter = 0;
	static int staticCounter = 0;
	
	public void bar() {
		
	}
	
	public static void staticBar() {
		
	}

}

Die static Werte und Methoden sind Teil der Klasse selbst und nicht Teil eines Objekts. Der Zugriff über ein Objekt auf die static Werte und Methoden ist zwar möglich in Java, aber man sollte es nicht machen.
 
... Heißt: Diese Funktionen und Werte stehen unabhängig von einem Objekt zur Verfügung.
Und das heißt? Eine in der Klasse definierte Variable z.B. static int a=0 hat immer den Wert Null, egal welches Objekt (das ich aus der Klasse erzeugt habe) ich betrachte. Wenn ich nun irgendwo a ändere, ändert sich damit das a in allen von der Klasse abgeleiteten Objekten. Richtig?

Bei Funktionen muss ich bei static nicht schreiben "Objekt.Funktion" sondern einfach "Funktion". Die Funktion kann ich also auf alle Objekte einer Klasse anwenden. Hier habe ich aber ein Verständnisbroblem: Wenn ich die Funktion nicht als static definiere, dann kann ich sie doch aber trotzdem in jedem abgeleiteten Objekt nutzen. Sie wird ja dann von der Klasse an das Objekt vererbt. Aber auch bei static ist die Funktion für jedes Objekt aufrufbar :/


Wenn man die Funktionalität der Geometry Klasse mehrfach braucht, dann sollte man auch Geometry Objekte erzeugen und damit arbeiten. Mit static Methoden kommt man sonst nicht weit.

Was meinst Du mit der Funktionalität? Könntest du dazu vielleicht ein kurzes Beispiel schreiben?

Danke für deine bisherige Hilfe :)

P.S. Habe bisher hauptsächlich in C programmiert, darum fällt mir das mit der Objektorientierung noch etwas schwer.
 
Okay, wenn du mit C halbwegs vertraut bist, dann versuche ich es mal so:

Wenn du in Java folgende Klasse hast:
Code:
public class Foo {
  int counter = 0;
  static int staticCounter = 0;
}
Dann wird direkt Speicher für "staticCounter" belegt. Weil diese Variable global (unabhängig von Objekten (= Instanzen der Klasse)) zur Verfügung steht. "counter" belegt erstmal keinen Speicher, weil "counter" Teil einer Instanz der Klasse wäre, aber wir haben ja noch keine Instanz davon erzeugt.

Wenn du nun irgendwo:
Code:
Foo foo = new Foo()
aufrufst, dann erzeugst du eine Instanz der Klasse (also ein Objekt) und nun wird Speicher für "counter" belegt. Aber es wird kein neuer Speicher für "staticCounter" belegt, weil diese Variable Teil der Klasse an sich ist. Und eine Klasse kann (im Normalfall) nur ein einziges mal existieren. Aber du kannst von einer Klasse beliebig viele Objekte (= Instanzen) erzeugen (am "new" Operator erkennbar).

Nehmen wir nun folgendes Beispiel:
Code:
public class Counter {
  int value = 0;

  public static int instancesCounter = 0;

  Counter() {
    instancesCounter++;
  }

  increment() {
   value++;
  }
}
Und irgendwo wird diese Klasse benutzt:
Code:
public static void main(String[] args) {
  // instancesCounter = 0
  Counter.instancesCounter++; // instancesCounter = 1
  Counter c1 = new Counter();  // instancesCounter = 2
  c1.increment();  // value von c1 = 1
  Counter c2 = new Counter();  // instancesCounter = 3
  c2.increment();  // value von c2 = 1
  c1.increment();  // value von c1 = 2
  Counter.instancesCounter++; // instancesCounter = 4
}
Dort siehst du nun, dass die statische Variable "instancesCounter" komplett unabhängig von den Objekten ist.

Im Vergleich zu C kann man das so (vereinfacht) veranschaulichen:
- Alles was "static" ist, existiert global nur ein einziges mal
- Ein Objekt (= Instanz einer Klasse) ist quasi ein "struct", aber zusätzlich kann man halt noch Methoden definieren, die mit den Daten dieses structs arbeiten.

In einem C struct könnte man die "increment" Methode so nicht schreiben, weil ein struct nur Daten enthält. Also würde man in C quasi eine statische Methode nehmen, die das struct übergeben bekommt. Das ist in Java natürlich auch möglich. Aber man macht sowas nicht, weil man dann ja wieder nicht-objektorientierten Code schreiben würde:
Code:
public class Counter {
  int value = 0;

  static void increment(Counter counterObjekt) {
    counterObjekt.value++;
  }
}
In C hätte man also ein Counter struct, das einen int value enthält. Und irgendwo würde man die increment Funktion definieren, die ein Counter struct übergeben bekommt und dann den value Wert davon modifiziert.

In den allermeisten Fällen braucht man keine "static" Variablen und/oder Funktionen in Java. Weil man eben mit Objekten arbeitet und auch direkt die Methoden der Objekte benutzt.

In meinen Projekten erstelle ich deshalb meist auch einfach eine "Application" Klasse, die ausschließlich die "main" Methode enthält. Das ist dann im Normalfall die einzige nicht-objektorientierte Klasse im Projekt. Und die ist ausschließlich zum Starten des Programms da:
Code:
public class Application {
  public static void main(String[] args) {
    Geometry geo = new Geometry();
    geo.run();
  }
}



public class Geometry {
  // ...

  public void run() {
    // ...
  }
}
Ist eine Frage des Geschmacks und der Übersichtlichkeit. Für Mini-Projekte lohnt sich das natürlich meist nicht.

Wo man seine "main" Methode platziert ist Java ziemlich egal. Aber irgendwo muss sie halt stehen. Und wenn das Projekt eh nur aus 1-2 Klassen besteht, dann kann man die main Methode natürlich auch direkt da rein schreiben.

---

Die Objektorientierte Version hat halt den Vorteil der "Kapselung". Das fällt aber erst so richtig auf, wenn auch wirklich mit den Werten in der Klasse arbeitet und das "private" Keyword benutzt. Z.B. kannst du dadurch verhindern, dass ein Objekt negative Werte speichert:
Code:
public class KeineNegativeZahl {
  // Objekt-interne Variable
  // von außen weiß keiner, dass diese Variable existiert
  private int value = 0;

  public int getValue() {
    // diese Methode ist öffentlich und gibt immer
    // das Quadrat von "value" zurück
    return value*value;
  }

  public void setValue(int newValue) {
    // diese Methode ist öffentlich und setzt den internen
    // Wert nur, wenn der neue Wert >= 0 ist. Wenn der
    // neue Wert < 0 ist, dann passiert gar nichts.
    if(newValue >= 0) {
     value = newValue;
    }
  }
}

public static void main(String[] args) {
  KeineNegativeZahl knz = new KeineNegativeZahl();
  // knz.value; Zugriff nicht möglich
  knz.getValue(); // Ergebnis = 0, weil 0*0 = 0
  knz.setValue(2); // internet wert = 2, weil 2 >= 0
  knz.getValue(); // Ergebnis = 4, weil 2*2 = 4
  knz.setValue(-1); // internet wert bleibt 2, weil -1 nicht >= 0
  knz.getValue(); // Ergebnis = 4, weil sich der interne Wert nicht geändert hat
}
Von außen kann niemand einsehen, was in den Objekten gespeichert ist. Der direkte Zugriff auf "value" ist durch das "private" Keyword untersagt. Die erzeugten Objekte können nur über die beiden "public" Methoden benutzt werden. Dadurch kann man dann sicherstellen, dass sich die Werte innerhalb der Objekte immer in einem konsistenten Zustand befinden. Mit einem C struct wäre das nicht möglich. Bei einem C struct kann jeder alles modifizieren wie er will und es gibt keine Garantie, dass die Werte innerhalb des structs nach der Modifikation noch Sinn ergeben.
Außerdem ist in der objektorientierten Welt sichergestellt, dass man die Funktionsweise eines Objekts komplett austauschen kann. Z.B. könnte ich "int value" durch einen String ersetzen und wenn jemand "setValue(4)" aufruft, speichere ich ein String mit 4 Leerzeichen und benutze die String-Länge als internen Wert. Von außen verhalten sich die Methoden nach wie vor identisch. Das ist der ganze Trick hinter der Kapselung: Man erschafft eine Blackbox, die man von außen über die Methoden bedienen kann. Ob die Blackbox im inneren nun die Daten direkt im Arbeitsspeicher ablegt, oder sie irgendwo im Internet speichert und der NSA bescheid gibt, weiß man nicht. Aber das will man auch gar nicht wissen. Hauptsache die Methoden liefern genau die Werte zurück, die man erwartet.
 
Zuletzt bearbeitet:
Wow, vielen vielen Dank für die ausführliche Erklärung!!!
Habe nun alles verstanden und werde meinen Code auch noch zusätzlich "objektorientiert" programmieren.

Kurze Rückfrage:
public class Counter {
int value = 0;

static void increment(Counter counterObjekt) {
counterObjekt.value++;
}
}

Die Variable "value" ist hier vom Typ public?
Theoretisch könnte ich die Methode "increment" auch in jede andere Klasse schreiben da sie static und damit unabhängig von der Klasse ist?
 
Die Antwort lautet: ja, jein und nein :D

Vorne weg: "public" ist kein Typ, sondern ein Access Modifier (gibt bestimmt auch einen deutschen Namen dafür)


Also:
Wenn du "value" public machst, dann kannst du natürlich den Wert von jeder Klasse aus lesen und verändern. Heißt: Dann kannst du die "static void increment" Methode auch in jede Klasse schreiben.

Wenn du aber nun mit "private int value" arbeitest (was man in Java in 95% der Fälle tun sollte):
Code:
public class Counter {
  private int value = 0;

  public static void increment(Counter counterObjekt) {
    counterObjekt.value++;
  }
}

public class AndereKlasse {
  public static void increment(Counter counterObjekt) {
    // counterObjekt.value++; Zugriff nicht möglich, weil value private ist
  }
}
Dann kannst du auf "value" nur von innerhalb der Klasse zugreifen. Dabei ist es egal, ob der Zugriff direkt über eine non-static Methode erfolgt, oder "indirekt" über eine static Methoden. Hauptsache ist, dass der Code in derselben Klasse steht.
 
Achso, ok.

Also muss ich das private nicht extra dazuschreiben, wenn ich eine private Variable in einer Methode definieren will. Wenn ich nichts dazuschreibe ist sie nämlich automatisch private?
 
Innerhalb von Methoden kannst du kein public/private verwenden. Alles was in einer Methode definiert wird, steht auch ausschließlich innerhalb der Methode zur Verfügung:
Code:
public class Foo {
  public void methodA() {
    int x = 42; // steht NUR innerhalb der Methode zur verfügung.
    // public int x = 42; Compile Fehler. Hier darf kein public / private verwendet werden
  }

  private void methodB() {
    int x = 42; // steht NUR innerhalb der Methode zur verfügung.
    // public int x = 42; Compile Fehler. Hier darf kein public / private verwendet werden
  }

  public static void methodC() {
    int x = 42; // steht NUR innerhalb der Methode zur verfügung.
    // public int x = 42; Compile Fehler. Hier darf kein public / private verwendet werden
  }
}

Wenn du die Variablen in den Klassen meinst: It depends.
Java kennt da einige verschiedene Sichtbarkeiten:
- public
- private
- protected
- package protected / package private (das gibt's nicht explizit, sondern wird automatisch genommen, wenn du keine Sichtbarkeit angibst)
Siehe: https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html
Und: https://stackoverflow.com/questions...-package-private-public-protected-and-private

Und seit Java 9 gibt's durch das neue Modul-System noch mehr Möglichkeiten, um den Zugriff zu beschränken / erlauben.
 
Wenn du die Variablen in den Klassen meinst:

Ja, ich meinte die Klasse, sry :)
Ergänzung ()

Das heißt dann in deinem Codebeispiel oben:

Code:
public class Counter {
int value = 0;

static void increment(Counter counterObjekt) {
counterObjekt.value++;
}
}

Ist "value" package-private. D.h. ich könnte darauf auch von einer anderen Klasse aus zugreifen, sofern sie im gleichen Paket steckt?
 
Ja, exakt!

Code:
public class Counter { // package a
  int value = 0;
}

public class A { // package a
  static void increment(Counter counterObjekt) {
    counterObjekt.value++;
  }
}

public class B { // package b
  static void increment(Counter counterObjekt) {
    // counterObjekt.value++; geht nicht, weil nicht im selben package
  }
}

Wobei package-private echt ein Unding ist. Es funktioniert halt wirklich nur mit EXAKT demselben Package. D.h. wenn Klasse B im package "a.b" ist, dann funktioniert es nicht, weil es halt ein anderes Package ist.

In richtigen Projekten hat man oft so viele Klassen, dass man wegen der Übersicht "Subpackages" benutzt (also z.B. "a.b") und schon kann man package-private nicht mehr ordentlich benutzen.

Soll heißen: In echten Projekten trifft man zwar des öfteren auf package-private Variablen, aber nicht weil man sie als package-private benutzen möchte, sondern nur, weil jemand zu faul war sie als private zu markieren. :D Also es hat keine wirkliche Relevanz und wird meist gar nicht wahrgenommen oder als lästig / nervig.
 
Ok, dann nochmals vielen Dank für Deine und andys Antworten, haben mir echt sehr geholfen!
Ist einfach unschlagbar, wenn man nachfragen kann (was z.B. in einem Buch nicht möglich ist). :)
 
Nachfragen zwar nicht, aber dafür kannst du in einem Buch nachschlagen :D

Programmier-Bücher fand ich nie so wirklich hilfreich. Klar steht da einiges nützliches drin, aber es steht eben auch nicht alles drin.

In der Software Entwicklung muss man mit seiner Sprache und den Libraries und Frameworks rumspielen, um herauszufinden was möglich ist und was nicht. In reinem C ist das jetzt nicht so umfangreich und spannend, aber speziell in Java, .NET und den anderen Hochsprachen hat man ein extrem riesiges Ökosystem und die Sprachen selbst haben so viele verstecke Features und Möglichkeiten, dass es zum einen unmöglich ist, das alles in einem Buch abzudecken und (zumindest ich) könnte das auch nicht auswendig lernen.

Ich habe vor über 15 Jahren mit der Programmierung angefangen: Code Schnipsel über die ISDN Leitung aus dem Netz gesammelt und so lang damit rumexperimentiert bis ich verstanden habe, was da passiert und was möglich ist und was nicht. Daraus dann meine erste Webseite mit PHP und MySQL gebaut (natürlich inkl. SQL Injection :D ). Und alle paar Wochen habe ich die komplette Seite neu geschrieben, mit jedem mal besser und besser.

Dann kam Java dazu und ein Informatik Studium. Da lernt man extrem viel Theorie und es gibt natürlich auch diverse Übungsaufgaben dazu. Alles schön und gut und gerade das theoretische Wissen ist später extrem hilfreich. Aber als ich dann gegen Ende des Studiums in ein paar Startups Praktikum gemacht und gejobbt habe, habe ich schnell gemerkt, dass das alles vorne und hinten nicht reicht, um wirklich produktiv zu sein.
Natürlich habe ich gewusst was es für Design Patterns gibt, und wie der Code funktioniert. Aber erst die praktische Anwendung hat mir so einen richtigen Boost in Sachen Verständnis und Effizienz gegeben.

Also: Nimm deinen Code. Änder hier und da mal ein paar Sachen. Schau dir an was passiert oder was der Compiler zu meckern hat und lerne daraus. :)
Und falls du aus irgendwas nicht schlau wirst: Google. 2-3 Suchbegriffe. Unter den Top 3 Treffern wirst du sicherlich dann bei stackoverflow.com landen. Und diese Seite ist echt ein Segen. Geballte Kompetenz und Millionen bereits beantwortete Fragen. Nur Englisch und die entsprechenden Fachbegriffe muss man natürlich beherrschen ;)
 
Ergänzung

benneque schrieb:
Programmier-Bücher fand ich nie so wirklich hilfreich. Klar steht da einiges nützliches drin, aber es steht eben auch nicht alles drin.
Kommt aber auch stark darauf an, was man von einem Programmierbuch erwartet.
Mir sind z.B. dicke Wälzer ein Greul und kurze, prägnante Bücher lieber. Ich brauch nicht immer alles bis zum Ende ausgewalzt.

Bei manchen Themen ist aber dieses auswalzen gar nicht so verkehrt.

benneque schrieb:
[...] Hochsprachen hat man ein extrem riesiges Ökosystem und die Sprachen selbst haben so viele verstecke Features und Möglichkeiten, dass es zum einen unmöglich ist, das alles in einem Buch abzudecken und (zumindest ich) könnte das auch nicht auswendig lernen.
Alles abzudecken in einem Buch ist auch nicht unbedingt sinnvoll. Dann lieber übersichtliche Tutorials di sich mit einem Themengebiet beschäftigen.



benneque schrieb:
Natürlich habe ich gewusst was es für Design Patterns gibt, und wie der Code funktioniert. Aber erst die praktische Anwendung hat mir so einen richtigen Boost in Sachen Verständnis und Effizienz gegeben.
Genau. Theorie ist wichtig aber Praxis eben auch.



benneque schrieb:
Also: Nimm deinen Code. Änder hier und da mal ein paar Sachen. Schau dir an was passiert oder was der Compiler zu meckern hat und lerne daraus. :)
Dem kann ich nur beipflichten. Ist so ein wenig wie mit dem Fahrrad fahren. Das lernt man ja auch nur, wenn man Fahrrad fährt. :-)
 
Zurück
Oben