Java wspiera coś takiego jak method overloading. Polega to na tym, że możesz zadeklarować sobie nieskończoną ilość metod o tej samej nazwie tak długo, jak różnią się one parametrami. Java podczas wywołania wybierze sobie tą najbardziej pasującą.
Konstruktor to też jakby nie patrzeć metoda. Ty akurat masz dwa konstruktory.
MyThisTest t1 = new MyThisTest(); // zostanie wywołany pierwszy konstruktor, bezargumentowy public MyThisTest()
MyThisTest t2 = new MyThisTest(12); // zostanie wywołany drugi konstruktor public MyThisTest(int a)
W Javie z wnętrza jednego konstruktora możesz wywołać inny używając this()
. Zasada działania jest taka jak wyżej, w zależności od przekazanych argumentów Java wybierze najbardziej pasujący konstruktor.
Skoro to już wiemy, to co się tutaj dzieje?
MyThisTest t1 = new MyThisTest();
// 1. zostanie wywołany bezargumentowy konstruktor public MyThisTest()
// 2. z wnętrza tego konsturktora manualnie wywołujesz inny robiąc this(42);
// 3. typ (42) argumentu pasuje do konstruktora public MyThisTest(int a); więc on zostanie wywołany i ustawi wartość a = 42;
// W Twoim przypadku można powiedzieć, że to wywołanie:
MyThisTest t1 = new MyThisTest();
// robi to samo co to:
MyThisTest t1 = new MyThisTest(42);
Fiddle
class Main {
public static void main(String[] args) {
Triangle t1 = new Triangle(10);
System.out.println(t1 + "\n\n");
Triangle t2 = new Triangle(10, 5);
System.out.println(t2);
}
}
class Triangle {
private double base;
private double height;
public Triangle(double base) {
this(base, base * Math.sqrt(3) / 2.0);
System.out.println("Hello z Triangle(double base)");
}
public Triangle(double base, double height) {
this.base = base;
this.height = height;
System.out.println("Hello z Triangle(double base, double height)");
}
public String toString() {
return "Base: " + base + " Height: " + height;
}
}