Chapter 5 초기 화 및 청소

this 키워드
 
1)this 키 워드 는 방법 내부 에서 만 사용 할 수 있 으 며'호출 방법의 그 대상'에 대한 인용 을 표시 합 니 다.
 
2)this 로 구조 기 를 호출 할 수 있 으 나 같은 방법 으로 두 구조 기 를 호출 할 수 없다.예 를 들 면:
    Flower(int petals) {
        petalCount = petals;
        print("Constructor w/ int arg only, petalCount= "
                + petalCount);
    }

    Flower(String ss) {
        print("Constructor w/ String arg only, s = " + ss);
        s = ss;
    }

    Flower(String s, int petals) {
        this(petals);
        // ! this(s); // Can't call two!
        this.s = s; // Another use of "this"
        print("String & int args");
    }

구조 기 를 제외 하고 컴 파일 러 는 다른 어떤 방법 에서 도 구조 기 를 호출 하 는 것 을 금지한다.예 를 들 면:
    void printPetalCount() {
        // ! this(11); // Not inside non-constructor!
        print("petalCount = " + petalCount + " s = " + s);
    }

 
구조 기 초기 화 
 
1)클래스 내부 에서 변수 정의 의 우선 순위 가 초기 화 순 서 를 결정 합 니 다.
 
2)static 키 워드 는 부분 변수 에 적용 할 수 없고 도 메 인 에 만 사용 할 수 있 습 니 다.
 
3)초기 화 순 서 는 먼저'정적'입 니 다.(앞의 대상 생 성 과정 으로 초기 화 되 지 않 았 다 면)다음'정적'입 니 다.
 
4)대상 의 생 성 과정 이 도움 이 될 것 입 니 다.Dog 라 는 클래스 가 있다 고 가정 합 니 다.
1.Dog 형식의 대상 을 처음 만 들 때(구조 기 는 정적 방법 으로 볼 수 있 습 니 다)또는 Dog 류 의 정적 방법/정적 도 메 인 이 처음 방문 되 었 을 때 자바 해석 기 는 클래스 경 로 를 찾 아 Dog.class 파일 을 찾 아야 합 니 다.
2.그리고 Dog.class 를 불 러 옵 니 다.정적 초기 화 동작 은 모두 실 행 됩 니 다.따라서 정적 초기 화 는 Class 대상 이 처음 불 러 올 때 만 실 행 됩 니 다.
3.new Dog()로 대상 을 만 들 때 먼저 더미 위 에 Dog 대상 에 게 충분 한 저장 공간 을 분배 합 니 다.
4.이 저장 공간 은 삭 제 됩 니 다.이 는 Dog 의 모든 기본 형식 데 이 터 를 기본 값 으로 자동 으로 설정 합 니 다(숫자 에 있어 서 0 이 고 불 형 과 문자 형 도 같 습 니 다).인용 은 null 로 설정 합 니 다.
5.도 메 인 정의 에 나타 나 는 모든 초기 화 동작 을 수행 합 니 다.
6.실행 구조 기.이 는 많은 동작,특히 계승 에 관련 될 수 있다.
 
배열 초기 화
 
1)컴 파 일 러 는 배열 의 크기 를 지정 할 수 없습니다.
 
2)배열 의 세 가지 초기 화 방법 과 주의사항.
	/**
	 *           ,                
	 * */
	class ArrayTest {
		/**
		 *    ,         。                  。
		 * */
		Integer[] integer0 = { 1, 2, 3 };
		/**
		 *    , new      。                   
		 * */
		Integer[] integer1 = new Integer[] { 1, 2, 3 };
		/**
		 *    ,         。                  。       ,                  ,
		 *      new      ,                   ;           ,             null。
		 * */
		Integer[] integer2 = new Integer[3];
		{

			for (int i = 0; i < integer2.length; i++) {
				integer2[i] = i;
			}
		}

	}

