JAVA中接口不可以实例化,为何可以向上转型呢?

Young_tree 2016-04-27 05:43:22

public class test {
public static void main(String[] args) {
PHONE phone = new PHONE();
USB usbphone = phone;
WIFI wifiphone = phone;
usbphone.read();
usbphone.write();
wifiphone.open();
wifiphone.close();
}
}


小弟正在学习接口相关内容,有个地方不是太理解
这段代码中USB和WIFI是两个接口,PHONE类实现了这两个接口,但是书上说接口不能实例化
在这里又用了向上转型,生成了USB和WIFI两个接口的对象,还用phone进行了赋值。
这是为什么呢?
...全文
506 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
小灰狼 2016-04-28
  • 打赏
  • 举报
回复
引用 6 楼 Young_tree 的回复:
[quote=引用 4 楼 疯雪的回复:] 哈哈,这就是多态,同一个对象被造型成不同的数据类型时,就有了不同的方法(实现)
那这段代码里 usb和wifi类到底有没有新建对象呢?[/quote] 没有直接创建USB和WIFI的对象,而是创建了它的实现类的对象 但是程序里,把实现接口的对象,再把它当作接口的对象 接口只是一个规范,只有定义功能,但没有进行实现。因此不可能直接创建接口的对象,否则你在调用接口方法时,程序不知道执行什么运作。 USB usb = new Phone(); 其实就是让你把一部手机当作一个USB设备,忽略它的详细类型。
天皇101 2016-04-28
  • 打赏
  • 举报
回复
楼上讲的太好了
小灰狼 2016-04-28
  • 打赏
  • 举报
回复 14
从编译的角度看: 接口不能实例化,这是因为接口中只定义了方法原型,并没有实际实现。如果可以直接实例化,那么在调用接口的方法时,JAVA虚拟机不知道如何做,因为没有代码可以被执行。 以上是根本原因 而如果一个类实现了某个接口,那么这个接口的方法就被这个类全部实现了。这时调用接口的方法就成为可能。 例如,Phone 类实现了USB接口,那么虽然USB接口只定义了方法,没有实现,但 Phone 实现了所有的USB接口中的方法,因此,把 Phone 当作一个USB的子类就是合理的,实例化 Phone 对象后,所有USB中定义的方法和属性都是可以被调用的,所以直接把 Phone 看作是一个USB类型就是合理的。 从多态角度看: 而子类向父类转型是自动的,这个很容易理解,比如,食物、面食、馒头、面条、面包,我们可以说一碗面条,或者一块面包,肯定是面食,而面食肯定是食物;文具、尺子、笔、钢笔、铅笔,我们可以说铅笔就是笔,笔就文具,尺子也是文具。 在Java中,一个类实现了一个接口,就自动成为这个接口的子类型。因此,Phone 向USB转型是自动的,Phone 向WIFI转型也是自动的。 这个也不难理解,因为接口其实就是一个规范,谁实现了这个规范,那么它就具备 了这个规范所定义的功能,调用者就可以把它当作这个规范的类型,只关注规范的功能即可,不必关注它具体是哪个类实现的。 这种方式可以降低程序模块之间的耦合性,让软件开发者关注模块之间的重要的部分,增强灵活性。 这样说可能有点抽象,举个例子,如果想从电脑中复制文件到一个USB接口的移动存储设备,我们通常是用U盘,但移动存储设备不仅限于U盘,也可以通过USB线连接到手机、平板电脑、移动硬盘等设备,对电脑来说,它都是复制到一个USB接口的存储设备。也就是说,电脑此时关注的是一个接口规范,它定义了USB线连接到电脑时提供了可以复制文件到目标设备的规范,而U盘、手机、平板电脑、移动硬盘都实现了这个接口,因此电脑只关注接口规范的做法,能够增强设计的灵活性。而如果将来什么时候,你的手表也支持这个规范,那么文件也可以复制到你的手表上了,也就是说,扩展性也得到了加强。 通常,在你的程序中,使用更“泛”的类型,会比使用更“精确”的类型更具灵活性。比如一个人在用餐时,他的主食如果是“泛”类型“食物”,那么他可以随便到哪家餐馆吃饭,如果他只吃精确点的“面食”,那么他只能在面包店买面包吃,或者面馆吃面条,如果他只吃很精确的“杭州小笼包”……
小灰狼 2016-04-28
  • 打赏
  • 举报
