Java面试—JDK1.8接口和抽象类
程序员文章站
2022-05-22 11:21:45
...
前言
接口是对动作的抽象,抽象类是对根源抽象。
使用抽象类,也就是继承,是一种强耦合的设计,用来描述“A is a B” 的关系,即如果说A继承于B,那么在流程中将A当做B去使用应该完全没有问题。
接口设计目的就是对类的行为进行约束,,也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,但不对如何实现行为进行限制。对“接口为何是约束”的理解,我觉得配合泛型食用效果更佳。
抽象类:
- 被Abstract关键字修饰的类是抽象类;
- 含有抽象方法的类一定是抽象类,但是抽象类不一定含有抽象方法;且抽象方法必须是public或protected,否则不能被子类继承。默认为public。
- 抽象方法中不能有实现,否则编译报错;
- 抽象类中可以定义自己的成员变量和成员方法,权限没要求,private,protected,public。
- 抽象方法要被实现,不能是static,也不能是private。
- 子类继承抽象类时,必须实现抽象类中的所有抽象方法,否则该子类也要被定义为抽象类;
- 抽象类不能被实例化,实例化的话,就是多态了。
- 可以有main方法,不可以new一个抽象类
- 可以有构造器,初始化块,内部类
- abstract不能修饰成员,局部变量,更不能修饰构造器
public abstract class Test {
private int a;
protected int b;
public int c;
int d;
abstract int geta(); //不能有方法体,不能用private
protected abstract int getb();
static void fun1(){
System.out.println("静态方法");
}
private void fun(){
System.out.println("私有普通方法");
}
static{
System.out.println("静态代码块");
}
{
System.out.println("代码块");
}
public Test(){
System.out.println("构造函数");
}
}
接口:
- 接口中变量类型默认且只能是public staic final
- 接口中声明抽象方法(普通方法),且只能是默认的public abstract,没有具体的实现;
- 默认的方法没有方法体,但JDK1.8之后默认方法,静态方法是要有方法体的。
- 可以有main方法,可以new一个接口,需要在方法体中实现所有接口函数
- 子类必须实现所有接口函数;
- 不能定义构造器和初始化块
public interface Test {
int a =1; //常量
void fun(); //抽象方法
default void fun1(){
System.out.println("默认方法");
}
static void fun2(){
System.out.println("静态方法");
}
}
区别:
- 一个类只能继承一个抽象类,但可以实现多个继承
- 抽象类中可以包含静态代码块和静态方法,接口则不能。
- 接口方法都是抽象的,抽象类可以同时包含抽象和非抽象的。
- 实现接口必须要实现所有方法,而抽象类可以不用全部实现抽象方法,但是其子类也得是抽象类
- 两者都不能直接实例化,要实例化的话就涉及到多态了。
上一篇: java多线程之线程同步与死锁(三)
下一篇: Drools的Java入门Demo