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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 水云间 中级黑马   /  2013-5-26 16:49  /  1769 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在java编程中,变量类型尽量面向跟接口和父类编程,例如,同样定义一个ArrayList集合,有以下两种定义方式:
1.   List<String> list = new ArrayList<String>();
2.   ArrayList<String> list = new ArrayList<String>();
这两种定义方式有什么区别呢?上面的定义比下面好在哪呢?

4 个回复

倒序浏览
面向接口的好处:就像主板上有了接口,生产商只要生产能插上主板接口的硬件就行了。这样不同厂商去生产各自的硬件就行了,至于硬件内部怎么样不管,必须接口保证可以和主板接上,这样分工就明确了。开发程序也一样,开发需要一个团队,不同的接口下的内容可以分给团队中的不同的人去写。不管你写的怎么样,你首先得面向接口来写,你写的不好可以重写,他写的不好也可以重写。这样修改起来更方便,更适合团队开发。 但是这样也有一点坏处。就是设计接口比较麻烦。就像主板接口设计要开好多次国际大会才能统一接口标准。一个复杂的项目设计接口就会十分麻烦,而且接口改变了就会产生很大的影响。就像主板的显卡接口变了,以前生产的显卡就插不上去了,必须重新设计生产。

父类编程
这就是多态的好处。父类编程后期维护和移植比较方便吧。
就拿下面代码来说。建立一个宠物,但是不知道是狗还是猫。我想让宠物是狗,你想让宠物是猫。如果你Cat chongwu = new dog(),我Dog chongwu = new dog().这样就把宠物限定死是什么了,不太合适吧?这时候如果用父类编程 我Animal chongwu = new dog(),你 Animal chongwu = new cat();这样不是更合适吗?别人还可以new一个pig作为宠物等等。。。

回复 使用道具 举报
以下是百度里多态的作用,也可以看做是父类编程的好处。
把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。
赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。
举个例子:从一个基类中派生,响应一个虚命令,产生不同的结果。
比如从某个基类继承出多个对象,其基类有一个虚方法Tdoit,然后其子类也有这个方法,但行为不同,然后这些子对象中的任何一个可以赋给其基类对象的引用,或者将子对象地址赋给基类指针,这样其基类的对象就可以执行不同的操作了。实际上你是在通过其基类来访问其子对象的,你要做的就是一个赋值操作。
使用继承性的结果就是可以创建一个类的家族,在认识这个类的家族时,就是把导出类的对象当作基类的对象,这种认识又叫作upcasting。这样认识的重要性在于:我们可以只针对基类写出一段程序,但它可以适应于这个类的家族,因为编译器会自动就找出合适的对象来执行操作。这种现象又称为多态性。而实现多态性的手段又叫称动态绑定(dynamic binding)。
简单的说,建立一个父类的对象,它的内容可以是这个父类的,也可以是它的子类的,当子类拥有和父类同样的函数,当使用这个对象调用这个函数的时候,定义这个对象的类(也就是父类)里的同名函数将被调用,当在父类里的这个函数前加virtual关键字,那么子类的同名函数将被调用。
回复 使用道具 举报
本帖最后由 江南雨 于 2013-5-26 17:40 编辑

假如有两个模块,模块1和模块2,模块1要使用模块2中的类,而这时就可以定义模块2的一个接口(就是模块2所需要完成的功能),但是模块2有很多类实现了这个接口,而这时只要使用在模块使用接口类就行,而不需要去关模块2是怎么实现的。代码如下:
  1. public class Mode1 {
  2.         public Complete c;
  3.         
  4.         //在这里你不需要关心模块2所传上来的是action1还是action2,
  5.         //或者是以后再模块2所添加新功能action3
  6.         public  Mode1( Complete c){
  7.                 this.c=c;
  8.         }
  9.         //接下来你就可以完成自己所需要完成的功能
  10. }
复制代码
  1. /**
  2. * @author Administrator
  3. *这是模块2所需要完成的功能
  4. */
  5. public interface Complete {
  6.         
  7.         public void make();

  8. }
复制代码

  1. public class Action1 implements Complete{

  2.         public void make() {
  3.                 // 在这里你可以完成action1所需要完成的功能
  4.         }


  5. }
复制代码
  1. public class Action2 implements Complete {
  2.         public void make() {
  3.                 //在这里你可以完成action2所需要完成的功能

  4.         }

  5. }
  6. 还有就是有代码复用的作用!!这是个人理解
复制代码
回复 使用道具 举报
   同求~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马