한 객체가 여러 타입이 될 수 있다는 것을 의미
부모 클래스
class Parent {
int a = 100;
}
//자식 클래스
class Child extends Parent {
int b = 200;
}
public class PolyMain01 {
public static void main(String[] args) {
Child ch = new Child();
Parent p =ch; //자식클래스 타입 -> 부모클래스타입 형변환
//업캐스팅, 자동적으로 변환
Child ch2 =(Child)p; //부모클래스타입 -> 자식클래스타입 형변환
// 다운스캐스팅, 명시적으로 형변
}
}
객체 타입을 확인하는 연산자
class Parent {
}
class Child extends Parent {
}
public class test {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
System.out.println(parent instanceof Parent); // true
System.out.println(child instanceof Parent); // true
System.out.println(parent instanceof Child); // false
System.out.println(child instanceof Child); // true
}
}
true
true
false
true
//부모클래스
class Parent {
// Object의 toString()메서드 재정의
@Override
public String toString() {
return "Parent 클래스";
}
}
//자식클래스
class Child extends Parent {
@Override
public String toString() {
return "Child 클래스";
}
}
public class InstanceofMain {
public static void main(String[] args) {
Parent p = new Parent();
// 컴파일시 오류는 없지만 실횅시 오류 발생
// Child ch = (Child)p;
// 지정한 객체가 명시한 타입을 사용할 수 있는지 여부 체크
if (p instanceof Child) {
Child ch2 = (Child) p;
System.out.println(ch2);
} else {
System.out.println(p);
}
}
}
Parent 클래스
값이 변하지 않는 값
추상클래스는 일반클래스와 달리 미완성되어 있는 클래스이기 때문에 객체 생성이 불가능하고 상속관계를 맺은 자식 클래스가 객체 생성되어야 사용이 가능하다.
//추상클래스
abstract class A2 {
// 멤버변수
private int x;
// 멤버메서드
public void setX(int x) {
this.x = x;
}
// 일반적으로 추상클래스는 하나 이상의 추상 메서드 명시
public abstract void make();
}
//일반클래스에 추상클래스 상속
//추상메서드가 포함되어 있으면 반드시 추상메서드를 자식클래스에 구현해주어야
//자식클래스 객체 생성이 가능함
class B2 extends A2 {
// 추상메서드 구현
@Override
public void make() {
System.out.println("make 메서드");
}
}
public class AstractMain02 {
public static void main(String[] args) {
B2 bp = new B2();
bp.make();
}
}