Parent p = new Child(); // 가능
Child c = new Parent(); // 불가능
public class polymorphism {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
p.method();
p.cMethod(); // 컴파일 에러!!
((Child) p).cMethod(); // 이런식으로 형변환을 통해 사용가능
c.method();
c.pMethod();
}
}
class Parent {
void method() {
System.out.println("Parent Method");
}
void pMethod() {
System.out.println("pMethod");
}
}
class Child extends Parent{
void method() {
System.out.println("Child Method");
}
void cMethod(){
System.out.println("cMethod");
}
}
instanceof
연산자를 사용instanceof
의 왼쪽에는 참조변수를, 오른쪽에는 타입(클래스명)이 피연산자로 위치instanceof
연산의 결과가 true 라는 것은 검사한 타입으로 형변환이 가능하다는 것을 의미 void doWork(Parent p) {
if (p instanceof Child) {
Child c = (Child) p;
c.childMethod();
}
}
값이 null인 참조변수에 대해 instanceof연산을 수행하면 false
조상 클래스에 선언된 멤버변수와 같은 이름의 인스턴스변수를 자손 클래스에 중복으로 정의 했을 때, 조상 타입의 참조변수로 자손 인스턴스를 참조하는 경우와 자손타입의 참조변수로 자손타입의 참조변수로 자손 인스턴스를 참조하는 경우는 서로 다른 결과
메서드의 경우 오버라이딩된 메서드가 호출되지만, 멤버변수의 경우는 다른 결과
public class javaStudy {
public static void main(String[] args) {
Parent p = new Child();
Child c = new Child();
System.out.println("p.x = " + p.x);
p.method();
System.out.println("c.x = " + c.x);
c.method();
}
}
class Parent {
int x = 100;
void method() {
System.out.println("Parent Method");
}
}
class Child extends Parent{
int x = 200;
void method() {
System.out.println("Child Method");
}
}
---------------- Result----------------
p.x = 100
Child Method
c.x = 200
Child Method
---------------------------------------