상속 - 심화

지환·2023년 10월 17일
0

JAVA

목록 보기
22/39
post-thumbnail

Super1

package com.step6;

public class Super1 {
 int a=1;
 void methodA() {
	 System.out.println("methodA 호출");
 }
}


Super2

package com.step6;

public class Super2 extends Super1 {
	int b = 2;
	void methodB() {
		//내안에 선언된 변수가 아니어도 부모가 가진 변수는 호출할 수 있다.
		System.out.println(a);
		System.out.println("methodB()  호출");
	}
	//Super2클래스를 상속받는 클래스에서는 methodB와 methodC를 오버라이딩 할 수 있다.
	public void methodC() {
		System.out.println("Super2 : methodC() 호출");
	}
}

Me2

package com.step6;
//다형성
//같은 메소드를  호출했는데 그 결과가 달라진다.
// me.methodB(), sup1.methodB()
public class Me2 extends Super2 {
	@Override
	public void methodC() {
		System.out.println("Me2 : methodC() 호출");
	}
	public static void main(String[] args) {
		Me2 me = new Me2();
		Super2 sup1 = new Me2();
		Super2 sup11 = new Super2();
		System.out.println(me.a);
		//Me2타입은 Super2만 상속받았지만 그 전에 Super1을 상속받고 있으므로 Super1에서 정의된 메소드 호출 합법
		me.methodA();
		sup1.methodA();
		//상위 클래스 타입의 인스턴스 변수로 하위 클래스에 정의된 메소드  호출불가함
		//만일 오버라이드 관계에 있어도 불가능한 것인가?
		sup1.methodC();//sup1은 Super2타입인데 생성된 객체는 Me2타입이다 .그래서 헷갈린다
		sup11.methodC();//sup11은 Super2의 정의된 메소드 가 호출됨
		me.methodC();//Me2가 출력될 것이다.
	}
}
--------------------------------
1
methodA 호출
methodA 호출
Me2 : methodC() 호출
Super2 : methodC() 호출
Me2 : methodC() 호출

  • Me2 타입은 Super2만 상속받았지만, 그 전에 Super1을 상속받고 있으므로 Super1에서 정의된 메소드 호출이 가능하다. --> 이 부분을 복습하자.
profile
아는만큼보인다.

0개의 댓글