感觉抽象类与接口都是为了达到抽象的概念,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)接口继承接口可以多继承的。
转载于:https://blog.51cto.com/wangyaojie/1566019