【问题标题】:java non-static variable in static context静态上下文中的java非静态变量
【发布时间】:2012-04-25 08:24:16
【问题描述】:

我有以下代码:

public class My_program {

    class dbConnect {
       public dbConnect();
       public void connect_to_db(String connect_string) {
          Class.forName(...);
          ...
       }
    }

    public static void main(String[] args) {
       String connect_string = "jdbc...";
       dbConnect db = new dbConnect();
       db.connect_to_db(connect_string)
    }
}

当我尝试编译它时,出现以下错误:

error: non-static variable this cannot be referenced from a static context

所以我尝试使dbConnect 像这样静态:static class dbConnect,它工作正常,但 java 正在生成一个额外的 .class 文件:My_program$dbConnect.class我不想要

那么我怎样才能拥有一个 .class 文件并让代码正常工作。

【问题讨论】:

标签: java


【解决方案1】:

一种方式,取决于您的要求:

public class My_program {

My_program() { }


public void connect_to_db(String connect_string) {
      Class.forName(...);
      ......
   }

public static void main(String[] args) {
   String connect_string = "jdbc......";
   My_program db = new My_program();
   db.connect_to_db(connect_string)
}

}

【讨论】:

  • 是的......我刚刚做了这个......似乎只有一个文件的唯一方法......谢谢
【解决方案2】:
My_program$dbConnect.class 

这是内部类的类文件。 如果你在编译后创建一个内部类,你会得到一个类文件

outerclass$innerclass.class

【讨论】:

  • 好的,我明白了……但我仍然想要一个文件。
  • @pufos,然后只使用一个类。 java 编译器为每个classinterface 创建一个.class 文件,而不是每个源文件。
  • 不,如果你有内部类,你就不能得到一个文件。然后最好像迈克建议的那样使用一门课。 :)
【解决方案3】:

你不能,会生成额外的 .class 文件。在java中,每个类在编译成字节码时都会生成一个.class文件。因此您的 dbConnect 类将生成一个 .class 文件。

注意:第一次编译失败就是为什么它没有生成 Parent$dbconnect.class 文件

如果您只需要 1 个 .class 文件,则删除内部类并将逻辑放入您的 Parent 类中。

【讨论】:

    【解决方案4】:

    你不可能从两个类中得到一个类文件。这就是 Java 的工作原理。

    你需要将这两个类的内容合并为一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-25
      • 1970-01-01
      • 2018-01-04
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多