자바는 Static block -> Instance block -> 생성자 순으로 초기화가 된다.
먼저 아래와 같은 코드를 실행해 보자.
public class TestClass {
public static void main (String[] args) {
System.out.println("---------------------------");
Parent father = new Parent("father");
System.out.println("---------------------------");
}
}
class Parent {
public String myName = "Parent";
static {
System.out.println ("This is first message of Parent class!");
}
public Parent() {
System.out.println (myName + ": This is third message! I'm a default constructor of Parent class!");
}
public Parent(String name) {
myName = name;
System.out.println (myName + ": This is third message! I'm a constructor of Parent class!");
}
{
System.out.println (myName + ": This is second message!");
}
}
그럼 하기와 같은 결과를 얻을 수 있다.
---------------------------
This is first message of Parent class!
Parent: This is second message!
father: This is third message! I'm a constructor of Parent class!
---------------------------
public class TestClass {
public static void main (String[] args) {
System.out.println("---------------------------");
Parent father = new Parent("father");
Parent mother = new Parent("mother");
System.out.println("---------------------------");
}
}
class Parent {
public String myName = "Parent";
static {
System.out.println ("This is first message of Parent class!");
}
public Parent() {
System.out.println (myName + ": This is third message! I'm a default constructor of Parent class!");
}
public Parent(String name) {
myName = name;
System.out.println (myName + ": This is third message! I'm a constructor of Parent class!");
}
{
System.out.println (myName + ": This is second message!");
}
}
---------------------------
This is first message of Parent class!
Parent: This is second message!
father: This is third message! I'm a constructor of Parent class!
Parent: This is second message!
mother: This is third message! I'm a constructor of Parent class!
---------------------------
여기서 보면 static { } 으로 둘러 싸인 구문은 객체 생성시 최초 1회만 수행이 되고, 그 뒤에는 수행이 되지 않는 걸 알 수 있다. 그러나 { } 로 둘러싸인 instance block은 객체가 생성 될 때마다 실행 되며 생성자 보다 먼저 생성되는 걸 알 수 있다.
class Child extends Parent {
public String myName = "Child";
static {
System.out.println ("This is first message of Child class!");
}
public Child(String name) {
myName = name;
System.out.println (myName + ": This is third message! I'm a constructor of Child class!");
}
{
System.out.println (this.myName + ": This is second message of Child class!");
}
}
위 와 같이 Parent class를 상속받는 Child 클래스를 만들고, 아래와 같이 객체를 생성해 보자
public class TestClass {
public static void main (String[] args) {
System.out.println("---------------------------");
Child son = new Child("son");
System.out.println("---------------------------");
}
}
그럼 하기와 같은 결과가 나온다.
---------------------------
This is first message of Parent class!
This is first message of Child class!
Parent: This is second message!
Parent: This is third message! I'm a default constructor of Parent class!
Child: This is second message of Child class!
son: This is third message! I'm a constructor of Child class!
---------------------------
위 결과를 보면 알 수 있듯이,
부모 클래스의 static block -> 자식 클래스의 static block -> 부모 클래스의 instance block
-> 부모 클래스의 생성자 -> 자식 클래스의 instance block -> 자식클래스의 생성자 순으로 실행 되는 것을 알 수 있다.
마지막으로 아래와 같이 실행을 하면,
public class TestClass {
public static void main (String[] args) {
System.out.println("---------------------------");
Parent father = new Parent("father");
Parent mother = new Parent("mother");
Child son = new Child("son");
System.out.println("---------------------------");
}
}
하기와 같이 실행 된다. 천천히 살펴보면 앞에서 설명한 내용에서 벗어나지 않는다.
---------------------------
This is first message of Parent class!
Parent: This is second message!
father: This is third message! I'm a constructor of Parent class!
Parent: This is second message!
mother: This is third message! I'm a constructor of Parent class!
This is first message of Child class!
Parent: This is second message!
Parent: This is third message! I'm a default constructor of Parent class!
Child: This is second message of Child class!
son: This is third message! I'm a constructor of Child class!
---------------------------
'Coding > Java 삽질기' 카테고리의 다른 글
Java 실행 시간 측정 하기 (0) | 2011.09.01 |
---|---|
[Android] Image match game (0) | 2011.06.04 |
Android Tetris (0) | 2011.02.02 |