super.

자식 클래스에서 부모 클래스의 메소드를 오버라이딩하게 되면, 부모 클래스의 메소드는 숨겨지고 오버라이딩된 자식 메소드만 사용된다. 그러나 자식 클래스 내부에서 오버라이딩된 부모 클래스의 메소드를 호출해야 하는 상황이 발생한다면 명시적으로 super키워드르 붙여서 부모 메소드를 호출 할 수 있다.

class Parent {
	void method1() {...}
	void method2() {...}
}
/////////////////////////////////////////////////
class Child extends Parent {
	void method2() {***} // Overriding
	void method3() {
		method2(); // ==Overriding
		super.method2(); // Original super method
	}
}

Overriding이 안된 상태에서는 super.를 쓰지 않는다.

super()

모든 객체는 클래스의 생성자를 호출해야만 생성된다. 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다. 생성자가 명시적으로 선언되지 않았다면 컴파일러는 다음과 같은 기본 생성자를 생성해 낸다.

class Child extends Parent {
	public Child() {
		super();
		// 컴파일러가 부모의 기본 생성자 생성
		// == public Parent();
	}
}

명시적으로 부모 생성자를 호출하고 싶다면 다음과 같이 작성하면 된다.

public Employee(String name, int payPerMonth, int commision) {
		this.name = name;
		this.payPerMonth = payPerMonth;
		this.commision = commision;
	}
//////////////////////////////////////////////////////////////
public class Regular extends Employee {
	public Regular(String name, int payPerMonth, int commision) {
		super(name, payPerMonth, commision);
		// superclass에서 초기화 시킴
	}
}

super(매개값, …)는 매개값의 타입과 일치하는 부모 생성자를 호출한다. 부모클래스에 기본 생성자가 없고 매개 변수가 있는 생성자만 있다면 자식 생성자에서 반드시 부모 생성자 호출을 위해 자식 생정자 첫 줄에 super(매개값, …)를 명시적으로 호출해야 한다.

this.

this()

parameter의 수가 다른 constructor를 재호출한다.

class Parent {
	public Parent (Para1, Para2) {...} 
	public Parent () {
		this(Argu1, Argu2); // == public Parent (Para1, Para2)
	}
}