抽象类:含有抽象方法或者由abstract关键字修饰的类称之为抽象类。
接口:是指一个或者多个方法的集合,接口中只有方法的声明而没有方法的具体实现。
相同点:抽象类和接口都不能直接实例化;只有当抽象类被子类继承、接口被实现类所实现之后,才能进行实例化。
不同点:① 方法的定义不同:
抽象类中的抽象方法只能有方法的声明,没有方法体;且抽象类中可以定义非抽象方法;
接口中除非是由static修饰的静态方法,否则只能有方法的声明,不能有方法的实现;
② 实现方式不同:接口需要被实现,抽象类需要被继承。
抽象类的子类只能继承一个父类/抽象类;且若子类没有实现抽象父类所有的抽象方法,那么该子类依然为抽象类;
接口的实现类可以同时实现多个接口;因此,使用接口可以间接地达到多重继承的目的;
③ 成员变量定义方式不同:
抽象类中可以有自己的数据成员变量,也可以有非抽象成员方法,且默认访问权限为default,当然也可以是 private/protected/public的,这些成员变量可以在子类中被重新定义或者赋值。
接口中定义的成员变量默认访问权限为public static final的,即:接口中只能有静态、不能被修改的成员变量,并 且必须赋初始值;
④ 成员方法定义的方式不同:
抽象类中的抽象方法不能使用private、static、synchronized等访问修饰符修饰,不能有方法体;
接口中所有成员方法默认都是public abstract的,并且只能被这两个关键字修饰;
总之,在实际项目开发中,当功能需要积累时,用抽象类;不需要积累时,用接口;
简单地说,接口是一种特殊形式的抽象类,使用接口完全有可能实现与抽象类相同的操作,但一般而恶言,抽象类多用于在同类事物中有无法具体描述的方法的场景,所以当子类和父类之间存在有逻辑上的层次结构时,推荐使用抽象类;而接口多用于不同类之间的通信规则,所以当希望支持差别较大的两个或者多个对象之间的特定交互行为时,应该使用接口。
此外,接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类。抽象类也可以有静态的main()方法。
/**
* 定义抽象类:抽象类中的抽象方法只能有方法的声明,没有方法体;且抽象类中可以定义非抽象方法;
* @author
*/
public abstract class SimpleAbstract {
private Integer valOne; //抽象类中可以定义普通变量
public String valTwo;
private static String valThree; //静态变量
String valFour; //default权限的变量
protected String valFive; //受保护的变量
public Integer getValOne() {
return valOne;
}
public void setValOne(Integer valOne) {
this.valOne = valOne;
}
public static String getValThree() {
return valThree;
}
public static void setValThree(String valThree) {
SimpleAbstract.valThree = valThree;
}
public String getValTwo() {
return valTwo;
}
public void setValTwo(String valTwo) {
this.valTwo = valTwo;
}
//抽象类中声明并实现方法
public void methodOne(String arg){
System.out.println("抽象类输出===》抽象类中的第一个方法..."+arg);
}
//抽象类中只声明、不实现的抽象方法
public abstract void methodTwo();
//抽象类中声明并实现方法
public void methodThree(int vo, String vt, String vth){
this.setValOne(vo);
this.setValTwo(vt);
SimpleAbstract.setValThree(vth);
System.out.println("抽象类输出===》第一个变量值:"+this.getValOne()+"; 第二个变量值:"+this.getValTwo()+"; 第三个变量值:"+SimpleAbstract.getValThree());
}
//抽象类中只声明、不实现的抽象方法
public abstract void methodFour();
}
/**
* 定义接口:接口中除非是由static修饰的静态方法,否则只能有方法的声明,不能有方法的实现;
* @author
*/
public interface OneSimpleInterface {
public void firstInterfaceMethodOne();
public void firstInterfaceMethodTwo();
public static void firstInterfaceMethodThree(){
System.out.println("接口中定义static修饰的静态方法...");
}
}