Java 如何将对象传递到实现中并传递出本地对象?

Java 如何将对象传递到实现中并传递出本地对象?,java,oop,swing,object,implements,Java,Oop,Swing,Object,Implements,如何将对象传递给工具,并将本地对象传递给外部的对象?我认为SwingUtilities.invokeLater对于Swing对象来说是必要的,对吗 Sensors sens = new Sensors(); SwingUtilities.invokeLater(new Runnable() { public void run() { GUI application = new GUI(sens); application.getJFrame().setVisibl

如何将对象传递给工具,并将本地对象传递给外部的对象?我认为SwingUtilities.invokeLater对于Swing对象来说是必要的,对吗

  Sensors sens = new Sensors();

  SwingUtilities.invokeLater(new Runnable() {
   public void run() {
    GUI application = new GUI(sens);
    application.getJFrame().setVisible(true);
   }
  });

  SMS sms = new SMS(application);
这是我试图解决的问题,但我得到一个没有GUI类型的封闭实例可访问。必须使用GUI类型的封闭实例(例如x.new A(),其中x是GUI实例)来限定分配。问题

// in main
Sensors sens = new Sensors();
GUI application = null;
SwingUtilities.invokeLater(new GUIthread(sens , application));
SMS sms = new SMS(application);


//a class inside GUI.java , but not inside GUI class
class GUIthread implements Runnable{
  Sensors s;
  GUI g;
  public GUIthread(Sensors s , GUI g){
   this.s = s;
   this.g = g;
  }

  @Override
  public void run() {
   // TODO Auto-generated method stub
   g = new GUI(s);
   g.getJFrame().setVisible(true);
  }
 }
试试看

final Sensors sens = new Sensors();

相反。

简单地说,声明引用final,它将被anon类代码看到。

当您试图在未指定(或暗示)封闭类实例的上下文中创建非静态内部类的实例时,会出现此问题

由此,我推断您已经将一个类声明为非静态内部类;e、 g.类似这样的情况:

public class Outer {
    ...
    public class Inner {
        public Inner() {
           ...
        }
        ...
    }
    ...
}
如果您现在尝试使用
new internal()
在其他代码中创建
internal
的实例,您将得到一个编译错误,就像您看到的那样

您可以执行以下两种操作之一来“修复”问题:

  • 如果将
    公共类内部{
    更改为
    公共静态类内部{
    ,则可以像当前一样使用
    新建内部()
    。但这意味着
    内部
    的代码无法访问封闭类的(最终)实例变量;即
    外部

  • 如果您不想将
    internal
    更改为静态类,则需要按如下方式实例化它:

    Outer outer = ...
    ...
    Inner inner = outer.new Inner();  // qualified creation
    
跟进


任何使用静态类调用swing的不利方面

只有我上面提到的那个

那么,所有的实例化都发生在外部构造函数中?对吗

不可以。上面“限定创建”示例中的代码可以出现在可访问
内部
类的任何位置。并且由于我们将其声明为
公共


如果在
Outer
的构造函数(或实例方法)中实例化
internal
,则只需使用
newinternal()
。封闭的
外部
实例与
实例相同

我同意Zach的观点,并怀疑GuitThread是一个内部类。如果是这样,您可以将其设置为独立类或静态内部类,但如果没有更多信息和实际错误,很难知道这是否是真正的解决方案sage.

GUIthread
一个本地内部类,还是单独的?已编辑,抱歉混淆!这不是问题所在。如果是,OP会在不同的点看到编译错误,抱怨在封闭类中使用了非最终引用。但最终方法无法更改,我有一个线程正在运行以更改值e在Sensors对象内。@wizztjh-请参阅我对@Alice Young答案的评论。这不是您当前的问题。请将链接传递给我,它不会显示询问者的姓名,因此配置文件…Sensor当然可以更改。这里的最后一个关键字只是表示此引用不能更改,稍后会指向其他内容。请尝试使用静态类调用swing?那么,所有实例化都发生在外部构造函数中?对吗?