2013-10-02 4 views
0

나는 자바를 배우고 있는데, String args [main의 주장이 어떻게 작동하는지 궁금해했다. 메서드에 정의 된 다른 문자열 배열의 경우 고정 된 차원으로 초기화해야 사용할 수 있습니다. 난 그냥 String a;를 입력 한 다음 a[0] = "Word;"를 입력하면String [] args가 다른 문자열 배열처럼 사용되도록 초기화되지 않은 이유는 무엇입니까?

예를 들어, 문자열에 10 이하 요소를 입력하는 경우, 나는, 그러나 String a = new String[10];

를 입력해야합니다, 나는이 초기화되지 않았을 수도 "변수를 가져올 "오류가 발생했습니다.

그러나 String args []의 경우 String[] args = new args[]을 입력 할 필요가 없습니다. 왜 그래야만하지? 또한 String args []와 같이 무한 크기의 문자열을 생성 할 수 있습니까? (내가 명확하지 않은 경우 미안)

+2

을 main 함수의 매개 변수는 사용자가 초기화하지 않고 응용 프로그램 스레드를 만들 때 VM을 초기화합니다. 당신의 관점에서 보면, 문자열 배열을 인수로 취하는 임의의 함수를 호출하는 것처럼 배열 참조를 얻을 수 있습니다. 또한, Java 배열은 무한 크기를 가질 수 없습니다. 주 함수 문자열 배열 매개 변수조차 java의 모든 배열과 동일한 상한을가집니다.내가 실수하지 않는다면 2^31-1이되어야합니다. – samjaf

+0

차이점은 호출 코드가 자신을 만들지 않고 배열을 만들 것을 기대한다는 것입니다. 그것이 만들어 질 때, 그것은 같은 방법입니다. –

답변

0

매개 변수의 유형이 String[] 인 유일한 정보이므로 Strings 테이블입니다. 이것은 초기화 유형이 아닌 유형입니다.

3

메서드에 정의 된 다른 문자열 배열의 경우 고정 된 차원으로 초기화해야 사용할 수 있습니다.

main 메서드의 인수가 String... 인 경우에 발생합니다. 그것은 커맨드 라인 args로 전달 인자의 고정 번호로 초기화된다. 하지만 그 후에는 크기가 고정되어 있으므로 배열에 아무 것도 추가 할 수 없습니다. 인수를 전달하지 않으면 길이는 0이됩니다.

인수 유형은 실제로는 varargs이고 String[]은 아니지만 내부적으로는 이전에 나중에 변환됩니다. varargs를 사용하면 얻을 수있는 이점은 명시 적으로 배열을 만들지 않고도 가변 인수를 전달할 수 있다는 것입니다.

또한 String args []와 같은 무한 크기의 문자열을 만들 수 있습니까?

아니요 배열의 크기에는 제한이 없습니다. args.length 유형은 int입니다. 논리적으로 최대 요소 수는 2^32 - 1 일 수 있습니다. 하지만 실제로는 그렇지 않습니다. 아마도 그보다 훨씬 많은 메모리가 오버 플로우 될 것입니다.

또한 우리가 메서드 형식 매개 변수에 대해 이야기하고 있으므로 최대 메서드 크기 제한이 여전히 있습니다. JVM에 따라 메서드의 최대 크기는 65536 바이트로 제한됩니다. 예를 들어

: JVM이 종류의이 같은) (주 제어를 전달하기 전에 당신을위한 문자열 [] 인수를 설정하는 것입니다

public static void test(String... names) { 
    System.out.println("Names array length: " + names.length); 
    names[names.length] = "xyz"; // This would fail as expected. 

    names = new String[10]; // this however you can do. Re-assign a new array to names 
} 

public static void main(String... args) { 
    test("a", "b", "c"); // pass 3 arguments 
    test("a", "b");  // pass 2 arguments 
} 
0

:

class InternalThingYouDoNotSee { 
    String[] args = build args[] from command line 
    Class.forName("YourClass").newInstance().getDeclaredMethod("main").invoke(args); 
} 
class YourClass { 
    public static void main(String[] args) { 
     /.... 
    } 
} 
관련 문제