반응형
class A{
public String x(){return "A.x";}
}
class B extends A{
public String y(){return "y";}
}
class Main {
public static void main(String[] args) {
A obj = new B();
System.out.println(obj.x()); //실행시 A.x호출
System.out.println(obj.y());//호출 안됨 에러
}
}
클래스 B의 데이터 타입을 A로 인스턴스화 했을때, 클래스 B가 가지고있는 y()함수는 실행되지 않는다.
=>클래스 B가 클래스 A화 되었다.
class A{
public String x(){return "A.x";}
}
class B extends A{
public String x(){return "B.x";}
public String y(){return "y";}
}
class Main {
public static void main(String[] args) {
A obj = new B();
/*클래스 B를 클래스 A의 데이터 타입으로 인스턴스화 했을 때
클래스 A에 존재하는 맴버만이 클래스 B의 맴버가 된다.*/
System.out.println(obj.x()); //B.x호출
}
}
클래스 B의 타입을 A로 인스턴스화 했을때 클래스 B의 메소드 x()를 실행하면 클래스 B에서 정의된 함수가 호출된다.
=>B의 기본적인 성질은 그대로 간직 ,클래스 A에 존재하는 멤버만이 클래스 B의 멤버가 된다.동시에 클래스 B에서 오버라이딩한 동작방식을 유지한다.
abstract class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
int _sum() {
return this.left + this.right;
}
public abstract void sum();
public abstract void avg();
public void run(){
sum();
avg();
}
}
class CalculatorDecoPlus extends Calculator {
public void sum(){
System.out.println("+ sum :"+_sum());
}
public void avg(){
System.out.println("+ avg :"+(this.left+this.right)/2);
}
}
class CalculatorDecoMinus extends Calculator {
public void sum(){
System.out.println("- sum :"+_sum());
}
public void avg(){
System.out.println("- avg :"+(this.left+this.right)/2);
}
}
class Main {
public static void execute(Calculator cal){
System.out.println("실행결과");
cal.run();
}
public static void main(String[] args) {
Calculator c1 = new CalculatorDecoPlus();
c1.setOprands(10, 20);
Calculator c2 = new CalculatorDecoMinus();
c2.setOprands(10, 20);
execute(c1); //데이터타입이 Calculator로 로정의할수 있기때문에 execute(Calculator)의
execute(c2); //메소드에 전달하여 각기 다른동작을 하도록 구현가능한 것,이것이 다형성이다
}
}
인터페이스와 다형성
반응형