回复 1
引用 10 楼 Young_tree 的回复:
[quote=引用 9 楼 小灰狼的回复:][quote=引用 6 楼 Young_tree 的回复:] [quote=引用 4 楼 疯雪的回复:] 哈哈,这就是多态,同一个对象被造型成不同的数据类型时,就有了不同的方法(实现)
那这段代码里 usb和wifi类到底有没有新建对象呢?[/quote] 没有直接创建USB和WIFI的对象,而是创建了它的实现类的对象 但是程序里,把实现接口的对象,再把它当作接口的对象 接口只是一个规范,只有定义功能,但没有进行实现。因此不可能直接创建接口的对象,否则你在调用接口方法时,程序不知道执行什么运作。 USB usb = new Phone(); 其实就是让你把一部手机当作一个USB设备,忽略它的详细类型。 [/quote] 也就是说 接口不能创建对象 但是可以有某个接口类型的对象是吗[/quote] 是的 接口本身就是一种类型 既然是类型,就是可以声明它的变量的,然后把一个对象赋值给它 任何东西都一样,如果只能定义,不能使用,它不就没有存在的价值了吗
cdglynn 2016-04-28
  • 打赏
  • 举报
回复
接口只是说明类实现了哪些功能,你可以把他当作一个约定,约束类必须实现这些功能。你可以把类看作是对象的描述,而对象才是真实存在的。你的例子中phone,usbphone ,wifiphone 其实是对同一个对象的引用。 看看面向对象相关的基础知识吧。真没看懂这和多态有个毛关系。
Young_tree 2016-04-28
  • 打赏
  • 举报
回复
引用 9 楼 小灰狼的回复:
[quote=引用 6 楼 Young_tree 的回复:] [quote=引用 4 楼 疯雪的回复:] 哈哈,这就是多态,同一个对象被造型成不同的数据类型时,就有了不同的方法(实现)
那这段代码里 usb和wifi类到底有没有新建对象呢?[/quote] 没有直接创建USB和WIFI的对象,而是创建了它的实现类的对象 但是程序里,把实现接口的对象,再把它当作接口的对象 接口只是一个规范,只有定义功能,但没有进行实现。因此不可能直接创建接口的对象,否则你在调用接口方法时,程序不知道执行什么运作。 USB usb = new Phone(); 其实就是让你把一部手机当作一个USB设备,忽略它的详细类型。 [/quote] 也就是说 接口不能创建对象 但是可以有某个接口类型的对象是吗
Young_tree 2016-04-27
  • 打赏
  • 举报
回复
引用 4 楼 疯雪的回复:
哈哈,这就是多态,同一个对象被造型成不同的数据类型时,就有了不同的方法(实现)
那这段代码里 usb和wifi类到底有没有新建对象呢?
java叶新东 2016-04-27
  • 打赏
  • 举报
回复
多态的基础明白了就知道了
疯雪 2016-04-27
  • 打赏
  • 举报
回复
哈哈,这就是多态,同一个对象被造型成不同的数据类型时,就有了不同的方法(实现)
liuqitoday 2016-04-27
  • 打赏
  • 举报
回复
楼主的代码是USB和WIFI的声明指向了Phone的实现, 属于多态.
  • 打赏
  • 举报
回复
正是这些特性才有了多态
Coder_D 2016-04-27
  • 打赏
  • 举报
回复
new操作才是创建对象 用接口是可以进行声明的

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