首页 > 代码库 > Abstract Class与Interface的区别

Abstract Class与Interface的区别

感觉抽象类与接口都是为了达到抽象的概念,Java抽象类可以提供某些方法的部分实现,如果向一个抽象类里加入一个新的具体方法时,那么它所有的子类都一下子都得到了这个新方法,而Java接口做不到这一点,如果向一个Java接口里加入一个新方法,所有实现这个接口的类就无法成功通过编译了,因为你必须让每一个类都再实现这个方法才行,这显然是Java接口的缺点。


       在网上看又说抽象类是is-a的关系;接口是like-a的关系。


       接口可以丰富类的功能,例如一个类实现java.lang.Comparable接口就可以与相同类型的其他对象进行比较,这个可以算作接口的优点吧。

Abstract Class:抽象类

1)抽象类中可以有构造方法,如果不写,会有一个默认的空的构造方法,继承抽象类的实现类实例化时会递归调用,首先调用抽象类的构造方法,然后再调用自己的构造方法。

/**
 * 类描述:抽象类
 * @author 王要杰
 * @version 1.0.8.1
 * 创建时间 2014-3-4
 */
public abstract class MyAbstractClass {
  int i = 0;
  public MyAbstractClass(int i) {
    i = 9;
    System.out.println("抽象类构造方法执行");
  }
}

/**
 * 类描述:测试类
 * @author 王要杰
 * @version 1.0.8.1
 * 创建时间 2014-3-4
 */
public class AbstractTtest {
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Ttest a = new Ttest();
    System.out.println(a.i);
  }
}
/**
 * 继承抽象类的实现类
 * */
class Ttest extends MyAbstractClass {
  public Ttest() {
    super(1);//由于抽象类我给的构造方法是含有参数的,实现类如果不指定调用有参数的构造方法,会默认执行super();这时会报错哦
    i = 10;
    System.out.println("实现类构造方法执行");
  }
}

输出结果为:

抽象类构造方法执行

实现类构造方法执行

10

2)抽象类可以有自己的实现方法,可以包含抽象的方法,抽象方法必须包含abstract关键字,不能被private修饰,可以是protected,public---这个思考?。


Interface 接口:

1)接口中的所有方法默认都是 public abstract 类型的;一般jdk源码中定义的接口都省略了这两个关键字;且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

2)接口中可以定义一些属性,但是这些属性默认是public static final类型的(即使不写这几个关键字);-------但是下面代码可以修改Student类中的name属性,是因为a指向的内存地址没有变,所以ok。

/**
 * 类描述:
 * @author 王要杰
 * @version 1.0.8.1
 * 创建时间 2014-3-4
 */
public interface myInterfaceS extends myInterfaceG {
  int i = 12;//默认public final static
  Student a = new Student("tom");
  void close(String a);//默认public abstract
}
/**
 * Student类
 * */
class Student {
  String name = "";
  public Student(String name) {
    this.name = name;
  }
  public String toString() {
    return name;
  }
}

3)接口继承接口可以多继承的。

Abstract Class与Interface的区别