一、什么是接口
接口用关键字interface来实现
接口中的属性:
接口中的属性都是隐式的public,static和final。
接口中的属性必须是常量,因为接口没有构造方法,不能通过构造方法初始化变量
为什么是静态的呢?
因为接口不能被实例化,所以要通过接口名.属性的方式调用
public interface music{ public static final int a = 1; public static final int b = 2; }
接口中的方法:
1.抽象方法
接口中的所有方法声明都是隐式抽象和公开的,除非它们声明为static或default。
例如:
public interface music{ void play(); } //事实上这个方法是下面这样,只是把public abstract省略了 public abstract void play();
抽象方法必须被实现类重写
2.静态方法
从Java 8,我们可以在接口中有静态方法。
静态方法包含静态修饰符,并且是隐式公开的,不能被实现类实现
静态方法只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用
3.默认方法
Java 8中添加的新功能,使用default修饰,默认方法不需要被实现类重写
public interface music{ void play(); // A default method default void move() {} }public class Player implements music{ //实现类必须重写抽象方法,但可以不重写默认方法 @override public void play() { System.out.printLn(); } }
接口的继承:
一个接口可以使用关键字extends来继承其他接口,可以使用","隔开,继承多个接口
interface A { String s = "A"; } interface B { String s = "A"; } interface C extends A,B { String s = "B"; }
二、什么是抽象类
抽象类是使用abstract关键字修饰的类,抽象类的作用是这是其他类的对象共有的。
抽象类的存在就是为了继承,子类继承抽象类,同时通过这个抽象类进行派生,拓展此模块的行为功能。
抽象类的方法:
抽象类中有抽象方法和非抽象方法,也有构造方法,但是不能被实例化
实例化子类的时候,就会初始化父类,不管父类是不是抽象类都会调用父类的构造方法,初始化一个类,先初始化父类
子类继承了抽象类必须实现父类的抽象方法,如果没有实现,那么子类也将会是抽象类。
public abstract class AbstractResponse { public AbstractResponse(){ } /** * 返回编码 * @return */ public abstract String getCode(); }
抽象类不能实例化为什么有构造方法
1.java规定类都要有一个构造方法,没有默认提供一个空参构造
2.构造方法不是用来实例化的,而是用来给属性初始化赋值的,抽象方法可以定义属性,那么就需要构造方法给属性赋值。这里就可以理解为什么接口没有构造方法了,接口中的属性必须是常量了。
3.抽象方法需要被子类继承,子类的构造方法中是用super()调用父类的构造方法实例化的,如果抽象类没有构造方法,那么就无法被子类继承了。