Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么传递命令对象赢了';不行?_Java_Gwt - Fatal编程技术网

Java 为什么传递命令对象赢了';不行?

Java 为什么传递命令对象赢了';不行?,java,gwt,Java,Gwt,我想知道为什么将命令对象向下传递到父-子类的两级将不起作用 这样(A类是B的父类,B是C的父类): 然而,当命令对象的实例在类B中创建并传递给类C时,它可以正常工作 例如: 编辑: 示例(手写代码): 命令对象的访问修饰符是公共的吗?问题是,在传递过程中,类A的命令对象被分配给类B的本地命令对象,而类B的本地命令对象被发送到类C。从示例代码中可以看出,当您调用C.setCommand()时(在B的构造函数中)this.command尚未使用从A传递的命令实例进行更新: b = new B();

我想知道为什么将
命令
对象向下传递到父-子类的两级将不起作用


这样(A类是B的父类,B是C的父类):

然而,当命令对象的实例在类B中创建并传递给类C时,它可以正常工作

例如:

编辑:

示例(手写代码):


命令对象的访问修饰符是公共的吗?

问题是,在传递过程中,类A的命令对象被分配给类B的本地命令对象,而类B的本地命令对象被发送到类C。

从示例代码中可以看出,当您调用C.setCommand()时(在B的构造函数中)this.command尚未使用从A传递的命令实例进行更新:

b = new B();
// here, c.setCommand() has already been called with b.command, which hasn't been initialized, so is 'null'
b.setCommand(command); // sets b.command, but doesn't change c.command's value, which is then still 'null'

使用调试器单步执行代码可能会在几秒钟内发现错误的来源。这是Java 101。

ooo…您需要进一步了解对象实例化的顺序

  • 您实例化了B对象
  • 然后在C对象的实例化中,将B对象的命令分配给C对象
  • 此时命令为空
  • 然后,只有您为B对象分配了一个命令,这太晚了,因为您应该将该命令传递给B的构造函数
A类:

public class A {
   private B b;
   public A() {
     b = new B(
       new Command() {
         public void execute() {
           Window.alert("Gotcha");
         }
       }
     );
   }
B类:

public class B {
   private C c;

   public B(Command cmd) {
     c = new C();
     c.setCommand(cmd);
     c.doStuff();
   }
}
C类:

public class C {
  private Command command;
  public C() {
  }

  public void doStuff() {
    command.execute();
  }

  public void setCommand(Command command){
    this.command = command; 
  }        
}
或者,为什么不是这样

public class B {
   private C c;

   public B(Command cmd) {
     c = new C(cmd).doStuff(1000);
   }
}

public class C {
  private Command command;
  public C(Command cmd) {
    this.command = cmd; 
  }

  public C doStuff(int i) {
    if (--i>0){
      new C(cmd).doStuff(i);
    }    
    command.execute();
    return this;
  }
}

现在还不清楚你的图表是什么意思-显示代码会让它更清晰,最好是在一个简短但完整的例子中,尽可能实际。类a是B的父类,B是C的父类。你能澄清什么是“不起作用”的意思吗?当你执行它时会发生什么?注意这里没有涉及继承,这与这里是“父子关系”。这说明了什么没有发生,但是发生了什么?为什么你现在删除了比现有文本更好地解释问题的代码?不,我没有删除它,我只是编辑它以更好地反映问题代码。换句话说,对象类似于“缓冲”"在中间,它现在工作,因为我做的只是确保B类只在没有修改的情况下把对象传递给C。但是,我在这里发布的代码与java到JavaScript编译器一起使用,所以调试不是那么容易。在GWT中调试与任何其他环境一样容易,至少当bug在java代码中运行时:运行哟。在DevMode中运行您的代码,这样Java代码就可以运行(无需翻译为JS),并使用任何Java调试器逐步调试…→ Web应用程序。
public class C {
  private Command command;
  public C() {
  }

  public void doStuff() {
    command.execute();
  }

  public void setCommand(Command command){
    this.command = command; 
  }        
}
public class B {
   private C c;

   public B(Command cmd) {
     c = new C(cmd).doStuff(1000);
   }
}

public class C {
  private Command command;
  public C(Command cmd) {
    this.command = cmd; 
  }

  public C doStuff(int i) {
    if (--i>0){
      new C(cmd).doStuff(i);
    }    
    command.execute();
    return this;
  }
}