java:非静态变量无法从静态上下文引用Error

以下代码在变量con2上生成错误,说"non-static variable con2 cannot be referenced from a static context Error." 我用Google搜索了一个解决方案,他们建议该变量尚未初始化,以使这些方法可用。 我是否错误地初始化了这个? 我也尝试过把事情公之于众,但这也无济于事。

 import java.io.*; import java.net.*; import java.sql.*; import java.sql.CallableStatement; import java.sql.ResultSet; import java.sql.PreparedStatement; import net.sourceforge.jtds.jdbcx.JtdsDataSource; import net.sourceforge.jtds.jdbc.Driver; class testconnect { private java.sql.Connection con2 = null; private final String url2 = "jdbc:jtds:sqlserver://"; private final String serverName= "SQL01"; private final String portNumber = "2677"; private final String databaseName= "App"; private final String userName = "bob"; private final String password = "boob"; private final String selectMethod = "cursor"; private String getConnectionUrl2(){ System.out.println("initalizing jtds"); //String returnVal = url+serverName+":"+portNumber+";databaseName="+databaseName+";user="+userName+";password="+password+";instance="+instance+";"; String returnVal = url2+serverName+":"+portNumber+"/"+databaseName+";user="+userName+";password="+password; System.out.println("url2: " + returnVal); return returnVal; } public static void main (String[] args) { con2 = java.sql.DriverManager.getConnection(getConnectionUrl2()); } } //end class 

不,实际上,您必须将con2字段声明为static:

 private static java.sql.Connection con2 = null; 

编辑:更正,这实际上是不够的,你会得到同样的问题,因为你的getConnection2Url方法也不是静态的。 更好的解决方案可能是进行以下更改:

  public static void main (String[] args) { new testconnect().run(); } public void run() { con2 = java.sql.DriverManager.getConnection(getConnectionUrl2()); } 

您可能希望在con2的声明中添加“static”。

在Java中,事物(包括变量和方法)可以是类的属性(这意味着它们由该类型的所有对象共享),或者它们可以是对象的属性(同一类的每个对象中的不同) )。 关键字“static”用于表示某些东西是该类的属性。

“静态”的东西一直存在。 其他东西只有在你创建了一个对象之后才存在,即便这样,每个单独的对象都有自己的东西副本。 在这种情况下,这方面的关键是关键:静态东西不能访问非静态的东西,因为它不知道要查找哪个对象。如果你传递一个对象引用,它可以做类似“thingie”之类的东西.con2“,但只是简单地说”con2“是不允许的,因为你没有说过哪个对象是con2。

Java有两种变量

一个)
class级(静态):
它们是每个Class一个。你有学生类和定义的名称作为静态变量。现在无论你创建多少学生对象都将具有相同的名称。

对象级别:
它们属于每个Object.If名称是非静态的,那么所有学生都可以有不同的名称。

b)
class级:
此变量在Class load上初始化。即使没有创建学生对象,您仍然可以访问和使用静态名称变量。

对象级别:当你创建一个新对象时,它们会被初始化,比如new();

C)
您的问题:您的类刚刚加载到JVM中,并且您已调用其主(静态)方法:法律允许。

现在你要调用一个Object varibale:对象在哪里?

您必须创建一个Object,然后才能访问Object level varibales。

你的main()方法是静态的,但它引用了两个非静态成员:con2和getConnectionUrl2()。 你需要做三件事之一:

1)使con2和getConnectionUrl2()静态。

2)在main()内部,创建类testconnect的实例并访问con2和getConnectionUrl2()。

3)分出另一个类来保存con2和getConnectionUrl2(),以便testconnect只有main。 它仍然需要实例化不同的类并调用该方法。

选项#3是最佳选择。 #1是最糟糕的。

但是,您无法从静态方法中访问非静态成员。

最简单的改变是这样的:

 public static void main (String[] args) throws Exception { testconnect obj = new testconnect(); obj.con2 = DriverManager.getConnection(obj.getConnectionUrl2()); obj.con2.close(); } 

这是一个有趣的问题,我只是想通过添加更多信息来给出另一个角度。如果您看到静态方法如何操作,您可以理解为什么会抛出exception。 这些方法可以操作静态数据,本地数据或作为参数发送给它的数据。为什么? 因为任何对象都可以从任何地方访问静态方法。 因此,如果可以使用实例变量,可能会出现安全问题,或者可能存在信息泄漏。因此,编译器必须抛出这样的情况。