java: variável não estática não pode ser referenciada a partir de um contexto estático

O código a seguir está gerando um erro na variável con2 dizendo que "non-static variable con2 cannot be referenced from a static context Error." Eu pesquisei por uma solução e eles estão sugerindo que a variável ainda não foi iniciada para disponibilizar os methods. Estou inicializando isso incorretamente? Eu também tentei mudar as coisas para o público, mas isso também não ajudou.

 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 

    Não, na verdade, você deve declarar seu campo con2 estático:

     private static java.sql.Connection con2 = null; 

    Editar: Correção, que não será suficiente, você receberá o mesmo problema porque o método getConnection2Url também não é estático. Uma solução melhor pode ser fazer a seguinte alteração:

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

    Você provavelmente deseja adicionar “static” à declaração de con2.

    Em Java, as coisas (variables ​​e methods) podem ser propriedades da class (o que significa que são compartilhadas por todos os objects desse tipo) ou podem ser propriedades do object (uma diferente em cada object da mesma class). ). A palavra-chave “static” é usada para indicar que algo é uma propriedade da class.

    Coisas “estáticas” existem o tempo todo. As outras coisas só existem depois que você criou um object, e mesmo assim cada object individual tem sua própria cópia da coisa. E o outro lado disso é a chave neste caso: coisas estáticas não podem acessar coisas não-estáticas, porque elas não sabem em qual object procurar. Se você passar uma referência a objects, ela pode fazer coisas como “coisas” .con2 “, mas simplesmente dizendo” con2 “não é permitido, porque você não disse qual é o significado do con2 do object.

    Java tem dois tipos de variables

    a)
    Nível de Classe (Estático):
    Eles são um por Class.Say você tem class de aluno e nome definido como variável estática.Now não importa quantos object de estudante você criar todos terão o mesmo nome.

    Nível de Objeto:
    Eles pertencem a por object.Se o nome é não-estático, então todo aluno pode ter um nome diferente.

    b)
    Nível de Classe:
    Essas variables ​​são inicializadas no carregamento da class. Assim, mesmo que nenhum object de aluno seja criado, você ainda poderá acessar e usar a variável de nome estático.

    Object Level: Eles serão inicializados quando você criar um novo object, digamos por new ();

    C)
    Seu problema: Sua class acabou de ser carregada na JVM e você chamou seu método principal (estático): permitido legalmente.

    Agora a partir disso você quer chamar um object varibale: Onde está o object ??

    Você tem que criar um object e, em seguida, apenas você pode acessar varibales de nível de object.

    Seu método main () é estático, mas está referenciando dois membros não estáticos: con2 e getConnectionUrl2 (). Você precisa fazer uma das três coisas:

    1) Torne con2 e getConnectionUrl2 () estático.

    2) Dentro de main (), crie uma instância de class testconnect e acesse con2 e getConnectionUrl2 () fora disso.

    3) Quebre uma class diferente para conter con2 e getConnectionUrl2 () para que o testconnect tenha apenas main nele. Ainda será necessário instanciar a class diferente e chamar os methods disso.

    Opção # 3 é a melhor opção. # 1 é o pior.

    Mas, você não pode acessar membros não estáticos de dentro de um método estático.

    A mudança mais simples seria algo assim:

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

    Esta é uma questão interessante, eu só quero dar outro ângulo, adicionando um pouco mais de informação. Você pode entender por que uma exceção é lançada se você ver como os methods estáticos operam. Esses methods podem manipular dados estáticos, dados locais ou dados que são enviados a ele como um parâmetro. Por que? porque o método estático pode ser acessado por qualquer object, de qualquer lugar. Portanto, pode haver problemas de segurança ou pode haver vazamentos de informações se puder usar variables ​​de instância. Portanto, o compilador precisa lançar um desses casos fora de consideração.