感觉抽象类与接口都是为了达到抽象的概念,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)接口继承接口可以多继承的。