当前位置: 技术问答>java相关
100分,请大家详细给我讲讲“接口”和“抽象类”以及实例化的问题。我想很多人也不太明白。
来源: 互联网 发布时间:2015-06-09
本文导语: 我用了快一年java 了,还不太理解接口和抽象类。 为什么有的接口可以实例化呢?而且拿来就用,也没有在自己的类里实现接口 中定义的方法。 比如ResultSet这个接口 ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2"...
我用了快一年java 了,还不太理解接口和抽象类。
为什么有的接口可以实例化呢?而且拿来就用,也没有在自己的类里实现接口
中定义的方法。
比如ResultSet这个接口
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
其中executeQuery方法并没有自己实现,而且接口也没有实例化?
大家都讲讲吧,讲明白了另有分相送。
为什么有的接口可以实例化呢?而且拿来就用,也没有在自己的类里实现接口
中定义的方法。
比如ResultSet这个接口
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
其中executeQuery方法并没有自己实现,而且接口也没有实例化?
大家都讲讲吧,讲明白了另有分相送。
|
在你的例子中应该是executeQuery(String)中实例化了一个实现了ResultSet接口的类,并将该实例返回。
还有,Statement也是一个接口,因此,stmt也是被一个实现了该接口的类的实例初始化的。
这样设计的原因是,JDBC只是规定了一个调用接口规范,不同的数据库对JDBC有完全不同的实现,因此,JDBC只定义了一些接口规定需要实现的方法,而具体的方法实现是由个厂家发布的JDBC驱动程序,通过实现这些接口来完成的。
还有,Statement也是一个接口,因此,stmt也是被一个实现了该接口的类的实例初始化的。
这样设计的原因是,JDBC只是规定了一个调用接口规范,不同的数据库对JDBC有完全不同的实现,因此,JDBC只定义了一些接口规定需要实现的方法,而具体的方法实现是由个厂家发布的JDBC驱动程序,通过实现这些接口来完成的。
|
抽象类没有对象,也就是说不能直接用NEW实例话并且你不能定义抽象的构造函数或抽象静态方法所有子类必须执行父的所有抽象方法如果不能实现完整子类也必须是抽象的。
接口的引用楼上的也已经说明白了
接口的引用楼上的也已经说明白了
|
这是面向对象编程的一个重要特点,只要class实现了某个interface,那么所有这个interface的reference都能被实例化为这些class的对象,但只能调用interface中定义的方法!!好像应该是这样
|
如果你是系统分析员,你只需要告诉你的程序员,他的程序中必须实现什么功能,比如:public void run(),那么你就可以在你的抽象类中把该方法申明好,public abstract void run(),让他继承你的类;至于你的程序员如何实现就是他的事情了.就像鸟可以fly(),飞机也可以fly(),怎么实现那是它们的事情,我只需要让(告诉)它们fly就可以了.
抽象类的意思就是说,它不能被实例化,因为它根本就没有实现该方法,只能被继承,至于如何实现那是subclass的事情了.
抽象类的意思就是说,它不能被实例化,因为它根本就没有实现该方法,只能被继承,至于如何实现那是subclass的事情了.
|
接口和抽象类是不可以实例化的,就是说你不能这样:
ResultSet rs = new ResultSet();
但是,可以声明一个接口的饮用,并用实现了该接口的类的实例来将它初始化,比如:
public class MyResult implements ResultSet{
}
ResultSet rs = new MyResult();
在这点上,实现一个接口大致相当于一个继承关系。而这种初始化相当于一种
“上溯造型”
ResultSet rs = new ResultSet();
但是,可以声明一个接口的饮用,并用实现了该接口的类的实例来将它初始化,比如:
public class MyResult implements ResultSet{
}
ResultSet rs = new MyResult();
在这点上,实现一个接口大致相当于一个继承关系。而这种初始化相当于一种
“上溯造型”
|
接口定义了许多方法但是没有执行它们,它是简单的未执行的系列以及一些抽象的方法,它与抽象类的区别是接口不能执行任何方法,而抽象类可以
|
你可以用
System.out.println(stmt.getClass());
看看你的stmt到底是属于什么类,在那个类里面,你可以找到executeQuery的实现
System.out.println(stmt.getClass());
看看你的stmt到底是属于什么类,在那个类里面,你可以找到executeQuery的实现
|
接口:
从字面意义上来说,接口就是同对象进行通信(也就是访问它的功能和它的信息)使得不同方法。比如说:
我是一个Person(人)对象,你可以通过我的默认接口,使用我的Talk(说)和Listen(听)方法同我进行简单的面对面的对话。还有其他许多方法可以和我进行交流,因为我还支持其他的接口。你可以调用电话接口上的Call(呼叫)方法打电话给我,或者,你可以调用传真接口上的Transmit(传输)方法传输一份文件给我,你也可以调用电子邮件接口上的Send(发送)方法向我发送电子邮件。
从字面意义上来说,接口就是同对象进行通信(也就是访问它的功能和它的信息)使得不同方法。比如说:
我是一个Person(人)对象,你可以通过我的默认接口,使用我的Talk(说)和Listen(听)方法同我进行简单的面对面的对话。还有其他许多方法可以和我进行交流,因为我还支持其他的接口。你可以调用电话接口上的Call(呼叫)方法打电话给我,或者,你可以调用传真接口上的Transmit(传输)方法传输一份文件给我,你也可以调用电子邮件接口上的Send(发送)方法向我发送电子邮件。
|
抽象:
抽象是一项技术,我们都是用它来管理每天收集的复杂信息。它是我们可以认出事物的相似之处并忽略它们的不同点,考虑共性而非个性,并看到事物是什么而不考虑是什么是它们这样。你可以在任何指定时间为任何特定目标提取对象的重要特征,而忽视所有其他方面。
如何根据抽象的目标和你的观点来开发一个抽象呢?例如,在一个温暖的夏天的一天,我看着一棵树并把它抽象为一个阴影供应者。我的小侄子把它抽象为一个可以爬的地方。一棵树便具有了两种不同的抽象了。
抽象用于识别某个应用程序所包含的对象。在开发工资单系统的过程中,将考虑tiger,并把他抽象为一个雇员,仅考虑他的工资和他怎么样得到支付。当研究公司足球队应用程序时,把tiger抽象为一名球员而更关心他的位置和击中率。这样,一个对象便有两种完全不同的抽象了。
抽象是一项技术,我们都是用它来管理每天收集的复杂信息。它是我们可以认出事物的相似之处并忽略它们的不同点,考虑共性而非个性,并看到事物是什么而不考虑是什么是它们这样。你可以在任何指定时间为任何特定目标提取对象的重要特征,而忽视所有其他方面。
如何根据抽象的目标和你的观点来开发一个抽象呢?例如,在一个温暖的夏天的一天,我看着一棵树并把它抽象为一个阴影供应者。我的小侄子把它抽象为一个可以爬的地方。一棵树便具有了两种不同的抽象了。
抽象用于识别某个应用程序所包含的对象。在开发工资单系统的过程中,将考虑tiger,并把他抽象为一个雇员,仅考虑他的工资和他怎么样得到支付。当研究公司足球队应用程序时,把tiger抽象为一名球员而更关心他的位置和击中率。这样,一个对象便有两种完全不同的抽象了。
|
实例化:
类本身没有属性值,也不执行类的行为。类定义的属性并包含行为的视线,都将有类创建的每个对象使用。类的一个实例就是属于一个类的某个对象。
类本身没有属性值,也不执行类的行为。类定义的属性并包含行为的视线,都将有类创建的每个对象使用。类的一个实例就是属于一个类的某个对象。
|
建议你看Java编程思想那本书,反复看上NNNNNNNNNN遍,然后过上一段时间,再反复看上N 遍.反复这个过程。
抽象类和接口肯定是不能实例化的,有了抽象类为什么还有接口?不知道你想过没有?
因为Java没有多重继承,所以接口比抽象类更有意义。接口更多的运用在了设计模式上,主要是为了组件复用,单纯的应用接口或者抽象类,都是没有意义的。
抽象类和接口肯定是不能实例化的,有了抽象类为什么还有接口?不知道你想过没有?
因为Java没有多重继承,所以接口比抽象类更有意义。接口更多的运用在了设计模式上,主要是为了组件复用,单纯的应用接口或者抽象类,都是没有意义的。
|
实在是看不过去了, polarislee(北极星) 的帖子简直是分析的相当透彻了,就从你的这个问题“比如ResultSet这个接口
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
其中executeQuery方法并没有自己实现,而且接口也没有实例化?”
上看出你在学在用的是JDBC,polarislee(北极星)完全给你分析了啊!说得这么好你还不给他分,真是过分。
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
其中executeQuery方法并没有自己实现,而且接口也没有实例化?”
上看出你在学在用的是JDBC,polarislee(北极星)完全给你分析了啊!说得这么好你还不给他分,真是过分。
|
确实,这两天拿了thinking in java 又看了一遍,感觉又了解不少东西
|
up
|
这是你说的疑问!
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
其实,接口可以声明,但在实现的时候,必须是将它的功能实现了的可以具体的类,或是一个方法的返回值是它的子类!
也就是说,你的这条语句可以这样理解:
ResultSet是一个接口,stmt是一个对象(或是含有静态方法executQuery的类名),()中的是传的参数!重要的是:stmt的返回值是ResultSet的子类!这个子类,是可以实例话的!这样说,你明白了吧?
如果说错了,请高手指出!
ResultSet rs = stmt.executeQuery("SELECT a, b FROM TABLE2");
其实,接口可以声明,但在实现的时候,必须是将它的功能实现了的可以具体的类,或是一个方法的返回值是它的子类!
也就是说,你的这条语句可以这样理解:
ResultSet是一个接口,stmt是一个对象(或是含有静态方法executQuery的类名),()中的是传的参数!重要的是:stmt的返回值是ResultSet的子类!这个子类,是可以实例话的!这样说,你明白了吧?
如果说错了,请高手指出!
|
abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于abstract class和interface的选择显得比较随意。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。本文将对它们之间的区别进行一番剖析,试图给开发者提供一个在二者之间进行选择的依据。
在这里详细的讲了interface & abstract class 的差别。
http://www-900.ibm.com/developerWorks/cn/java/l-javainterface-abstract/index.shtml
在这里详细的讲了interface & abstract class 的差别。
http://www-900.ibm.com/developerWorks/cn/java/l-javainterface-abstract/index.shtml