黑马程序员技术交流社区

标题: 接口和多态方面的问题 [打印本页]

作者: 陈泰延    时间: 2013-1-23 12:43
标题: 接口和多态方面的问题
  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)//PCI p = new NetCard()
  13.        
  14.          {
  15.                  if(p!=null)
  16.                  {
  17.                 p.open();//这里面的open和close 与上面PCI里面的是什么关系?
  18.                 p.close();
  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 DuoTaiDemo5
  34. {
  35.          public static void main(String[] args)
  36.          {
  37.                  MainBoard mb = new MainBoard();
  38.                  mb.run();
  39.                  mb.usePCI(null);
  40.                  mb.usePCI(new NetCard());
复制代码

作者: 刘郑瑞    时间: 2013-1-23 13:11
public void usePCI(PCI p)//PCI p = new NetCard()
      
        {

              if(p!=null)

                {

               p.open();//这里面的open和close 与上面PCI里面的是什么关系?

               p.close();
                 }

        }

p对象调用的是实现了PCI接口子对象的方法。NetCard实现了PCI接口中的方法,然后在usePCI()方法中调用。当然啦,这个扩展性就很强了。

主机有了网卡,也有声卡,同样可以传递声卡的对象到usePCI()中进行调用。
作者: 王少雷    时间: 2013-1-23 13:36
if(p!=null)
                 {
                p.open();//这里面的open和close 与上面PCI里面的是什么关系?
                p.close();
                 }
楼主可以这么理解,接口就是一种JVM 的规范,里面定义了处理事件的动作,但不去实现,也就是 接口和抽象类中说的,定义方法不需要方法体。

真正实现接口的那个类,才是 实际处理事件的。。。
PCI p = new NetCard() 拿接口对象指向开辟的还是NetCard的对象空间,最后调用的方法,就是 在接口定义好的方法,在NetCard里面的具体实现。
作者: 王少雷    时间: 2013-1-23 13:36
if(p!=null)
                 {
                p.open();//这里面的open和close 与上面PCI里面的是什么关系?
                p.close();
                 }
楼主可以这么理解,接口就是一种JVM 的规范,里面定义了处理事件的动作,但不去实现,也就是 接口和抽象类中说的,定义方法不需要方法体。

真正实现接口的那个类,才是 实际处理事件的。。。
PCI p = new NetCard() 拿接口对象指向开辟的还是NetCard的对象空间,最后调用的方法,就是 在接口定义好的方法,在NetCard里面的具体实现。
作者: 卢浩    时间: 2013-1-23 13:49
public void usePCI (PCI  p)   传入的的变量p的类型是PCI 类型 当然就可以使用上面定义的接口PCI中的方法啊,
跟 PCI   P =new  PCI ();   p.open();p.close(); 是一样的效果吧  这里只不过是直接传入对象p了吧。 相当于写一个类   创建对象   对象.方法名调用。 不知道是不是你疑惑的地方,  当然这段代码整体肯定讲的是多态。
作者: 黑马张英涛    时间: 2013-1-23 14:33
让父类引用指向了子类对象,实际调用的是子类对象的方法。
这种方式必须保证调用的是父类中已有的方法,如果是子类特有的方法,
则无法调用。

作者: 高浩    时间: 2013-1-23 14:43
接口是一个抽象类,定义了抽象方法,
接口是来实现的,类是用来继承的,接口是个特殊的类,
一旦子类实现了该接口就必须覆盖该接口里面的所有抽象方法
接口可以多实现,但类只能单继承
作者: 陈泰延    时间: 2013-1-23 18:38
刘郑瑞 发表于 2013-1-23 13:11
public void usePCI(PCI p)//PCI p = new NetCard()
      
        {

O(∩_∩)O谢谢!
作者: 陈泰延    时间: 2013-1-23 18:38
王少雷 发表于 2013-1-23 13:36
if(p!=null)
                 {
                p.open();//这里面的open和close 与上面PCI里面的是什么 ...

谢谢!!!
作者: 陈泰延    时间: 2013-1-23 18:38
王少雷 发表于 2013-1-23 13:36
if(p!=null)
                 {
                p.open();//这里面的open和close 与上面PCI里面的是什么 ...

:)O(∩_∩)O谢谢
作者: 张敬培    时间: 2013-1-23 23:14
  1. <blockquote> interface PCI//这是一个接口
复制代码
当类实现了接口后,
Interface in = new ClassImplase();
这是通过子类的实例来指向接口的引用,这就是多态。
因为接口引用指向的是实现类的实例,所以接口中的方法调用的也就是实现类的方法。
所以楼主的问题可以看上面代码的注释





作者: 朱玉玺    时间: 2013-1-26 20:18
我先举个例子:单位有很多打印机,一旦出问题就需要修理,一开始是找一个会修理打印机的师傅,每次机子换来,都给他打电话来修。有一次,领导的打印机坏了,限我2个小时内修好打印机;但我给这个师傅打电话,却被告知他出去旅游了,要后天才能回来。不出意外,我给领导狠狠的批了一顿。痛定思痛,我想到了一个办法,去找一个打印机维修站来负责维修。维修站,提供打印机的维修服务,但其实具体实现这些服务的还是维修站里的师傅们啦,不过我打印机出问题时,如果原来负责我这块维修的师傅有事,维修站会派另一位师傅来,所以总能及时滴解决我的问题啦。
这里的的维修站就相当于接口(interface),维修站提供的打印机维修服务就相当于接口里边的方法声明,而维修站的师傅们就相当于实现了接口的那些方法的类。
你提问的
p.open();//这里面的open和close 与上面PCI里面的是什么关系?
p.close();
它们的关系就相当于维修站广告牌写的“打印机维修服务”和维修站里的师傅具体维修打印机这两者的关系是一样的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2