4

我需要从内部类修改一个变量。编译器说我需要将变量声明为静态,但是我不能修改它。代码是这样的:

public class Outter{
   private boolean b;

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

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

有没有像 C 中的“外部”这样的东西?或任何解决方案,以便我可以修改 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”。

抱歉表格不好,我做得很快,需要代码翻译才能理解。

4

5 回答 5

6

语法如下,使用Outter.this获取对外部类的引用

public class Outter{
   private boolean b;

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

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

于 2012-12-12T09:38:15.047 回答
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);
    }
  }
}
于 2012-12-12T09:39:32.800 回答
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);
   }
}

java通过值传递变量(原语和引用)不是通过引用传递b,内部类中的变量是一个。seperate new variable在您的代码中,您正在修改b内部类而不是外部类中声明的值。如果要修改 of 的值bouter class请执行以下操作:

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);
   }
}
于 2012-12-12T09:41:06.163 回答
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作为类名来连接你的原始问题。你会发现更好的名字。

于 2012-12-12T10:54:10.847 回答
0

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

于 2012-12-12T09:45:42.757 回答