最开始看到数据库连接的时候忽然想到这个问题:
Connection con=null; try { Class.forName(Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } try { con=DriverManager.getConnection(url, user, pass); } catch (SQLException e) { e.printStackTrace(); }
Connection是java中的一个接口,但是使用的时候是这样的:
Connection con=DriverManager.getConnection(url, user, pass);而且方法getConnection的返回类型是Connection类型。也是接口类型?
接口不是不能实例化吗?为什么能实例化,而且,接口里面的方法不是没有方法实现吗?为什么能够直接调用con.Close()等等的方法。
接口不能直接new,但是它可以作为别的类的变量。如果有类实现了这个接口,则可以new!
举一个简单的例子:java.lang.List是一个接口,但是List list=new ArrayList();是没有任何错误的,因为ArrayList实现了List接口。
这样来回答吧,为什么父类的引用能指向子类对象呢?
父类定义了子类中一定存在的方法和属性。
同理,接口的引用指向他的实例化对象也是因为实例化对象中必然要实现接口中定义的方法和属性。
对象的类型还是new出来的类型,或方法返回的类型,
(如DriverManager.getConnection(String a,String b,String c)静态方法返回Connection接口的实例化对象)。
也可以这样写:
Connection conn =new XXX ()
XXX为实现Connection接口的类。
只不过引用(变量名)如conn只能调用接口定义的方法(这也是接口的意义之一)。
DriverManager.getConnection 返回的是接口的一个实现,是实现类,这个类已经实现了Connection这个接口,
但是getConnection方法里面就已经转换了类型,转换成Connection类型。但是Con这个实例实际上还是指向实现类的实例。不过这个实例只能调用接口有的方法。
一位网友的回答挺好的:
小霸王游戏机应该玩过吧,接口(Connection)就像是插游戏卡的插槽,它事先弄好了各种方法(con.close),但是具体实现没有写进去。
这时候 类就像是游戏卡(你get到的对象)一样,它的方法和插口一样,但是它还写了这些方法是如何实现的。
于是我们把游戏卡(你get到的对象)插到游戏机的插槽(connection)上,就可以玩游戏啦。
游戏机可不知道游戏卡的具体实现是什么,但是它知道插槽有什么方法,直接调用插槽的方法(con.close)就行,
因为插槽上插着游戏卡,就会调用游戏卡的该方法。