3)배열 과 가 변 매개 변수 목록
매개 변수 개수 와 매개 변수 유형 이 알 수 없 는 경우 배열 의 두 번 째 초기 화 방법 으로 가 변 매개 변수 목록 을 만 들 수 있 습 니 다.예 를 들 어:
class A {
}

public class VarArgs {
	static void printArray(Object[] args) {
		for (Object obj : args)
			System.out.print(obj + " ");
		System.out.println();
	}

	public static void main(String[] args) {
		printArray(new Object[] { new Integer(47), new Float(3.14),
				new Double(11.11) });
		printArray(new Object[] { "one", "two", "three" });
		printArray(new Object[] { new A(), new A(), new A() });
	}
} 

자바 5 에 서 는 가 변 매개 변수 목록 을 아래 와 같이 정의 할 수 있 습 니 다.
class A {
}

public class NewVarArgs {
	static void printArray(Object... args) {
		for (Object obj : args)
			System.out.print(obj + " ");
		System.out.println();
	}

	public static void main(String[] args) {
		// Can take individual elements:
		printArray(new Integer(47), new Float(3.14), new Double(11.11));
		printArray(47, 3.14F, 11.11);
		printArray("one", "two", "three");
		printArray(new A(), new A(), new A());
		// Or an array:
		printArray(new Integer[] { 1, 2, 3, 4 });
		printArray(); // Empty list is OK
	}
}

가 변 매개 변수 목록 이 있 으 면 배열 문법 을 표시 하지 않 아 도 됩 니 다.매개 변 수 를 지정 할 때 컴 파일 러 는 배열 을 채 워 줍 니 다.가 져 온 것 은 여전히 배열 입 니 다.프로그램의 마지막 두 번 째 줄 에 주의 하 십시오.가 변 매개 변수 목록 도 하나의 배열 을 매개 변수 로 받 아들 일 수 있 습 니 다.
 
가 변 매개 변수 목록 은 리 셋 과정 을 복잡 하 게 만 듭 니 다.
public class OverloadingVarargs {
    static void f(Character... args) {
        System.out.print("first");
        for (Character c : args)
            System.out.print(" " + c);
        System.out.println();
    }

    static void f(Integer... args) {
        System.out.print("second");
        for (Integer i : args)
            System.out.print(" " + i);
        System.out.println();
    }

    static void f(Long... args) {
        System.out.println("third");
    }

    public static void main(String[] args) {
        f('a', 'b', 'c');
        f(1);
        f(2, 1);
        f(0);
        f(0L);
        // ! f(); // Won't compile -- ambiguous
    }
} 

인자 호출 f()를 사용 하지 않 을 때 컴 파일 러 는 어떤 방법 을 사용 해 야 하 는 지 알 수 없습니다.당신 은 어떤 방법 에 비 가 변 적 인 파 라 메 터 를 추가 하여 이 문 제 를 해결 할 수 있 습 니 다.
public class OverloadingVarargs2 {
    static void f(float i, Character... args) {
        System.out.println("first");
    }

    static void f(Character... args) {
        System.out.print("second");
    }

    public static void main(String[] args) {
        f(1, 'a');
//         f('a', 'b'); //Won't compile -- ambiguous  
    }
}

만약 당신 이 이 두 가지 방법 에 모두 비 가 변 적 인 파 라 메 터 를 추가 하면 문 제 를 해결 할 수 있 습 니 다.
public class OverloadingVarargs3 {
    static void f(float i, Character... args) {
        System.out.println("first");
    }

    static void f(char c, Character... args) {
        System.out.println("second");
    }

    public static void main(String[] args) {
        f(1, 'a');
        f('a', 'b');
    }
}

항상 리 셋 방법의 한 버 전에 만 가 변 매개 변수 목록 을 사용 하거나 아예 사용 하지 않 아야 합 니 다.

좋은 웹페이지 즐겨찾기