2013-10-12 6 views
1

로컬 변수를 선언하기 전에 초기화하기위한 규칙은 무엇입니까? 변수를 선언하기 전에 사용할 수 있습니까? 나는 그것이 불법입니다이 페이지 (Local Variable Declaration Issue)에서 볼 수, 아직 내가하려고하면 그것은 작동 :선언되기 전에 변수를 사용하는 데 오류가 없습니까?

public static String toHelp = "--help"; 
public static void main(String[] args) { 
    System.out.println(toHelp); 
    String toHelp = args[0]; 
} 

답변

1

혼란스러워하는 이유는 C#과 Java에서는 로컬 변수 범위 지정의 규칙이 다릅니다. Java (질문을 Java 태그와 함께 게시 한 경우)는 변수 선언이 발생하고 확장되는 지점에서 범위가 시작됩니다 둘러싸는 블록의 끝까지 아래로. 따라서 귀하의 예에서 println은 로컬 변수가 기술적으로 그 지점에 있지 않기 때문에 실제로 로컬 변수를 고려하지 않고 정적 필드를 취합니다.

C#에서 동일한 작업을 수행 한 경우 (포함 된 링크는 Java가 아니라 C# 용입니다) 실제로 오류가 발생합니다. 범위 지정 규칙은 다릅니다. C#에서는 변수의 범위가 전체 둘러싸는 블록이므로 선언 앞에 있지만 블록에 나타나는 명령문도 포함됩니다. 샘플이 C# 인 경우 main의 첫 번째 문은 초기화되지 않은 변수에 액세스하는 것이며 컴파일러 오류입니다.

0
public static String toHelp = "--help"; 

당신은 이미 선언과 같음 "--help"를 정의했다.

스캐너 입력으로 다시 설정됩니다.

1

toHelp은 정적 변수입니다. 이미 귀하의 main()에 표시되어 있으며 이미 선언되고 초기화되었습니다.

args에 대해 묻는다면 메서드 매개 변수이므로 메서드 선언 자체의 일부로 이미 선언되어 있습니다.

인스턴스 변수 인 경우 this.toHelp을 사용하여 메소드에 액세스 할 수 있습니다. 그리고 (이 경우) 정적 변수를 사용하면 ClassName.toHelp를 사용하여 2 개의 변수를 구별 할 수 있습니다.

+0

@SotiriosDelimanolis - 감사 :) 답변을 업데이트했습니다. – SudoRahul

+0

Java : 'toHelp'의 두 번째 선언이 파일 범위 변수를 마스킹하는 새 로컬 변수 (함수 수준 범위 내)를 만들겠습니까? 그렇다면이 두 함수를 어떻게 구별 할 수 있습니까? (위의 답변으로 Sotirios Delimanolis : http://stackoverflow.com/a/19335195/1364365) – Garrick

+1

인스턴스 변수 인 경우 'this.toHelp'를 사용합니다. 하지만이 경우에는 정적 변수이므로 ClassName.toHelp를 사용하여 구분할 수 있습니다. – SudoRahul

2

는 범위 이름 toHelp 두 변수가

String toHelp = args[0]; 

의 실행 후

public static void main(String[] args) { 
    System.out.println(toHelp); // using the already initialize static variable 
    String toHelp = args[0]; // shadowing the static variable with a local variable 
} 

섀도 잉은 Java Language Specification here.

설명하는 주석을 참조하십시오. 로컬 주소는 toHelp이라는 이름으로 액세스 할 수 있습니다. 이제 static 클래스는 그림자가 적용되어 ClassName.toHelp으로 액세스해야합니다.

+0

나는 그것이 그림자 아래에 온다고 생각하지 않는다. 아주 새로운 방법의 지역 변수가 만들어졌다. 맞습니까? –

+1

@ sᴜʀᴇsʜᴀᴛᴛᴀ JLS 상태 _ 일부 선언은 동일한 이름의 다른 선언으로 범위의 일부를 숨길 수 있습니다.이 경우 간단한 이름을 사용하여 선언 된 엔터티를 참조 할 수 없습니다 ._ 여기에 해당되는 것으로 생각됩니다. 내가 게시 한 링크에도 예제가 있습니다. –

+0

의미가 있습니다. 그림자 개념이 유형, 하위 유형 관계에만 적용된다고 생각합니다. :) 나는 그 링크를주의 깊게 한 번 거쳐야한다고 생각합니다. –