*상속
- 기존의 코드를 손대지 않고 기능을 확장하는 방법.
- =>기존의 코드를 건드리지 않으면 버그가 있을 가능성이 줄어든다.
- 기존의 소스코드에 손을 댄다는 것은 버그가 발생하는 위험이 발생한다.
- 기존의 소스코드가 필요없다.
* 상속의 한계
- 필요없는 기능까지 상속받는다
- : 즉 class 코드가 무거워진다.
== class InheritTest
class A {
int i;
///*생성자를 따로 안만들면 다음과 같이 기본 생성자가 만들어 진다.
public A() {
super(); // 생략하면 컴파일러가 자동으로 붙인다.
System.out.println("A() 실행:");
i = 100;
}
//*/
public void m() {
System.out.println("A의 m()");
}
public void m2() {
System.out.println("A의 m2()");
}
}
class B extends A{
int j;
///*
public B(int v) {
super();
System.out.println("B() 실행:");
j = v;
}
//*/
public void m() {
System.out.println("B의 m()");
}
}
class C extends B{
int k;
///*
public C() {
super(500);
System.out.println("C() 실행:");
k = 300;
}
// */
public void test() {
this.m(); //B's m() =>C안에 m이 없기 때문에 B로간다.
super.m(); //B's m() => 오버라이딩 하지 않았기 때문에,
this.m2(); // C's m()
super.m2();// 오버라이딩 했기 때문에, A's m2()
}
public void m2() {
System.out.println("C의 m2()");
}
}
public class InheritTest {
public static void main(String[] args) {
C p = new C(); // [i][j][k]
/*
p.i = 10;
p.j = 20;
p.k = 30;
*/
System.out.println(p.i);
System.out.println(p.j);
System.out.println(p.k);
p.test();
}
}
이해할수 있길..
*클래스 로딩
1. Super class로 부터 로딩 된다.
i) Static 변수준비
ii) static 블럭수행
2. 인스턴스 생성
i) Super로 부터 자기자신까지 쭉 만든다
3. 생성자 호출
위의 예제를 참고!


댓글 없음:
댓글 쓰기