站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题百思不得其解,请高手指教!

百思不得其解,请高手指教!

摘要: 百思不得其解,请高手指教!


java.sql.Connection conn = DriverManager.getConnection(......);
java.sql.Statment stmt = conn.createStatement(.........);

public static Connection getConnection(String url,
Properties info)
throws SQLException

Connection是个接口,为什么它可以调用方法???

接口不是不可以调用方法吗?

高手请多多指教阿!我郁闷了,怎么也想不出来为什么。。。。



哈哈..终于坐上板凳了.


恭喜你,板凳坐了,问题也要给解决下阿:)


接口可以调用方法,但是不能实例化


接口可以调用方法,但是不能实例化

——————————————

可是接口里面根本没有实现阿


接口里面的方法在后续实现的类里面有实现,虽然接口的代码是空,但是它的实现类的代码是存在的


接口不能直接实例化 可以通过new一个实现的类

或者返回接口的类型的方法来实例化

然后就可以调用接口里定义的方法了

自动会去找实现的类的方法


我以前也有过楼主一样的疑惑
java.sql.Connection conn = DriverManager.getConnection(......);
Statment stmt = conn.createStatement(.........);
Connection是接口,可DriverManager.getConnection(......)返回的是一个实现Connection接口的实例,conn指向的是对象已经实现乐接口(那些接口里的方法已经实现乐),所以conn可以调用乐



可是jdk文档里面getConnection返回的还是一个Connection啊,这就是我最迷惑的地方!


public static Connection getConnection(String url,
Properties info)
throws SQLException



看看源码就清楚了...
Connection是接口,虽然不能实例化,但是可以创建对象....
DriverManager.getConnection()返回的是Connection的对象,看清楚了..是对象哦..
现在让conn指向了DriverManager.getConnection()返回来的对象...

然后可以调用了吧..


不要被左值迷惑了。。。。


可是jdk文档里面getConnection返回的还是一个Connection啊,这就是我最迷惑的地方!


public static Connection getConnection(String url,
Properties info)
throws SQLException
---------------------------------------
举个例子:
interface Connection;
class ConnectionA implements Connection

//实现代码
};

在函数中
public static Connection getConnection(String url,
Properties info)
throws SQLException

return new ConnectionA;

函数返回的是一个实例类ConnectionA,在ConnectionA 中的方法是实现的方法,明白吗?






好像明白了。我看了源代码可是才疏学浅没看明白。那位大哥给我解释一下它里面返回的对象是什么类型的阿,我找不到呢!多谢了!!


//接口
public interface A{
public void print();
}
//实现类
public class B implements A{
public void print(){
System.out.println(-#34;aaaaaaaaaaa-#34;);
}
}
//测试类
public class Test{
public static void main(String args[]){
A a=new B();
a.print();
}
}
//结果是:aaaaaaaaaaa
//输出结果是调用了其实现类的print()方法



源代码,你自己慢慢看吧,。。。。。。。。。。。。。


我看了半天,也没看出来他到底返回了什么类型的对象。。。



谁告诉你接口不可以调用方法?


(讲通俗点)
Connection是接口,接口当然调用不了方法。
但是,
DriverManager.getConnection(-#34;-#34;,-#34;-#34;,-#34;-#34;);
此方法能返回一个对象,该对象是Connection类型的。
此时:Connection con = DriverManager.getConnection(-#34;-#34;,-#34;-#34;,-#34;-#34;);
con就代表了那个真实对象(该对象具备了Connection声明的全部方法),就能调用方法了。


jdk文档里的接口一般都写着

所有超级接口:

所有已知子接口:

所有已知实现类:

怎么Connection没有写呢?

那么返回的对象又怎么可以赋给Connection接口呢?

越来越迷惑了 。。。





java的封装是非常厉害的,这个的确是java的优势,但是也让人讨厌,代码一层套一层,往往看了一行代码,要找到10多个类才能知道他到底干了什么,看不明白,慢慢看,特别是现在成熟的代码,封装更厉害,但是用Connection作工作只要知道Connection能干什么就好了,如果你有java的类模式基础看起来会快些


DriverManager.getConnection(......)返回的是一个“实现Connection接口的”的类的对象

举个例子
class A implement Connection{

//类A中实现Connection定义的方法和类A自己的东西

}

getConnection()中返回A的对象话,
可以用做A类型
比如:A a=getConnection();
也可以用做Connection类型
比如:Connection b=getConnection();

但要注意:a和b中可以使用的变量和函数就不同了,要是ab的类型而定了



jdk文档里的接口一般都写着

所有超级接口:

所有已知子接口:

所有已知实现类:

怎么Connection没有写呢?

那么返回的对象又怎么可以赋给Connection接口呢?

越来越迷惑了 。。。

-------------------------------

Connection的实现是厂家规范,不是sun的sdk规范,明白?没有厂家的Connection的实现都不同
即mysql和oracle的Connection的实现是不同的,这个不在规范里面,但是Connection本身是规范的一部分,如何实现不是


在上面的例子中,我们只使用Connection的方法就可以了,并不要关心A的具体名字叫什么
换句话说:它叫A也可以,叫小猫小狗也可以啊,只是个名字罢了。
如果真想知道,就只好去看java的原代码了


public class Test {
public static void main(String[] args) {
Manager manager = new Manager();

Actable plane1 = new Plane(-#34;奋进号-#34;);
plane1.act();

Actable animal1 = new Animal(-#34;小花狗-#34;);
animal1.act();

}

}

interface Actable {
void act();
}

class Plane implements Actable {
String code;
public Plane(String code){
this.code=code;
}
public void act(){
System.out.println(this.code + -#34; is flying!-#34;);
}
}

class Animal implements Actable {
String name;
public Animal(String name){
this.name=name;
}
public void act(){
System.out.println(this.name + -#34; is running!-#34;);
}
}




也就是说Connection是各个厂商自己实现的,这样理解好像明白多了。

多谢 harshing(西边的太阳)

还有回帖的各位!


也就是说Connection是各个厂商自己实现的,这样理解好像明白多了。
---------------------------------
所以,我们要从不同的数据库的驱动商那里下载不同的jdbc的驱动包,那个jdbc的驱动包里就是Connection的实现,为了驱动不同的数据库,我们要下载不同的jdbc驱动包,就是这么回事。
至于厂家规范和sun的规范的区分,很多地方都可以见到,包括EJB、WEB的配置里面都有


基础不够扎实啊

插播一条广告,小店新开张,优惠出售各种手工艺品,欢迎大家选购,是各位帅哥送女朋友、老婆、情人(OR各位美女送男朋友、老公、情人)的不二选择
http://shop33881320.taobao.com/


这个是java的动态联编机制, 由jvm在程序运行时决定该去执行什么操作, 他执行的实际上是实现此接口的类的具体实现方法,所以在java的开发中应该养成“面向接口编程”的好习惯。


接口可以调用实现了它的子类的方法嘛


↑返回目录
前一篇: linux Red Hat SA4 中为何无法安装jdk-1_5,答对者得分!!!解决马上揭帖!!!!
后一篇: 关于解析ascii码生成的报文的中文问题,急!!!