接口是对动作的抽象,抽象类是对根源抽象。
????????使用抽象类,也就是继承,是一种强耦合的设计,用来描述“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("静态方法"); }}
区别:
一个类只能继承一个抽象类,但可以实现多个继承抽象类中可以包含静态代码块和静态方法,接口则不能。接口方法都是抽象的,抽象类可以同时包含抽象和非抽象的。实现接口必须要实现所有方法,而抽象类可以不用全部实现抽象方法,但是其子类也得是抽象类两者都不能直接实例化,要实例化的话就涉及到多态了。