我需要修改内部类的变量。编译器说我需要声明变量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”。
对于糟糕的制表表示抱歉,我快速完成了,并且需要了解代码翻译。
答案 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());
我已选择Outer
和Inner
作为类名来连接您的原始问题。你会找到更好的名字。