//인터페이스
interface ADemo
{
public void write();
}
//인터페이스
interface BDemo
{
public void print();
}
//클래스
//class DemoImpl
// 두 인터페이스를 구현하는 추상 클래스
//abstract class DemoImpl implements ADemo, BDemo
//두 인터페이스를 구현하는 클래스
class DemoImpl implements ADemo, BDemo // ◈ 두 개의 인터페이스를 상속하고 있음
{
// JDK 1.5(5.0)에서는 인터페이스 메소드를 오버라이딩 할 때 @Override 어노테이션을 사용할 수 없다
// JDK 1.6 이후부터 적용 가능한 문법이다.
// (클래스에서 쓰는 것은 1.5부터, 인터페이스에서는 1.6 에서부터 가능하다.)
// 단, 상속받은 클래스의 메소드를 오버라이딩할 때에은 JDK 1.5 에서도 오버라이드 어노테이션이 가능하다.
@Override
public void write()
{
System.out.println("ADemo 인터페이스 메소드....");
}
@Override
public void print()
{
System.out.println("BDemo 인터페이스 메소드....");
}
}//end DemoImpl
// main() 메소드를 포함하는 외부 클래스
public class Test113
{
public static void main(String[] args)
{
//ADemo ob = mew ADemo(); //인터페이스를 직접 인스턴스 생성하는것은 불가능하다.
//BDemo ob = new BDemo();
DemoImpl ob1 = new DemoImpl(); //위에서 오버라이드 하고 abstract 뗏기 때문에 가능하다.
// ADemo BDemo 인터페이스를 구현한 클래스 기반의 인스턴스 생성
ob1.write();
ob1.print();
ADemo ob2 = new DemoImpl(); // 업캐스팅
BDemo ob3 = new DemoImpl(); //업캐스팅
//-==>> ADemo 인터페이스 메소드....
// BDemo 인터페이스 메소드....
//ob2.print(); //★★ADemo 에는 print() 가 없다.
//ob3.write();
//-==>> 에러 발생(컴파일 에러)
((BDemo)ob2).print();
((ADemo)ob3).write(); // 두 개모두 임플리먼트 했을 때 사실 상 아무 관련 없는 인터페이스들인데..
// ※ DemoImpl 클래스가 ADemo. BDemo 두 인터페이스를 모두 구현했기 때문에 가능하다/
// 만약 , DemoImpl 클래스가 두 인터페이스 중 하나만 구현한 상황이라면 처리할 수 없는 구문이 된다.
((DemoImpl)ob2).print(); //다운캐스팅
((DemoImpl)ob3).write(); //다운캐스팅
//-==>>BDemo 인터페이스 메소드....
// ADemo 인터페이스 메소드....
}
}
/*
ADemo 인터페이스 메소드....
BDemo 인터페이스 메소드....
BDemo 인터페이스 메소드....
ADemo 인터페이스 메소드....
BDemo 인터페이스 메소드....
ADemo 인터페이스 메소드....
계속하려면 아무 키나 누르십시오 . .
*/