JAVA接口与抽象类的区别
-
什么是抽象方法?
-
什么是抽象类?
-
什么是接口?
-
接口和抽象类的区别?
-
接口和抽象类的相同点?
1.什么是抽象方法?
在java中,我们都知道方法的概念,那么什么是抽象方法呢,抽象方法就是只有方法名,而没有方法体(没有方法的具体实现的方法),称为抽象方法.
抽象方法的特点:
抽象方法只有方法名,而没有方法体(方法最后以分号结尾)

抽象方法的优点:
每一个不同的类,可以通过重写抽象方法而实现不同的功能,实现多态.
2.什么是抽象类?
含有抽象方法的类称为抽象类.
注意:
抽象类中可以有非抽象方法和属性,抽象类也是一个类,所以也只能单一继承.
public abstract class Door {
private String name;
private int id;
public abstract void open();
abstract void close();
public void welcome() {
System.out.println("欢迎来到Bug研发工作站");
}
}
在上图中方法后以分号结尾(没有方法体),上图中open,close是抽象方法,welcome是普通方法(有方法体);
public class WaterDoor extends Door{
public void open() {
System.out.println("防水门开了");
}
void close() {
System.out.println("防水门关了");
}
}
子类(非抽象类)继承抽象类,必须重写抽象类中的所有抽象方法(非抽象方法不用重写)
抽象类继承抽象类不用重写方法<因为抽象类中可以有抽象方法,而非抽象类中不能有抽象方法>
public class Test {
public static void main(String[] args) {
WaterDoor water = new WaterDoor();
water.open();
water.close();
water.welcome();
}
}

上图为Test类运行结果
注意:
-
抽象类中不一定都是抽象方法,但是含有抽象方法的类一定是抽象类.
-
构造方法,不能为抽象方法
3.什么是接口?
接口在java中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明,不可以创建对象(无法被实例化),但是一个类可以实现多个接口,接口也是多态的实现的一种.
接口与类的相似点:
-
一个接口可以有多个方法
-
接口文件保存在.java结尾的文件中,文件名使用接口名
-
接口的字节码文件保存在.class结尾文件中
-
接口相应的字节码文件必须与包名称相匹配的目录结构中.
接口与类的区别:
-
接口不能用于实例化对象。
-
接口没有构造方法。
-
接口中所有的方法必须是抽象方法。
-
接口不能包含成员变量,除了 static 和 final 变量。
-
接口不是被类继承了,而是要被类实现。
接口中的常量:
接口中的常量必须使用public static final修饰,不写也默认为public static final
(在接口中不可以有变量)
接口中的方法:
接口中的方法必须使用,public abstract修饰,不写默认为abstract
public interface PoorGuy {
public static final int num = 10 ;
String name = "Bug研发工程师";
public abstract void welcome();
void Poor();
}
上图定义了一个接口,接口中num常量是使用public static final修饰的,name没有使用,但是默认修饰也是public static final修饰,方法中welcome方法使用的是public abstract修饰的,但是Poor()没有使用,接口中的方法默认修饰为public abstract

上图中会报错,原因是接口中默认使用public abstract,但是实现接口的类不写默认的是default,public-->default,降低了访问权限,所以要使用public就可以了

public class TestInterface implements PoorGuy{
public void welcome() {
System.out.println("欢迎来到Bug研发工作室");
}
public void Poor() {
System.out.println("我很贫穷");
}
}
后面的具体测试没有写,大家可以自己测试.
4.接口和抽象类的区别?
| 接口 |
抽象类
|
构造方法
|
没有
|
有
|
方法(不写限定符)
|
默认为public abstract
|
默认为default
|
普通方法
|
没有
|
有
|
继承与实现
|
可以多实现
|
只可以单一实现
|
变量
|
没有变量(除非public static final修饰)
|
有变量
|
重写
|
所有方法都需重写
|
普通方法不需重写
|
静态代码块
|
不包含
|
可以有
|
5.接口和抽象类的相同点?
继承抽象类的子类,或者实现接口的子类(抽象类除外),都必须实现接口或抽象类中的抽象方法,抽象类可以不用重写接口或抽象类中的方法.
接口和抽象类都能实例化对象
菜鸟总结,大佬勿喷