class P { public void md() { a = 5; System.out.println(a + b); } }
class C extends P { public void md() { System.out.println(a + b); super.md(); this.md1(); } }
클래스급이상 (클래스, 추상클래스, 인터페이스)인 경우
형변환은 반드시 상속관계에서만 가능하다.
아니면 String <=> Wrapper클래스간 메소드를 이용한 형변환만 가능하다.
Pa p = new Pa(); 부모 부모or자식 Pa p = new Cha(); p = new Cha1();
=> Pa, Cha, Object(숨김) 재선언
InhEx01.java
class AA {
int i;
int j;
public void setij(int x, int y) {
i = x;
j = y;
}
}
class BB extends AA { //BB자식 >> AA부모
int total;
public void sum() {
total = i + j;
}
}
public class InhEx01 {
public static void main(String[] args) {
BB sub0b = new BB();
sub0b.setij(10, 12);
sub0b.sum();
System.out.println("합계 : " + sub0b.total);
}
}
합계 : 22
InhEx03.java
class AA {
int i;
int j;
int z = 5;
public void setij(int x, int y) {
System.out.println("상위");
i = x;
j = y;
}
public void printI() {
System.out.println("상위: "+ z);
}
}
class BB extends AA { //BB자식 >> AA부모
int total;
String z = "테스트";
public void sum() {
total = i + j;
}
public void setij(int x, int y) {
System.out.println("하위");
i = x + 5;
j = y + 5;
}
public void printI() {
System.out.println(z);
}
}
public class InhEx01 {
public static void main(String[] args) {
BB sub0b = new BB();
sub0b.setij(10, 12);
sub0b.sum();
System.out.println("합계 : " + sub0b.total);
}
}
하위
합계 : 32
sub0b.printI(); //내부에서 접근하는 자식값
System.out.printl("z의 값 : " + sub0b.z); //외부에서 접근하는 부모값
InhEx02.java //오버라이딩
class P {
int a = 0;
int b = 5;
public void md() {
a = 5;
System.out.println(a + b);
}
}
class C extends P {
String a = "오버라이딩";
public void md() {
System.out.println(a + b);
super.md(); //super부모에 접근해서. 상속관계의 부모가 존재해야만 사용가능. Object 기본상속
this.md1(); //C클래스
}
public void md1() {
System.out.println("md1()메소드 호출");
}
}
public class InhEx02 {
public static void main(String[] args) {
C c = new C();
//업캐스팅 - 하위클래스(=서브클래스=자식클래스)자료형이 상위클래스로 변환되는것
P p = new C();
c.md();
p.md();
}
}
오버라이딩5
10
md1()메소드 호출
오버라이딩5
10
md1()메소드 호출
InhEx03.java
class Parent {} //Object가 숨겨져있음
class Child extends Parent {}
class Brother extends Parent {}
public class InhEx03 {
public static void main(String[] args) {
//다형성 : 한 객체가 여러개의 타입(자료형)을 갖을 수 있는 것
Parent p = new Parent(); //Parent, Object
System.out.println("1번. " + (p instanceof Object));
System.out.println("2번. " + (p instanceof Parent));
System.out.println("3번. " + (p instanceof Child));
System.out.println();
Parent c = new Child(); //Parent, Child, Object
System.out.println("4번. " + (c instanceof Object));
System.out.println("5번. " + (c instanceof Parent));
System.out.println("6번. " + (c instanceof Child));
System.out.println("7번. " + (c instanceof Brother));
System.out.println();
c = new Brother(); //Parent, Brother, Object
System.out.println("8번. " + (c instanceof Object));
System.out.println("9번. " + (c instanceof Parent));
System.out.println("10번. " + (c instanceof Child));
System.out.println("11번. " + (c instanceof Brother));
System.out.println();
Child c1 = new Child(); //Parent, Brother, Object
System.out.println("12번. " + (c1 instanceof Object));
System.out.println("13번. " + (c1 instanceof Parent));
System.out.println("14번. " + (c1 instanceof Child));
// System.out.println("15번. " + (c1 instanceof Brother));
// 선언하고 있는 자료형 자체가 Brother와 연결된 것이 없음
}
}
class Par { int p = 0; }
class Cld extends Par { int c = 1; }
class Bro extends Par { int b = 2; }
public class InhEx04 {
public static void main(String[] args) {
Par pa01 = new Par();
Cld ch = new Cld();
Par pa02 = new Bro(); //Par, Bro
Bro br = new Bro();
pa01 = ch;
//Par pa01 = new Cld();
//pa01 = (Par) ch; 와 같으며, 타입 변환을 생략할 수 있음.
pa01.p = 2;
//pa01.c = 2;
ch.p = 5;
br.p = 5;
//pa02.b = 6;
//타입 변환을 생략할 수 없음. 다운케스팅 : 다시 자식 자료형으로 돌아오는 것
br = (Bro) pa02;
//pa02.b = 7;
// System.out.println("pa02.b: "+ pa02.b);
br.p = 5;
br.b = 7;
System.out.println("br.p : " + br.p + " / br.b : " + br.b);
//br = (Bro)ch; // 직접적인 상속 관계가 아니므로 오류발생
}
}