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]로 초기화하고 이 구성원의 변량을 초기화하는 것을 표시하면 초기화를 실행하고 비정상적인 코드 블록을 실행한 다음 구조기를 실행합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.