看到你关于getConnection方法的回复(http://zhidao.baidu.com/question/200985767.html)
看到你的解答,有了很大的收获,但是我有一点疑问,在JDK1.6文档中,对这个方法的声明是:publicstaticConnectiongetConnection(Stri...
看到你的解答,有了很大的收获,但是我有一点疑问,在JDK1.6文档中,对这个方法的声明是:
public static Connection getConnection(String url,String user,String password)throws SQLException
就是明确指出了这个方法的返回值是Connection 借口类型的。
但是我不明白,如果按照你说的,为什么它不使用某个具体的已经实现了Connection借口的类来作为这个方法的返回值?
另外,即使有可能是因为这个方法的返回值有很多种Connection借口的已实现类构成,那么,使用
stmt = conn.createStatement();
这个语句来更新数据库,我感到很惊讶,因为一开始conn被声明为Connection接口类型变量(没有实例化),那么作为一个接口类型的变量,按照“接口中的方法都是未被实现的”说法,这个语句岂不是调用了一个根本没有方法体的方法?
我自己想出的一种可能的解释是:在getConnection时返回了Connection的已实现类(虽然声明的返回值是接口类),在conn调用creatStatement()的时候,系统把conn看做的是这个已实现的类,而非接口类变量。这样说来,已实现的类,必然是覆写了接口的creatStatement方法的,所以这里在getConnection之后调用createStatement,是调用了覆写过的createStatement。
不知道是不是这样解释的? 展开
public static Connection getConnection(String url,String user,String password)throws SQLException
就是明确指出了这个方法的返回值是Connection 借口类型的。
但是我不明白,如果按照你说的,为什么它不使用某个具体的已经实现了Connection借口的类来作为这个方法的返回值?
另外,即使有可能是因为这个方法的返回值有很多种Connection借口的已实现类构成,那么,使用
stmt = conn.createStatement();
这个语句来更新数据库,我感到很惊讶,因为一开始conn被声明为Connection接口类型变量(没有实例化),那么作为一个接口类型的变量,按照“接口中的方法都是未被实现的”说法,这个语句岂不是调用了一个根本没有方法体的方法?
我自己想出的一种可能的解释是:在getConnection时返回了Connection的已实现类(虽然声明的返回值是接口类),在conn调用creatStatement()的时候,系统把conn看做的是这个已实现的类,而非接口类变量。这样说来,已实现的类,必然是覆写了接口的creatStatement方法的,所以这里在getConnection之后调用createStatement,是调用了覆写过的createStatement。
不知道是不是这样解释的? 展开
4个回答
展开全部
我想你没有理解java的面向对象特性。
你对类和对象(实例)之间的关系没有搞清楚。类是一个最基本的java数据结构的描述,它只告诉系统你需要什么样的数据结构和什么样的操作,这样的描述被虚拟机存放在一块固有的内存上面,其中包括数据成员的描述,以及方法(函数)在内存中的地址,而不涉及具体的成员值。而接口是一种被特殊化的类,它的描述和类一样也放在一块固有的内存,但是比类占有更小的内存。
对于继承,你可以想象,一个类或接口,它的描述中有一个父类,而这个父类对它来说就是一个存放这个父类描述的内存地址。
对象是一种具有具体值得一种数据结构,它包括类在内存中的索引和具体的值,而这些值可能是静态内存中的值,或者是一个内存地址(这个内存地址指向一个数组或者另外的对象所在的内存)。
conn.createStatement()之所以能返回一个有实体的stmt,是因为conn是一个对象,你在程序中对它的访问是访问的这个对象在内存中的结构,而你的声明并没有指定具体类,因为,这个对象可以找到他的类的描述,而这个类能找到他的父类(或者接口)的描述,而所谓的覆盖就是将父类描述中的方法“索引”修改成了新的一块方法(函数)的地址,你调用的是虽然表面上看起来是接口的方法,而实际上程序执行的是新方法地址的那块程序。
下面说为什么不用具体的实现类,而用接口操作。
这是软件工程中的高移植性,低耦合和高效开发所要求的,JDBC是一套规范,而这个规范的目的在于对于使用它编程的程序员来说,你所要做的工作是使用它而不是实现他,你只需要了解和遵守了它,就可以不需要关心其具体的实现就能完成数据库的操作,更重要的是不需要在代码中出现某一种数据库专用的代码,因为这样在更换数据库的时候,无需对你的代码作任何改动。
说的不是很好,望见谅。
你对类和对象(实例)之间的关系没有搞清楚。类是一个最基本的java数据结构的描述,它只告诉系统你需要什么样的数据结构和什么样的操作,这样的描述被虚拟机存放在一块固有的内存上面,其中包括数据成员的描述,以及方法(函数)在内存中的地址,而不涉及具体的成员值。而接口是一种被特殊化的类,它的描述和类一样也放在一块固有的内存,但是比类占有更小的内存。
对于继承,你可以想象,一个类或接口,它的描述中有一个父类,而这个父类对它来说就是一个存放这个父类描述的内存地址。
对象是一种具有具体值得一种数据结构,它包括类在内存中的索引和具体的值,而这些值可能是静态内存中的值,或者是一个内存地址(这个内存地址指向一个数组或者另外的对象所在的内存)。
conn.createStatement()之所以能返回一个有实体的stmt,是因为conn是一个对象,你在程序中对它的访问是访问的这个对象在内存中的结构,而你的声明并没有指定具体类,因为,这个对象可以找到他的类的描述,而这个类能找到他的父类(或者接口)的描述,而所谓的覆盖就是将父类描述中的方法“索引”修改成了新的一块方法(函数)的地址,你调用的是虽然表面上看起来是接口的方法,而实际上程序执行的是新方法地址的那块程序。
下面说为什么不用具体的实现类,而用接口操作。
这是软件工程中的高移植性,低耦合和高效开发所要求的,JDBC是一套规范,而这个规范的目的在于对于使用它编程的程序员来说,你所要做的工作是使用它而不是实现他,你只需要了解和遵守了它,就可以不需要关心其具体的实现就能完成数据库的操作,更重要的是不需要在代码中出现某一种数据库专用的代码,因为这样在更换数据库的时候,无需对你的代码作任何改动。
说的不是很好,望见谅。
来自:求助得到的回答
展开全部
我想弱弱的问问,面向对象中的多态是什么意思?你知道不?
好好的去多看看多态。你能说出面向对象的三大特征?? 封装,继承,多态?还是继承,封装,多态?还是多态,继承,封装?还是别的什么?
这句话是答案:子类对象可以赋值给父类,但是父类不能赋值给子类。
好好的去多看看多态。你能说出面向对象的三大特征?? 封装,继承,多态?还是继承,封装,多态?还是多态,继承,封装?还是别的什么?
这句话是答案:子类对象可以赋值给父类,但是父类不能赋值给子类。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
getConnection()返回的是一个Connection实现类的对象只不过,用Connection的引用指向了这个实现类的对象。
这就叫,父类引用指向子类对象.
sun当前只定义了jdbc的接口,实现则是由具体的数据库厂商完成的。
这就叫,父类引用指向子类对象.
sun当前只定义了jdbc的接口,实现则是由具体的数据库厂商完成的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
返回的已经是实例了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询