2012-12-12 7 views
3

내부 클래스의 변수를 수정해야합니다. 컴파일러에서 정적 변수를 선언해야한다고 말합니다.하지만이를 수정할 수는 없습니다. 코드는 다음과 같습니다.Java의 내부 클래스에서 변수에 액세스

public class Outter{ 
    private boolean b; 

    public Outter(){ 
     b = false; 
     new Inner(b); 
    } 
} 

public class Inner{ 
    public Inner(boolean b){ 
     b = true; 
    } 
} 

C에 "extern"과 같은 것이 있습니까? 또는 어떤 솔루션 그래서 나는 b 변수를 수정할 수 있습니까? 정적으로 설정하고 전체 Outter 클래스를 매개 변수로 전달하려고 시도했지만 동일한 문제가 계속 발생합니다.

편집 : 문제는 내가 뷰 2 클래스에서 변수 "보기"를 수정해야하는 방법이다

public class MainView{ 
    private boolean view; 
    //JMenus,JMenuItems, JPanels.. declarations 
    private JFrame frame 
    MainView(){ 
    view = true; 
    //initializations 
    create_listeners(); 
    } 
    public void create_listeners(){ 
     Menu.addActionListener(
     new ActionListener() { 
      public void actionPerformed(ActionEvent event){ 
       if(View){ 
        new View2(frame); 
        View = false; 
       } 
      } 

     } 
    ); 
    } 
} 

public class View2{ 
    private JButton back = new JButton("Back"); 
    public View2(JFrame frame){ 
    //initialitzatons 
    create_listeners(); 
} 
    public void create_listeners(){ 
      back.addActionListener(
     new ActionListener() { 
      public void actionPerformed(ActionEvent event){ 
       frame.remove(MainPanel); 
       View = true;// HERE, i want to modify the variable 
       } 

     } 
    ); 
    } 
} 

자세한처럼 잘 코드입니다.

잘못된 표를 작성하여 죄송합니다. 신속하게 처리했으며 이해할 수있는 코드 변환이 필요했습니다.

+0

비슷한 질문에 대한 회신을보십시오 : http://stackoverflow.com/questions/6830637/what-is-the-equivalent-keyword-for-extern-in-java – sglahn

답변

6

구문은 다음과 같이 당신이 Outter.this

public class Outter{ 
    private boolean b; 

    class Inner{ 
     public Inner(boolean b){ 
      Outter.this.b = true; 
     } 
    } 
} 

편집을 사용하여 외부 클래스에 대한 참조를 얻을 수 있습니다 : 그것은 당신이 단지 참조를 전달하여 B를 수정하려고하는 나에게 보인다. 자바에서는 불가능합니다. 변수는 참조 변수의 사본 (참조 변수는 포인터와 유사 함) 또는 프리미티브의 경우 사본으로 인수로 전달됩니다.

+0

다른 해결책이 있습니까? 참조로 전달 하시겠습니까? 내부 클래스가 외부에서 파일의 일부가되도록하고 외부에서 호출하는 것은 내부를 호출하는 것입니다. C/C++에서는 extern에서 쉽게 할 수 있지만 java에서 수행하는 방법을 알지 못합니다. – user1897262

+0

Outter에는 부울이있는 객체 (예 : setter가있는 Java bean)가 있어야합니다.그런 다음이 객체에 대한 참조를 Inner에 전달하고 Inner는 부울 값을 변경할 수 있습니다 (새 값을 설정하려면 setter 사용). 나는 C 배경에서 누군가에게 과도한 잔인 함을 느낀다. 그러나 개발의 몇 년 후에 나는 개인적으로 이것이 더 단순하고 명확한 프로그래밍 스타일을 높이 평가하게되었다. – dkateros

+0

그래서 부울 대신, 부울을 포함하는 다른 "미니 클래스"를 만들고 함수를 설정/가져 와서이 클래스의 매개 변수로 전달해야합니까? – user1897262

3

당신이 좋아하는 뭔가를 찾고있다 :

은 첫째, 당신의 내부 클래스는 외부 클래스 외부에
public class Outer { 
    // Using atomic because it is a convenient mutable boolean. 
    private final AtomicBoolean b = new AtomicBoolean(); 

    public Outer() { 
    b.set(true); 
    new Inner(); 
    } 

    public class Inner { 
    public Inner() { 
     b.set(false); 
    } 
    } 
} 
+1

작동하지만 다소 과도한 (불필요한) 것으로 보입니다! – assylias

2

, 외부 클래스 내부

public class Outter{ 
    private boolean b; 

    public Outter(){ 
     b = false; 
     new Inner(b); 
    } 
    public class Inner{ 
     public Inner(boolean b){ 
      b = true; 
     } 
    } 
    public static void main(String[] args) { 
     System.out.println(new Outter().b); 
    } 
} 

자바를 넣어 변수 (모두 프리미티브 및 참조를 전달) , 참조로 전달하지 않음, 내부 클래스의 변수 b은 코드를 수정하는 코드에 seperate new variable입니다. 외부 클래스가 아니라 내부 클래스에서 선언 된 b의 당신이 outer classb의 값을 수정하려면, 같은 것을 할 :

public class Outter{ 
    private boolean b; 

    public Outter(){ 
     b = false; 
     new Inner(); 
    } 
    public class Inner{ 
     public Inner(){ 
      b = true; 
     } 
    } 
    public static void main(String[] args) { 
     System.out.println(new Outter().b); 
    } 
} 
+0

사실 내 의도는 Inner 클래스가 Outer 외부에 있다는 것이 었습니다. 왜냐하면 저는 비슷한 Inner 클래스를 가지고 있었고 Outer에 붙어있는 모든 클래스는 거대한 클래스가 될 것이기 때문입니다. – user1897262

+1

** 사실 내 의도는 Inner 클래스가 Outer 외부에 있었던 것입니다. ** 그러면 내부 클래스가 아니며, 외부 클래스 외부에 선언하면 별도의 외부 클래스가됩니다. – PermGenError

+0

그러면 컴파일러가 다음과 같은 내용을 말하는 이유는 무엇입니까? 로컬 변수 b는 내부 클래스에서 액세스됩니다. 최종 선언해야합니까? – user1897262

0

귀하의 코드는 또한 그것은 아마도 당신을 위해 무엇을 찾고있는 것은 interface 것 같습니다 바로 편집 후

+0

귀하의 진술은 쉽게 많은 사람들이 잘못 해석 할 수 있습니다. –

+0

@VikramSingh 어떻게 그렇게? – PermGenError

0

Java doesn't pass variables by reference; it passes them by value. 때문에 . 이 패턴이 당신이 원하는 것을 의미 할 수 있습니까?

public interface Viewable { 
    public void setViewed (boolean viewed); 
    public boolean isViewed(); 
} 

class Outer implements Viewable { 
    private boolean viewed = false; 

    @Override 
    public boolean isViewed() { 
    return viewed; 
    } 

    @Override 
    public void setViewed(boolean viewed) { 
    this.viewed = viewed; 
    } 

} 

class Inner { 
    public Inner (Viewable view) { 
    view.setViewed(true); 
    } 
} 

Inner inner = new Inner(new Outer()); 

나는 원래 질문을 연결하는 클래스 이름으로 OuterInner을 선택했습니다. 훨씬 더 나은 이름을 찾을 수 있습니다.

+0

도움을 주셔서 감사합니다. 가능한 한 빨리 코드에 추가해 보겠습니다. – user1897262

관련 문제