接口除了能让JAVA模拟多继承。。还有什么好处??????????

解决方案 »

  1.   

    java中沒有多重繼承,但我覺得java中的接口,不是用來模仿多重繼承,
    雖然兩者很相似,但就像一個人一様,每人只有一個老爸,但這個人可能具
    有姚明的身高,有劉易斯的速度,有劉德華的外表    囧
    为了能有好的扩展性  代码不用一改到处改  方便  要加新内容只要在接口加方法就成了
      让实现了它的接口的具体类去实现
    很多。。
      

  2.   

    具体的可以看看Think in java中的相关章节
      

  3.   

    除了模拟多继承,还有两个重要的好处就是:
    1. 通过接口expose一个类中的某些方法,而不是全部方法,给另外一个类
    2. 强制一个类包含改接口中的某些方法
      

  4.   


    例如下面这个雇员的例子,其中定义了修改个人信息和计算薪水的方法public abstract class Employee implements Payable, EmployeeInfo
    {
        private String name;
        private double weeklyPay;    public Employee(String name, String address)
        {
            this.name = name;
            this.address = address;
        }    public String getName()
        {
            return name;
        }    public void setName(String n)
        {
            name = n;
        }    public double getWeeklyPay()
        {
            return weeklyPay;
        }    public void computePay(int hoursWorked)
        {
            weeklyPay = hoursWorked * 6.50;
            System.out.println("Weekly pay for " + name + " is $" + weeklyPay);
        }
    }
    Payable类只展示跟薪水有关的方法public interface Payable
    {
        public void computePay(int hoursWorked);
        public double getWeeklyPay();
    }
    EmployeeInfo类只展示跟个人信息有关的方法public interface EmployeeInfo
    {
        public String getName();
        public void setName(String n);
    }
    如果写一个会计的类,其中的方法把Payable作为参数,会计就只能使用跟薪水有关的方法,而不能修改Employee的个人信息public class Payroll
    {
        public void payEmployee(Payable p)
        {
            p.computePay(40);
        }    public void printPaycheck(Payable p)
        {
            System.out.println("Printing check for $" + p.getWeeklyPay());
        }
    }
    如果再写一个HR的类,其中的方法的参数为EmployeeInfo,那么HR就只能使用跟员工个人信息有关的方法,而不能看到薪水等public class HumanResources
    {
        public String getInfo(EmployeeInfo e)
        {
            return e.getName() + " " + e.getAddress();
        }    public void changeName(EmployeeInfo e, String name)
        {
            System.out.println("Changing name for " + e.getName());
            e.setName(name);
            System.out.println("New name is " + e.getName());
        }
    }
      

  5.   

    接口的好处在哪?举一个在开发中很常见的例子,
    例如你开发了一个连接数据库的模块,这个模块分别有insert方法(新增一行),update方法(更改一行),delete方法(删除一行),select方法(依照条件查询)等四个方法.
    很多时候你在编写程序的时候(无论是web程序还是gui程序),都要调用这个模块中的这些方法。如果你的模块设计的是一个具体的类,那么这个类的操作就被固定下来了,例如你开发的这个模块是对mysql数据库进行操作的,如果后来这个项目需求发生改变或者你在一个新的项目中使用这个模块时,需要连接oracle数据库了,这个时候你就不得不改变所有代码,重写这些方法,而且顶层调用代码也可能导致改变。
    数据库连接本身就是多样性的,数据库有很多种,mysql,sqlserver,oracle,db2;每种数据库的连接方式与操作方式都是不同的,还有数据库的连接方式多样的,可能是用hibernate框架链接数据库,也可能是用jdbc连接,也可能是odbc桥接,也可能是EJB数据bean连接,这样操作又不相同了。为了解决这种经常的业务变更所导致的代码变更,将这种影响尽量降低就需要用到接口(当然不用接口用父类也是可以的,但是毕竟支持多继承)。
    例如你的模块中定义一个DataAccess接口,然后定义那四个方法,在分别实现MysqlDataAccess,OracleDataAccess等等,你的上层调用模块的程序只知道有一个DataAccess类型,它可以进行数据库操作,但是具体连接什么数据库它没必要知道,这样如果我需要连接Mysql,那么我把MysqlDataAccess类放入即可,如果要连接Oracle,那么我把OracleDataAccess类放入即可。具体怎么实现你可以参照设计模式中的工厂方法。
    这些便是多态的一个应用,而且jdk内部很多地方都用到了,你们会发现jdk的java.包下一级javax.包下的大部分都是接口抽象类和工厂类,而它们的具体实现都在com.sun.包下与sun.包下(为什么这样实现这就牵扯操作系统差异性了).
    jdk本身的实现就是定义一大堆的接口与规范,就是java.包与javax.包,而具体实现是可以随心所欲的,例如sun开发的jdk,他的实现在sun.包下,IBM开发的jdk,他的实现包则可能是在ibm.包下或者com.ibm.包下,某开源社区开发的JDK,它的实现可能是在org.包下等等。
      

  6.   

    接口的好处在哪?举一个在开发中很常见的例子,
    例如你开发了一个连接数据库的模块,这个模块分别有insert方法(新增一行),update方法(更改一行),delete方法(删除一行),select方法(依照条件查询)等四个方法.
    很多时候你在编写程序的时候(无论是web程序还是gui程序),都要调用这个模块中的这些方法。如果你的模块设计的是一个具体的类,那么这个类的操作就被固定下来了,例如你开发的这个模块是对mysql数据库进行操作的,如果后来这个项目需求发生改变或者你在一个新的项目中使用这个模块时,需要连接oracle数据库了,这个时候你就不得不改变所有代码,重写这些方法,而且顶层调用代码也可能导致改变。
    数据库连接本身就是多样性的,数据库有很多种,mysql,sqlserver,oracle,db2;每种数据库的连接方式与操作方式都是不同的,还有数据库的连接方式多样的,可能是用hibernate框架链接数据库,也可能是用jdbc连接,也可能是odbc桥接,也可能是EJB数据bean连接,这样操作又不相同了。为了解决这种经常的业务变更所导致的代码变更,将这种影响尽量降低就需要用到接口(当然不用接口用父类也是可以的,但是毕竟支持多继承)。
    例如你的模块中定义一个DataAccess接口,然后定义那四个方法,在分别实现MysqlDataAccess,OracleDataAccess等等,你的上层调用模块的程序只知道有一个DataAccess类型,它可以进行数据库操作,但是具体连接什么数据库它没必要知道,这样如果我需要连接Mysql,那么我把MysqlDataAccess类放入即可,如果要连接Oracle,那么我把OracleDataAccess类放入即可。具体怎么实现你可以参照设计模式中的工厂方法。
    这些便是多态的一个应用,而且jdk内部很多地方都用到了,你们会发现jdk的java.包下一级javax.包下的大部分都是接口抽象类和工厂类,而它们的具体实现都在com.sun.包下与sun.包下(为什么这样实现这就牵扯操作系统差异性了).
    jdk本身的实现就是定义一大堆的接口与规范,就是java.包与javax.包,而具体实现是可以随心所欲的,例如sun开发的jdk,他的实现在sun.包下,IBM开发的jdk,他的实现包则可能是在ibm.包下或者com.ibm.包下,某开源社区开发的JDK,它的实现可能是在org.包下等等。