implements
예약어 사용)같은 방식으로 요청을 하지만 다른 결과물을 만들어 냄.
자동 타입 변환(Promotion)
- 상위 클래스, 인터페이스, 추상클래스로 Upcasting 가능
interface I2(){
public String A();
}
interface I3{
public String B();
}
class D implements I2, I3{
public String A(){
...
}
public String B(){
...
}
}
public class Polymorphism {
public static void main(String[] args) {
D obj = new D();
// 특정 기능을 가진 인터페이스만 필요하다면 다른 기능은 배제
I2 objI2 = new D(); //데이터타입은 I2
I3 objI3 = new D(); //데이터타입 I3
obj.A();
obj.B();
obj2.A();
//obj2.B(); // I2 입장에서 존재하지 않기 때문에 에러
//obj3.A(); // I3 입장에서 존재하지 않기 때문에 에러
obj3.B();
}
}
Dynamic Dispatch 동작
Runtime polymorphism
재정의(override)된 메서드에 대한 호출이 런타임에 해결되는 프로세스
어떤 객체가 다른 객체에게 메서드를 보낼 때 그때 그때 상황에 맞게(Dynamic) 보내준다(Dispatch)는 뜻
public
이어야 함interface I3{
public void x();
}
interface I4 extends I4{
public void z();
}
class A implements I4{
public void x(){}
public void z(){}
}
public static final
이 컴파일 과정에서 붙음HI_FIVE
public interface I5{
...
default void y() { //디폴트메서드 선언
...
}
}
public class B implements I5 {
public static void main(String[] args) {
...
B obj = new B(); //클래스 생성
...
obj.y(); // 디폴트메서드 호출
}
}
헬퍼 또는 유틸리티 메소드를 제공할 때 사용
인터페이스 이름 직접 참조
public interface I5{
...
static void y() { // static메서드 선언
...
}
}
public class B implements I5 {
public static void main(String[] args) {
...
...
System.out.println(I5.y()); // static메서드 호출
}
}
static 블록 작성 불가