从java中的内部类访问变量

时间:2012-12-12 09:33:53

标签: java inner-classes extern

我需要修改内部类的变量。编译器说我需要声明变量static,但后来我无法修改它。代码是这样的:

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类作为参数传递,但我仍然遇到同样的问题。

编辑: 那么代码更像是:

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
                }

        }  
    );
    }
 }

问题是如何修改View2类中的变量“View”。

对于糟糕的制表表示抱歉,我快速完成了,并且需要了解代码翻译。

5 个答案:

答案 0 :(得分:6)

语法如下,您使用 Outter.this

获取对外部类的引用
public class Outter{
   private boolean b;

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

编辑:我认为您只是通过传递引用来修改b。在java中,这是不可能的。变量通过引用变量的副本作为参数传递(引用变量类似于指针),或者在基元的情况下,通过复制传递。

答案 1 :(得分: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);
    }
  }
}

答案 2 :(得分:2)

首先,你的Inner类在Outer类之外,把它放在外部类

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);
   }
}

java通过传递变量(包括基元和引用),不通过引用传递,内部类中的变量b是{{1}在您的代码中,您正在修改在内部类中声明的seperate new variable的值而不是外部类。如果您想修改b b的值,请执行以下操作:

outer class

答案 3 :(得分:0)

您的代码也正确,因为Java doesn't pass variables by reference; it passes them by value.

答案 4 :(得分:0)

在您编辑之后,似乎您正在寻找的是interface。这种模式可能是你想要的吗?

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作为类名来连接您的原始问题。你会找到更好的名字。