Thinking in Java 노트 및 객체 초기화

12017 단어
최근'씽킹 인 자바'(Thinking in Java)라는 책을 보면서 그동안 클래스 및 대상의 초기화 과정에 대해 잘 알지 못했지만 모호함을 느꼈을 뿐이다.이 책은 대상의 초기화에 관한 부분을 보고 마침내 깨달았다.
쓸데없는 말은 그만하고 먼저 두 가지 예를 들자. 실례는 에서 발췌한 것이다.
Test1:
 1 package com.westward;
 2 /**
 3  * @desc 《Thinking in Java》 Demo Page 115
 4  * */
 5 public class Demo14 {
 6 
 7     public static void main(String[] args) {
 8         // TODO Auto-generated method stub
 9         System.out.println("Inside main");// static static , static , , static main 
10         Cups.c1.f(99);//1
11     }
12     
13     /*static Cups x=  new Cups();
14     static Cups y=     new Cups();*///2
15 }
16 class Cup{
17     public Cup(int marker) {
18         System.out.println("Cup("+marker+")");
19     }
20     void f(int marker){
21         System.out.println("f("+marker+")");
22     }
23 }
24 class Cups{
25     static Cup c1;
26     static Cup c2;
27     static{
28         c1= new Cup(1);
29         c2= new Cup(2);
30     }
31     Cups() {
32         System.out.println("Cups()");// TODO Auto-generated constructor stub
33     }
34 }
35 //run as:Cup(1)  Cup(2)  Cups() Cups() Inside main f(99)
36 // tag2:Inside main Cup(1) Cup(2)  f(99) 

Cups 클래스는 다음과 같이 정의되며 초기화 프로세스는 동일합니다.즉, static 구성원 변수를 초기화한 다음에static 코드 블록을 초기화합니다.
 1 class Cups{
 2     static{
 3         c1= new Cup(1);
 4         c2= new Cup(2);
 5     }
 6     static Cup c1;
 7     static Cup c2;
 8     Cups() {
 9         System.out.println("Cups()");// TODO Auto-generated constructor stub
10     }
11 }

 
Test2:
 1 package com.westward;
 2 
 3 /**
 4  * @desc 《Thinking in Java》 Demo Page 117
 5  * */
 6 public class Demo15 {
 7     Mug c1;
 8     Mug c2;
 9     {
10         c1= new Mug(1);
11         c2= new Mug(2);
12         System.out.println("c1 & c2 initialized");
13     }
14     Demo15(){
15         System.out.println("Mugs()");
16     }
17 
18     public static void main(String[] args) {
19         // TODO Auto-generated method stub
20         System.out.println("Inside main()");
21 //        Demo15 x= new Demo15();//2
22     }
23 
24 }
25 class Mug{
26     Mug(int marker) {
27         System.out.println("Mug("+marker+")");
28     }
29     void f(int marker){
30         System.out.println("f("+marker+")");
31     }
32 }
33 //Inside main() Mug(1) Mug(2) c1 & c2 initialized Mugs() 
34 // tag2: Inside main()

총괄:Test1과Test2에서 알 수 있듯이 우선, 메인 방법인main을 불러오는 Demo14라는 클래스를 jvm에서 기본적으로main을 불러오는 방법인demo14라는 클래스를 호출하는 것으로 이해할 수 있다.class, 그리고 Demo14에 있는 static 수식의 구성원 변수를 초기화하고, static 수식의 코드 블록을 실행하고main 방법을 실행합니다.main 메서드에는 다음과 같은 세 가지 출구가 있습니다.
a. 클래스 (예: Cups x) 를 정의하고 이 대상 Cups () 를 new에서 초기화하면 jvm에서 Cups를 불러옵니다.class, 그리고static 구성원 변수를 초기화한 다음static 수식된 코드 블록을 실행하고, 비정상적인 구성원 변수를 실행한 다음, 비정상적인 코드 블록을 실행하고, 구조기를 구성합니다.
b. 클래스의 정적 방법이나 정적 클래스의 정적 성어를 직접 호출하면, 예를 들어Cups를 호출한다.c1.f(99),그러면 jvm에서도 Cups를 불러옵니다.class 클래스를 초기화합니다.순서는:static 구성원 변수를 초기화한 다음static 수식된 코드 블록을 실행한 다음에 비정상적인 구성원 변수를 실행한 다음에 비정상적인 코드 블록을 실행한 다음에 구조기입니다.
c. 만약main 방법에 new 대상도 없고 클래스를 호출하는 정적 구성원이나 정적 방법도 없으면 클래스가 불러오지 않기 때문에 클래스가 초기화되지 않고 대상이 초기화되지 않습니다.
참고:
  1.위의 초기화 과정은 정적 구성원, 정적 코드 블록, 비정적 구성원, 비정적 코드 블록이 모두 존재하는 상황을 가정한다.만약 어떤 항목이 존재하지 않는다면 순서는 변하지 않을 것이다. 우리는 이 순서 목록에서 삭제하기만 하면 된다.
  2.같은 클래스 (Cups) 의 여러 대상이 있거나, Cups의 정적 방법이나 정적 구성원을 여러 번 호출할 때, Cups.class는 한 번만 불러오고 초기화합니다.즉, static 구성원 변수와 static 정적 코드 블록은 한 번만 초기화된다.비정상적인 대상의 비정상적인 구성원 변수, 비정상적인 코드 블록, 구조기의 초기화 횟수는 new의 횟수와 같다.
  3.새 Cups의 대상이 나오면 jvm에서 Cups를 불러옵니다.class, 그리고 static 장식을 초기화하는...그 다음에 비정상적인 구성원에 대한 기본 초기화 값 [기본 데이터 형식(int,byte,short,long은 0,float,double는 0.0,boolean은false,char는'), 인용 데이터 형식은null]로 초기화하고 이 구성원의 변량을 초기화하는 것을 표시하면 초기화를 실행하고 비정상적인 코드 블록을 실행한 다음 구조기를 실행합니다.

좋은 웹페이지 즐겨찾기