예제1)
public class Test9 {
public static void main(String[] args) {
// super 생성자(먼저 메모리할당) -> sub 생성자
Demo9 ob1=new Demo9(); // new에 의하여 객체생성하면서 생성자 실행
System.out.println(ob1.b); // 자기것(30) -> 자기것은 Demo9(하위클래스).
ob1.exam(); // 자기것 메소드 실행
Ex9 ob2=ob1; // 업캐스팅 => 변수는 상위클래스것을 쓰고 메서드는 하위에 없으면 상위 것을 쓴다.(재정의가 되어있는 메소드에 한해서)
//Ex9 ob4=new Demo9(); // 이것은 객체생성과 동시에 업캐스팅한것이다.
// 상위 클래스 객체는 하위 클래스 객체를 가르킬수 있다.
System.out.println(ob2.b); // 자기것(20)
ob2.exam(); // 메소드는 멤버변수와 달리 실제객체의 메소드호출 => 하위클래스의 메소드 사용하지만 상위클래스에 이 메소드가 없다면 에러가나옴.
// ob2.print(); //컴파일단계에서 super 클래스에 메소드가 없으므로 error
// Demo9 ob3=ob2; // 하위객체는 상위객체를 가르킬수없다. error
Demo9 ob3=(Demo9)ob2; // 다운캐스팅 => 변수와 메서드 모두 Demo9것 사용. 메서드는 하위에 없으면 상위 것을 쓴다.(재정의가 되어있는 메소드에 한해서)
// 다운캐스팅은 무조건되는 것이 아니라 업캐스팅 된것만 가능
System.out.println(ob3.b); // 다운캐스팅되어 하위클래스의 변수를 호출.
if(ob2 instanceof Demo9) { // ob2가 Dome9에게 상속받은 객체라면 다음과 같은 명령을 수행하라.
System.out.println("Demo9 객체임....");
}
Ex9 ee=new Ex9();
// Demo9 ff=(Demo9)ee; // 다운캐스팅. 런타임오류
// 다운은 업된것만 가능
// ff.exam();
// ee 객체가 Demo9의 객체인 경우 true
if(ee instanceof Demo9) { // ee는 Ex9클래스(상위클래스)의 객체이다. ee가 Demo9에게 상속받은 객체라면 다음과 같은 명령을 수행하라.
Demo9 ff=(Demo9)ee;
ff.exam();
}
}
}
class Ex9{
int a=10, b=20;
public Ex9() {
System.out.println("super class 생성자....");
}
public void test() {
System.out.println("a:"+a+",b:"+b);
// System.out.println(c); // 오류:하위클래스멤버접근불가
}
public void exam() {
System.out.println("super 클래스 메소드...");
}
}
class Demo9 extends Ex9 {
int b=30, c=40;
public Demo9() {
System.out.println("sub class 생성자....");
}
public void print() {
System.out.println("a:"+a+",b:"+b+",c:"+c);
}
public void exam() {
System.out.println("sub 클래스 메소드...");
}
}
예제1 결과)
super class 생성자....
sub class 생성자....
30
sub 클래스 메소드...
20
sub 클래스 메소드...
30
Demo9 객체임....
super class 생성자....
'자바 > 객체지향' 카테고리의 다른 글
final 키워드 (0) | 2013.05.21 |
---|---|
static 키워드 (0) | 2013.05.21 |
재정의(override), 중복정의(overloading) (0) | 2013.05.19 |
자바의 상속 (0) | 2013.05.19 |
Method 메서드 (0) | 2013.05.14 |