상속 관계도
자식의 메소드를 static 으로 설정하면 자식의 정적 메소드가 부모의 인스턴스 메소드, 필드값보다 순서상 먼저 메모리에 올라간다.
-> 상속 (부모-자식) 관계가 있어도 정적에서 인스턴스 사용 어려움
(기본 메소드 기준) 자식 클래스는 부모 클래스를 먼저 올리고 올라가기 때문에 부모의 필드값을 가져오는 것이 가능하다
super()를 사용한다.
-항상 첫줄에 사용해야하며, 보내려는 값만큼 ()에 넣으면 된다.
(main)
// 부모 생성자 호출을 이용해 부모 클래스인 A에 값 넣기
AAA aaa = new AAA(10, true);
(AAA 클래스)
// main에서 보내준 값 부모로 올리기
public AAA(int a, boolean b) {
super(a,b);
System.out.println("AAA의 int boolean 명시적 생성자입니다 ");
}
(AA 클래스)
// main에서 보내준 값 AAA에서 받아 부모로 올리기
public AA (int a, boolean b){
super(a, b);
System.out.println("AA의 int boolean 명시적 생성자 입니다");
}
(A 클래스)
// main에서 보내준 값 AAA에서 부모 AA로 올리기
// AA에서 부모 A로 보낸 내용 받기
public A(int a, boolean b) {
this.a = a;
this.b = b;
System.out.println("A의 int boolean 명시적 생성자 입니다 " +a + " , " + b);
}
CC -> BB -> A 클래스에서도 확인할 수 있다
static String dept;
void aaMethod() {
// static 이니까 클래스.변수명 사용 가능
// 그냥 불러서 사용하는 것도 가능
AA.dept = "영문과";
dept = "연영과";
}
static String dept;
static void aaMethod1() {
AA.dept = "영문과";
dept = "연영과";
}
// static 으로 올려놓은 필드값은 가장 먼저 올라가기 때문에
// 기본 생성자에서도 사용 가능
void aaMethod2() {
AA.dept = "영문과";
dept = "연영과";
}
public class A {
int a;
boolean b;
double x;
String name;
boolean y;
// 기본 생성자 만들기
public A() {
System.out.println("A의 기본생성자 입니다");
}
// main에서 보내준 값 AAA에서 부모 AA로 올리기
// AA에서 부모 A로 보낸거 받기
public A(int a, boolean b) {
this.a = a;
this.b = b;
System.out.println("A의 int boolean 명시적 생성자 입니다 " +a + " , " + b);
}
// main에서 보내준 값 CC에서 부모 BB로 올리기
// BB에서 부모 A로 보낸거 받기
public A(double x, String name, boolean y) {
this.x = x;
this.name = name;
this.y = y;
System.out.println("A의 double, String, boolean 명시적 생성자입니다");
}
}
public class AA extends A{
static String dept; // 정적변수
String schoolName; // 인스턴스 변수
// 기본 생성자 만들기
public AA() {
System.out.println("AA의 기본생성자 입니다");
}
// main에서 보내준 값 AAA에서 받아 부모로 올리기
public AA (int a, boolean b){
// super는 가장 첫줄에 있어야 한다
super(a, b);
System.out.println("AA의 int boolean 명시적 생성자 입니다");
}
void aaMethod() {
// static 으로 올려놓은 필드값은 가장 먼저 올라가기 때문에
// 생성자에서 사용 가능
dept = "컴퓨터";
System.out.println("AA의 static 값 입니다" + dept); // 그냥 불러서 사용하는 것도 가능
System.out.println("AA의 static 값 입니다" + AA.dept); // static 이니까 클래스.변수명 도 가능
}
static void aaMethod1() {
// static 이니까 클래스.변수명 사용 가능
// 그냥 불러서 사용하는 것도 가능
AA.dept = "영문과";
dept = "연영과";
}
}
public class BB extends A {
// 기본 생성자 만들기
public BB() {
System.out.println("BB의 기본생성자 입니다");
}
// CC에서 보내준 값 부모 A로 올리기
public BB(double a, String name, boolean b) {
super(a, name, b);
System.out.println("BB의 double, String, boolean 명시적 생성자입니다");
}
}
public class AAA extends AA{
// 기본 생성자 만들기
public AAA() {
System.out.println("AAA의 기본생성자 입니다");
// 부모의 필드 사용해보기
// (기본생성자) 자식 클래스는 부모 클래스를 먼저 올리고 올라가기 때문에
// 필드 가능하다
schoolName = "한국대";
aaMethod();
AA.aaMethod1();
AA.dept = "웹 디자인";
}
// main에서 보내준 값 부모로 올리기
public AAA(int a, boolean b) {
// super는 가장 첫줄에 있어야 한다
super(a,b);
System.out.println("AAA의 int boolean 명시적 생성자입니다 ");
}
// 부모 필드 사용해보기
static void aaaMethod() {
// 부모의 필드 사용해보기
// static은 (부모-자식 간이라고 해도) 순서상 메모리에 먼저 올라가기 때문에
// 인스턴스 변수는 사용 불가하다
// schoolName = "한국대";
// aaMethod();
AA.aaMethod1();
AA.dept = "웹 디자인";
}
void aaaMethod1() {
// 부모의 필드 사용해보기
// (기본 메소드) 자식 클래스는 부모 클래스를 먼저 올리고 올라가기 때문에
// 필드 가능하다
schoolName = "한국대";
aaMethod();
AA.aaMethod1();
AA.dept = "웹 디자인";
}
}
public class BBB extends AA{
// 기본 생성자 만들기
public BBB() {
System.out.println("BBB의 기본생성자 입니다");
}
}
public class CC extends BB{
// 기본 생성자 만들기
public CC() {
System.out.println("CC의 기본생성자 입니다");
}
// CC cc1 = new CC(3.14, "홍길동", false);
// 부모로 올리기
public CC(double a, String name, boolean b) {
super(a, name, b);
System.out.println("CC의 double, String, boolean 명시적 생성자입니다");
}
}
public class InHeriEx {
public static void main(String[] args) {
//CC 객체화
CC cc = new CC();
System.out.println("------------------------------------");
// AAA 객체화
// 부모 생성자 호출을 이용해 부모 클래스인 A에 값 넣기
AAA aaa = new AAA(10, true);
// 필드 값만 출력하기
System.out.println();
System.out.print(aaa.a);
System.out.println(" " + aaa.b);
System.out.println("------------------------------------");
// CC객체화
// 부모 생성자 호출을 이용해 부모 클래스인 A에 값 넣기
CC cc1 = new CC(3.14, "홍길동", false);
// 필드 값만 출력하기
System.out.println();
System.out.print(cc1.x);
System.out.print(" " + cc1.name);
System.out.println(" " + cc1.y);
System.out.println("------------------------------------");
}
}
실행결과