抽象类与接口
其实这个东西我自从我读大学就有点不清楚,后来写Matlab跟python做数据分析,一直也没有用到,虽然心理上惦记这个事情,但是确实对我也是没有必要的。但是目前我写Java,这个是必须要掌握的,这么多年以来一直糊里糊涂的,今天总结一下。
基本语法差别
Java中接口和抽象类的定义语法一个是interface跟abstract
抽象类
被abstract修饰的类就是抽象类,被abstract修饰的方法为抽象方法,抽象方法只有方法的声明,没有方法体。
- 抽象类不能被实例化,只能被继承
- 抽象类的抽象方法只能为public或者protected,默认为public,抽象类主要是为了子类的继承,不能使用private来进行修饰
- 包含抽象方法的一定是抽象类,抽象类中不一定包含抽象方法,抽象类的方法可以有1、静态方法;2、一般方法;3、抽象方法
- 抽象类可以包含属性、方法、构造方法,构造方法不能进行用于实例化,主要作用是被子类调用。
下面是一个案例 一个抽象类AlphaAbstract和一个继承抽象类的子类
abstract class AlphaAbstract {
/*
这里可以看到抽象类其实是可以有属性name,id,也有构造函数,一般方法setName()静态方法alphaFunc()可以有也可以没有的抽象方法getName()、setID()
这里其实跟一般类的区别就是构造方法不能实例化,一般类中不能有抽象方法(有抽象方法的一定是抽象类了)
*/
public String name;
public Integer id;
AlphaAbstract(){
this.name="init";
this.id=2002;
}
public static void alphaFunc() {
}
public void setName() {
System.out.println("xxx");
}
public static void tempFunc() {
System.out.println("ttt");
}
abstract public String getName();
abstract public void setID(Integer newID);
public static void main(String[] args) {
//这里是不能实例化对象的,
}
}
继承的子类
public class AlphaSon extends AlphaAbstract {
/*
***因为继承于抽象类,所以子类必须实现父抽象类的抽象方法**
* 然后就可以进行实例化,跟一般类的没有什么区别。
*/
@Override
public String getName() {
return super.name;
}
@Override
public void setID(Integer newID) {
this.id=newID;
}
public static void main(String[] args) {
AlphaSon muyu=new AlphaSon();
System.out.println(muyu.getName());
}
}
接口
被interface修饰的就是接口,
- 接口可以包含变量和方法,方法有default修饰的方法,静态方法,一般方法,
- 接口的变量被隐式的指定为public static final,方法被隐式的指定为public abstract(继承者必须要实现—>implement)理解为抽象类的子类必须实现抽象类的一般方法
- 接口支持多继承,一个接口可以extends 多个接口,间接的解决了单继承的问题;
- 一个类可以实现多个接口;
public interface AlphaInterface {
/**
*这里可以看到有含有变量和三种不同的方法类型(静态方法,default修饰的方法,一般方法)其实跟抽象类很像,只不过没有default,
*而且这里的变量跟函数都是默认public,可以写也可以省略。其实抽象类也可以省略public
**/
String name = "null";
String id = "0000";
int age = 23;
static void alphaFunc() {
}
default String betaFunc() {
return "xyz";
}
String gammaFunc();
}
子类的实现
public class AlphaGirl implements AlphaInterface {
public static void main(String[] args) {
AlphaGirl chenzi = new AlphaGirl();
System.out.println(chenzi.gammaFunc());
System.out.println(chenzi.name);
System.out.println(AlphaInterface.name);
}
public String name = "chenzi";
@Override
public String gammaFunc() {
return "一般类的实现接口";
}
}
区别
相同点
- 都不能实例化,
- 接口的实现类或者抽象类的子类都只是实现了接口或者抽象类的方法后才能实例化
不同点 - 接口只是定义,不能有方法的实现(java新版本使用default定义是可以在接口中实现方法的)
- 两个关键字不一样,抽象类的继承为extends,接口的为implements,一个接口是可以多继承,类不可以
- 接口强调特定功能的实现,抽象类强调的是所属关系。接口强调的是通用性的功能,
- 接口变量 默认的都是public static final 必须赋值不能修改,必须进行初始化,抽象类是可以有构造函数进行初始化的。