最开始看到数据库连接的时候忽然想到这个问题:
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这个实例实际上还是指向实现类的实例。不过这个实例只能调用接口有的方法。