상속과 아주 밀접한 관계를 갖는다.
상위 클래스는 역참조변수(레퍼런스)를 사용하여 하위 클래스의 객체에 관여 할수 있다.
추상클래스로 객체를 생성할수 없다.(abstract로 생성불가 하도록 제한할수 있다.)
추상 클래스는 하위 클래스로 확장 되어야 한다.
더 이상 확장되지 않는 말단 클래스는 구상 클래스이다.
추상 클래스 안에는 추상 메소드와 일반 메소드가 공존할수 있다.
추상 메소드를 넣으려면 그 클래스는 추상클래스여야 한다.
추상 메소드는 메소드의 이름까지만 선언해 주면 된다.
추상 메소드의 내용은 구상 클래스에서 반드시 오버라이딩하여 정의(구현) 되어야만 한다.
추상메소드의 생성은 오버라이드하겠다는 의미와 같다.
상위 클래스유형을 메소드의 인자, 리턴유형, 배열유형으로 쓸수 있게 하는 것이 다형성이다.
상위클래스 유형에 속하는 하위클래스 유형에는 모든 상위 클래스의 메소드가 있어야 한다.(상속)
- 한 타입의 참조변수로 여러 타입의 객체를 참조 할 수 있도록 함.
참조변수의 형변환
- 캐스트연산자를 사용하여 상속관계에 있는 클래스 타입의 참조변수간 형변환을 자유롭게 수행할수 있다.
- 참조변수가 참조하는 인스턴스의 타입보다 자손타입으로의 형변환은 불가한다.
public class CastingTest1 {
public static void main(String[] atgs) {
Car car = null;
FireEngine fe = new FireEngine(); //FireEngine타입참조변수 fe
FireEngine fe2 = null;
fe.water();
car = fe; //car=(car)fe; 형변환 생략 fe가 참조하는 인스턴스를 car이 참조하도록 한다
// car.water(); //Car 타입의 참조변수로 water()를 호출할수 없다.
fe2 = (FireEngine)car; //형변환 car가 참조하는 인스턴스를 fe2가 참조한다.
fe2.water();
fe2.drive();
fe.stop();
}
}
class Car {
String color;
int door;
void drive() {
System.out.println("drive, Brrrr~");
}
void stop() {
System.out.println("stop!!!");
}
}
class FireEngine extends Car {
void water() {
System.out.println("water!!!");
}
}
instenceof 연산자
- 참조변수가 참조하고 있는 인스턴수의 실제 타입을 알아보기 위해 사용된다.
- 조건문에서 사용되며 true, false를 결과값으로 한다.
- 결과값이 참일때 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.
public class InstenceofTest {
public static void main(String[] args) {
FireEngine fe = new FireEngine();
if(fe instanceof FireEngine) {
System.out.println("This is a FireEngine instance.");
}
if(fe instanceof Car) {
System.out.println("This is a Car instance.");
}
if(fe instanceof Object) {
System.out.println("This is a Object instance.");
}
}
}