Upcasting = 부모 형태의 자식 생성자를 할당하는 것(형변환)
⇒ Parent p = new Child();
시험에 출제되기 쉽다…
public class Car {
//자동차 생성자
public Car() {
System.out.println("자동차 객체 생성됨");
}
//엔진을 시동하는 메서드
public void startEngine() {
System.out.println("엔진 시동 걸림");
}
}
public class ElectricCar extends Car {
//전기 자동차 생성자
public ElectricCar() {
System.out.println("전기 자동차 객체 생성");
}
//배터리를 충전하는 메서드
public void chargeBattery() {
System.out.println("배터리 충전 중");
}
public static void main(String[] args) {
System.out.println("프로그럄 시작");
//전기 자동차 객체 생성
Car myElectricCar = new ElectricCar();
//메서드 호출
myElectricCar.startEngine(); //상속받은 메서드 호출
myElectricCar.chargeBattery(); //자식 클래스의 메서드 호출 > 에러발생
System.out.println("프로그램 종료");
}
}타입을 Car로 객체를 생성했기 때문에 자식 클래스의 메서드를 호출하면
에러가 난다.
업캐스팅의 원칙
- 자식에 이름이 같은 메서드가 있으면 우선 작동
- 자식에 super()가 있으면, 부모의 그것을 호출
- 부모에 자식과 같은 메서드가 있으면, 자식을 호출
public class MainClass {
public static void main(String[] args) {
A b = new B(); //1. A타입으로 B객체 생성(생성자가 없으니까 할것X)
b.paint(); //2. paint 메서드가 오버라이딩 되었으므로 자식 ㄱ
b.draw(); //14. 이것도 오버라이딩 되었으므로 자식 ㄱ
}
}
class A {
public void paint() {
System.out.print("A");
draw();
}
public void draw() { //5. 여기로 옴
System.out.print("B"); //6. B출력
draw(); // 7. 본인의 draw가 아닌 자식의 메서드 호출
}
}
class B extends A {
public void paint() { //3. 여기로 옴
super.draw(); //4. 부모의 draw 메서드로 감
System.out.print("C"); //10. C출력
this.draw(); // 11.이 클래스의 draw 호출
}
public void draw() { //8. 여기로옴 , 12. 여기 또옴
System.out.print("D"); //9. D출력 , 13. D출력 , 15. D출력
}
}출력값 :
BDCDD
public class MainClass {
public static void main(String[] args) {
A a = new A(); //업캐스팅이 아님 1. A 객체 생성
A b = new B(); //업캐스팅 4. A 타입으로 B 생성
b.paint(); //여기서부턴 위에랑 똑같음 BDCDD
b.draw();
}
}
class A {
public A() { //2. 생성자 도착 , 6. 부모 생성자 도착
System.out.println("Constructor of A"); // 3. 출력 , 7.출력
}
public void paint() {
System.out.print("A");
draw();
}
public void draw() {
System.out.print("B");
draw();
}
}
class B extends A {
public B() { //5. B생성 전 부모 생성자 부터 감
System.out.println("Constructor of B"); //8. 출력
}
public void paint() {
super.draw();
System.out.print("C");
this.draw();
}
public void draw() {
System.out.print("D");
}
}출력값:
Constructor of A
Constructor of A
Constructor of B
BDCDD
public class MainClass {
public static void main(String[] args) {
A b = new B(1); //1. 기본생성자가 아닌 파라미터 받는 생성자
b.paint(); //6. 마지막 재정의 한 메서드로 ㄱ
b.draw(); //8. 마지막 재정의 한 메서드로 ㄱ
}
}
class A {
public A() { //3. 여기 도착
System.out.println("생성자 of A"); //4. 출력
}
public A(int i) {
System.out.println("생성자 of AA" + i);
}
public void paint() {
System.out.print("A");
draw();
}
public void draw() {
System.out.print("B");
draw();
}
}
class B extends A {
public B() {
super.paint();
}
public B(int i) { //2. 부모 생성자 부터 ㄱㄱ
System.out.println("생성자 BB" + i); //5. 출력
}
public void paint() {
System.out.print("C"); //7. 출력
}
public void draw() {
System.out.print("D"); //9. 출력
}
}출력값:
생성자 of A
생성자 BB1
CD
(* 자식에게 파라미터가 있었음에도 부모는 기본 생성자가 호출됨)
⇒ 자식 생성자에 명시적으로 super(10) 라고 되어있으면
부모 생성자도 당연히 파라미터를 받는 생성자를 호출한다.
super()는 무조건 최상위 줄에 있어야함!!!!! 아니라면 그 줄은 오류다.
Share article