Dúvida sobre Connection

Galera, tenho a seguinte dúvida no simples código abaixo, o qual eu entendo como funciona, mais quando olhei a API fiquei confuso:

import java.sql.*;

public class Conectar{
public Conectar(){
try{
Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”);

            Connection con = DriverManager.getConnection("jdbc:odbc:DataBase","","");
             
        }
        catch(ClassNotFoundException cnf){
             System.out.println("Classe não encontrada");
        }
 }

}

Pronto, agora minha dúvida é: Andei olhando a API do pacote java.sql, e vi que Connection é uma interface. No meu modesto conhecimento, eu achava que as interfaces eram feitas para serem implementadas pelas classes. Mas no código acima que abre uma conexão com o BD, eu estou declarando a variável con, que é de referência do tipo da interface Connection, e atribuo a ela uma conexão.

Agora vem realmente a dúvida: Seria correto eu dizer que a variável con
faz referência a um objeto de conexão, que implementa a interface Connection ? E se qualquer objeto que implemente a interface Connection do pacote java.sql poderia ser atribuida a variavel de referencia con ?

Galera, não consegui nem durmir essa noite por causa disso…me ajudem.
Aguardo retorno…

A ideia da interface é justamente você poder “tipificar” uma variavel com ela, e receber qualquer objeto, de qualquer classe que a implemente, no caso da interface java.sql.Connection a classe que implementa ela, é uma classe do driver…

Veja por exemplo a declaração da classe do driver do MySQL:

[code]package com.mysql.jdbc;

public class Connection extends ConnectionProperties implements
java.sql.Connection {[/code]

Se você criar sua propria classe que implemente java.sql.Connection, você pode atribuir sem problemas…

ex.:

[code]public class Conexao implements java.sql.Connection{
//implementação dos metodos
}

Connection con = new Conexao();[/code]

logico que isso não é feito porque já existem os drivers prontos…

Obrigado de novo, Jairelton
então, agora ja to sabendo, que posso declarar um variavel do tipo de um interface, e atribuir a ela qualquer classe que implemente aquela interface especificada. Eu achava que poderia atribuir as variaveis apenas objetos de tipos de classes e subclasses. Mas agora sei que posso definir uma variavel de um tipo de interface, e atribuir qualquer objeto que a implemente…sem querer ser repetitivo.

Valeu de novo pelo esclarecimento…

É isso aí!

outro exemplo é:

[code]List lista = new ArrayList();

Collection col1 = new ArrayList();
Collection col2 = new Vector();
Collection col3 = new TreeSet();[/code]

Collection e List são interfaces…

Qualquer coisa é só falar! :wink: