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

phi*_*ill 8 java jtds

下面的代码在变量上生成一个错误,上面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 
Run Code Online (Sandbox Code Playgroud)

jac*_*ckr 13

您可能希望在con2的声明中添加"static".

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

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


wax*_*ing 10

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

private static java.sql.Connection con2 = null;
Run Code Online (Sandbox Code Playgroud)

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

 public static void main (String[] args) { 
     new testconnect().run();
 } 

 public void run() {
     con2 = java.sql.DriverManager.getConnection(getConnectionUrl2());
 }
Run Code Online (Sandbox Code Playgroud)


Kha*_*oth 6

Java有两种变量

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

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

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

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

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

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

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


Cli*_*ler 5

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

1)使con2和getConnectionUrl2()静态.

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

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

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

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