日期:2014-05-20  浏览次数:20614 次

关于接口的一点疑惑
比如有个接口inteface   B{
              public   void   save();
}
有两个他的实现BImp1,BImp2

有个类C   用到B.save()的时候,会调用哪个实现类的方法,
如有不妥,请指点,谢谢.


------解决方案--------------------
这就是多态呀,在执行期判断怎么样绑定的。如果C中实例化的是BImp1 B1=NEW BImp1();
那么调用的实质是B1.SAVE();B2 也是一样的 。



------解决方案--------------------
打个比方说...有个手机基类..它下面继承有..可拍照手机类,音乐手机类,股票手机类等等,
现在我想把拍照手机类中的拍照方法独立出来..同时也可供给照相机基类使用...

你如何继承呢...拍照手机..不可能继承..手机基类和拍照基类两个类呀

解决的方法是设定一个拍照的接口,,让照相机基类和拍照手机子类都来实现它..
------解决方案--------------------
C caller1 = new C();
caller1.setB(new BImp1()); //C的B属性是B接口类型
caller1.getB().save(); //调用BImp1的save
C caller2 = new C();
caller1.setB(new BImp2());
caller1.getB().save(); //调用BImp2的save

------解决方案--------------------
对呀..一个类可以实现多个接口的内容

直接父类的意思是.
上面那个例子里... 拍照手机 extends 拍照类,手机类....这种继承两个父类的方法是不允许的.....
最多只能分两次继承
手机类 extends 拍照类
拍照手机 extends 手机类

这样...手机类就是拍照手机的直接父类...而拍照类则是拍照手机的间接父类
------解决方案--------------------

B b = new BImp1();
b.save();
这样掉的是 BImp1 的save方法。

B b = new BImp2();
b.save();
这样就掉了 BImp2 的save方法了。
------解决方案--------------------
接口变量相当于C++里头的指针一样,Java里头的的变量都是引用。
接口引用可以指向任何继承自它的实现类,所以运行时实际调用的是它指向的实例。
A implements B
C implements B

B b = new A();//此时b指向A实例
b = new C();//此时b改成指向C实例,A被JVM回收掉。
b.save();//此时调用的就是C实现的操作