请教高手接口相对于抽象类的优点(多继承除外),是优点,不是区别,一个面试官这么问我的

解决方案 »

  1.   

    我想到一个,接口可以用来做标记用,比如java.io.Serializable 接口,没有声明方法,实现这个接口来标记可序列化。然后除了多继承想不出其它的了,期待高手。
      

  2.   

    也不一定,你看看java io的设计 还有java中 Integer,Double 等等都是集成Number类的
      

  3.   

    接口相比于抽象类的优点之一是:通过接口,可以把一个类的某些方法,而不是所有方法,提供给类的用户使用,而抽象类无法实现这种效果
    请看下面这个雇员的例子,其中定义了修改个人信息和计算薪水的方法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接口只提供跟薪水有关的方法 
    interface Payable
    {
        public void computePay(int hoursWorked);
        public double getWeeklyPay();
    }//EmployeeInfo接口只提供跟个人信息有关的方法 
    interface EmployeeInfo
    {
        public String getName();
        public void setName(String n);
    }//如果写一个会计的类,其中的方法把Payable作为参数,会计就只能使用跟薪水有关的方法,而不能修改Employee的个人信息
    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就只能使用跟员工个人信息有关的方法,而不能看到薪水等 
    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());
        }
    }
    //这样一来,通过接口,Employee抽象类就可以提供部分方法给该类的用户使用,而不会暴露其他的方法,这个是接口相对于抽象类的优点之一