다형성(Polymorphism)
클래스는 상속을 통해 확장될 수 있어도 축소될수는 없으므로, 자식 클래스에서 사용할 수 있는 멤버의 개수가 언제나 부모 클래스와 같거나 많게 된다.
참조 변수의 타입 변환
1. 서로 상속관계에 있는 클래스 사이에서만 타입 변환 가능
2. 자식 -> 부모 클래스 타입으로의 타입 변환은 생략 가능
3. 부모 -> 자식 클래스 타입으로의 타입 변환은 반드시 타입 변환 명시해야 함
Child child = (Child)new Parent();
Super()
this() 메서드가 같은 클래스의 다른 생성자를 호출할 때 사용된다면 super() 메서드는 부모 클래스의 생성자를 호출할 때 사용된다.
child 클래스에 지역 변수로 a가 선언되지 않으면 10, 10, 10 이 출력된다.
package Java.JavaSuper;
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display();
}
}
class Parent {
int a = 10;
}
class Child extends Parent {
int a = 20;
void display() {
System.out.println(a); # 20
System.out.println(this.a); # 20
System.out.println(super.a); # 10
}
}
super()로 부모 클래스의 생성자를 오버라이딩하는 경우, a는 40이 된다.
package Java.JavaSuper02;
class Parent {
int a;
Parent() { a = 10; }
Parent(int n) { a = n; }
}
class Child extends Parent {
int b;
Child() {
// super(40);
b = 20;
}
void display() {
System.out.println(a);
System.out.println(b);
}
}
public class Main {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
Instanceof 연산자
참조변수 instanceof 클래스이름
추상 메서드
자식에서 오버라이딩해야만 쓸 수 있는 메서드
사용하는 이유는?
자바에서 추상 메서드를 선언하는 목적은 추상 메서드가 포함된 클래스를 상속받는 자식 클래스가 해당 메서드를 반드시 사용하게 하기 위함
package Java.JavaAbstract;
public class Main {
public static void main(String[] args) {
Cat c = new Cat();
Dog d = new Dog();
c.cry();
d.cry();
}
}
abstract class Animal {
abstract void cry();
}
class Cat extends Animal {
void cry() {
System.out.println("냐옹");
}
}
class Dog extends Animal {
void cry() {
System.out.println("멍멍");
}
}