//추상클래스(객체 생성 X)
abstract class Super {
	private int num = 4; //멤버변수 가능
	
	public Super(int num) {//생성자 가능
		setNum(num);
	}
	
	abstract public void todo();//추상메서드 가능
    
	public void call() {
		todo(); // 이건될까??? !!!
	} 
    // 일반메서드 가능
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	
}
class Sub extends Super {
	public Sub(int num) {
		super(num);	
	}
	@Override
	public void todo() {
		System.out.println("안녕");
	}
	
}
public class Test {
	public static void main(String[] args) {
		Sub s = new Sub(100);
		//System.out.println(s.getNum());
		s.call();
	}
}
위에 코드 중 이런 메서드가 있다. 저것이 되는 이유는 무엇일까?
public void call() { todo(); //이건될까? 된다. 이유는? }
call() 호출되었다.
-> Super는 객체생성이 불가능하다. Super의 하위 객체가 존재한다.
Super는 추상클래스.
추상메서드 todo()를 가지고 있다.
1에 의거하여 하위클래스는 일반클래스이다.
todo()가 오버라이드가 되어있다는 것이 보장된다.
상속관계에서 오버라이드를 한 경우, 무조건 오버라이드된 메서드가 호출된다.
-> call()에서 호출하는 todo() 하위클래스의 오버라이드 된 todo()를 나타낸다.