A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨翔 中级黑马   /  2013-1-7 17:27  /  2114 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨翔 于 2013-1-15 22:26 编辑

这个是教学视频里的一段代码,有个地方不太明白,pci是个接口不能够实例对象,为什么在代码中
把NetCard的匿名对象传给 usePCI 函数,就可以调用PCI中的方法了呢,我目前的理解这是因为多态,因为
p实际指向的是NetCard的对象,而NetCard实现了PCI的方法,但是老是感觉有些空泛,谁能帮我详细讲一下?
最好是从内存结构方面?
  1. interface PCI
  2. {
  3.         public void open();
  4.         public void close();
  5. }

  6. class MainBoard
  7. {
  8.         public void run()
  9.         {
  10.                 System.out.println("mainboard run ");
  11.         }
  12.         public void usePCI(PCI p)
  13.         {
  14.                 if(p!=null)
  15.                 {
  16.                         p.open();
  17.                         p.close();
  18.                         
  19.                 }
  20.         }
  21. }

  22. class NetCard implements PCI

  23. {
  24.         public void open()
  25.         {
  26.                 System.out.println("netcard open");
  27.         }
  28.         public void close()
  29.         {
  30.                 System.out.println("netcard close");
  31.         }
  32. }

  33. class Test1
  34. {
  35.         public static void main(String[] args)
  36.         {
  37.                 MainBoard mb = new MainBoard();
  38.                 mb.run();
  39.                 mb.usePCI(new NetCard());
  40.                
  41.                
  42.         }
  43. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
MainBoard mb = new MainBoard();
mb.run();

mb.usePCI(new NetCard());
上面这一句代码可以拆分开来
PCI pci = new NetCard();//因为NetCard实现了PCI接口,接口型引用指向了接口实现类对象
mb.usePCI(pci);

多态在面向对象中很重要,一时间也不是很容易理解,你可以把关于多态的视频多看几次

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
多态,即是一个对象,两种状态,java在编译时,只检察类型对不对,类型对了编译通过,类型不匹配,编译失败。你上面代码中,当程序在编译时,java虚拟机会对PCI的类型进行检察,检察到方法调用时,就对PCI接口验证,发现接口上有调用方法的签名,所以虚拟机编译通过。当程序在运行时,才真正根据对象的引用地址,找到了现实类,调用其中的方法,如查此时找不到对应的方法,那就抛出ClassCastException

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
{:soso_e100:}多谢楼上各位指点
回复 使用道具 举报
面向接口编程
方法接受一个接口类型的对象,也就是实现了这个接口的对象。
在调用这个类中的方法,也就是接口回调。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马