- 동적 바인딩 : 실행할 당시의 객체 타입 기준으로 바인딩 되는 것
- Super obj = new Sub() 일 경우
- 부모 생성자 → 자식 생성자 순으로 호출
- 부모와 자식 클래스에서 각각 public int num 멤버를 선언했다면
자식 클래스 내부에서 obj.num 출력하면 부모 것 출력 (Sub로 캐스팅해야 Sub의 num이 출력됨)
public int num을 상속 받은 경우에만 자식 것을 출력(overriding처럼)
- Sub에만 있는 method 호출 시 : 컴파일 에러 (캐스팅 필요) - instaceof 키워드
if (e instance of Person) { ... }
연속해서 사용할 경우 Sub class부터 instanceof 해야함 - 인터페이스
- 모든 메소드는 public abstract (생략 가능)
- 모든 멤버변수는 public static final (생략 가능)
- 객체 생성은 안되나 reference 변수로서는 가능 - 오버로딩
1. 메소드 오버로딩
- 메소드 이름이 같고, 매개 변수의 개수 또는 타입이 다름.
- 매개변수는 같지만 리턴 타입이 다른 경우는 해당 안 됨
2. 생성자 오버로딩
- this나 super 키워드가 생성자를 호출하는데 쓰일 경우, 반드시 생성자의 첫 라인에 기술되어야 함.
- super(), this()를 같이 호출하지는 못함 - 오버라이딩과 오버로딩
Overriding
Overloading
* 메소드를 하위 클래스에서 정의
* 메소드를 같은 클래스에서 정의
* 메소드 이름 동일
* 매개변수(개수 및 데이터타입) 동일
* 리턴 타입 동일/상속관계
* 메소드 이름 동일
* 매개변수(개수나 데이터 타입) 다름
* 리턴 타입이 다를 수 있음
* 접근 제어자 : 하위 메소드의 접근 범위가 상위 메소드의 접근 범위보다 넓거나 같아야 함
* 접근 제어자 : 관계 없음
- private 메소드는 오버라이딩이 불가 (자동적으로 final의 의미 포함)
- 멤버 변수는 다형적이지 않다.
- 부모/자식 클래스 변수 중 어느 것을 access할지는 동적이 아닌 정적으로 컴파일 시점에 정해진다. - static 메소드는 다형적이지 않다.
- 오버라이딩 되지 않는다.