2013-12-21 2 views
1

프로그래밍이 완전히 새로워졌습니다. 디버그하기 힘든 버그가 있습니다. 지난 며칠 동안 에 대한 문제를 해결하려고했습니다. 그렇게함으로써 거의 히스테릭 상태에 빠졌습니다. 앉아서 그냥 임의의 페이지에서 Java 책을 읽으려고 결정했습니다. 이 페이지는 가변 섀도 잉에 관한 내용이었습니다. 그런 다음 갑자기 내 코드에서이 말도 안되는 것을 깨달았습니다. 동일한 변수를 두 번 선언합니다. 나는 그것을 제거하고 버그가 기화하는 것처럼 보였다.그림자가있는 변수입니까?

public class Action extends JPanel { 
    private final Color BACKGROUND_COLOR = Color.BLACK; //JPanel background 
    private GameMemory memory = new GameMemory();   
    private int[][] grid = memory.getGrid(); 
    public static Color penColor = Color.GRAY;   //Variable for 
                 //color 

    public Action() { //Setting everything for JPanel 
     memory = new GameMemory(); 
     grid = memory.getGrid(); 
     setBackground(BACKGROUND_COLOR); 
     setMinimumSize(new Dimension(360, 720)); 
     setPreferredSize(new Dimension(360, 720)); 
     setMaximumSize(new Dimension(360, 720)); 
     setVisible(true); 
     new Timer(100, new TimerListener()).start(); 
     //Setting Everything for keylistener 
     this.setFocusable(true); 
     this.requestFocus(); 
     this.addKeyListener(new MyKeyListener()); 
    } 

그럼 너희들은 어떻게 생각하니? 이것은 정말로 그림자 사건입니까?

답변

0

선언에 섀도 잉 개념이 없습니다.

서로 다른 범위의 동일한 이름을 가진 변수 나 상위 및 하위 변수가 동일한 변수 이름을 갖고 액세스 할 때 그림자 효과가 생깁니다.

가능성

로컬 변수 그림자 인스턴스 변수 섀도 잉이다.

어노테이션 변수 어둡게 부모로부터 상속 된 변수.

grid = memory.getGrid(); 

이 값을 쓰면 이전 값이 무시됩니다.

+0

그래서이 특정 스 니펫에서는 어떤 식 으로든 코드에 영향을주지 않습니까? 재 할당 일 뿐이에요? – user3081519

+0

그래서 메모리와 그리드 상단에 정의 된 인스턴스 변수는 누가 클래스이고 메모리와 생성자의 그리드는 ... 생성자에 대한 로컬입니까? 이것은 생성자가 자체 범위가있는 메서드임을 의미합니까? – user3081519

+0

@ user3081519 먼저 클래스에서 초기화되고 생성자에서 재정의됩니다. 여기에 범위가 없습니다. –

0

여러 가지 방법으로 멤버 변수를 초기화 할 수 있습니다. 변수를 두 번 초기화했습니다. 그것이 선언되었을 때, 그리고 생성자에서. 두 곳에서 할 필요가 없습니다. 선언시 멤버 변수를 초기화하면 생성자 호출마다 동안 초기화됩니다. 버그는 변수가 초기화되는 순서와 관련이 있습니다.