抽象类和接口
抽象类
-
抽象类中的变量和普通类的变量一样使用,可以被 (public、private、protected、static、final)关键字修饰。
- 抽象类中的成员方法和普通类的成员方法一样使用,没有限制。但抽象方法必须是被public/protected abstract修饰(protected 同类、同包、子类中可访问)。
-
抽象类中可以不含有抽象方法,但有抽象方法的类必须是抽象类。
- 抽象类中可以含有静态方法,静态方法是先于类而存在的,生命周期很长。
-
抽象类不能被实例化(也就是不能被new出来)。
- 抽象类的子类只能继承一个抽象类(Java中类是单继承)
-
抽象类只能被继承,要实现只能实例化子类(如果子类也是抽象类那么就实例化孙子辈去调用抽象类的方法)。
-
抽象类中可包含属性、方法、构造方法,如果要调用抽象类的构造方法,只能通过子类实例对象来调用。
接口
-
接口中没有成员变量这个说法,只有常量。而且是静态不可改变的常量(用public static final 修饰)。
-
接口中的方法是没有实现的抽象方法(用关键词public abstract修饰)。
-
接口中没有构造方法。
-
接口中的方法在jdk1.8版本以后可以不用子类去实现,只需在方法访问修饰符前加一个default。
public class Boy implements People{ /** * Boy类实现了People接口中格得a方法,却没有实习People接口中的show方法 * 因为show方法被default修饰了,实现类不需要实现这个方法。 */ @Override public void a() { } } interface People { default public void show() { System.out.println("我是人类"); } //抽象方法 public abstract void a(); }
5. 接口可以多继承接口。
public class Test { public static void main(String[] args) { //实例化D对象 D d = new D(); d.show(); } } class D implements C{ /** * D类实现C接口 */ @Override public void show() { C.super.show(); //注意:在D类中是无法调用AB接口中的方法,只能在接口C中才可以调用 } } interface A{ default public void show() { System.out.println("我是A"); } } interface B{ default public void show() { System.out.println("我是B"); } } interface C extends A ,B{ /** * 接口C继承了A和B,由于默认方法冲突所以要重写这个冲突的方法 */ @Override default void show() { //调用A里面的show代码如下 A.super.show(); //调用B里面的show代码如下 B.super.show(); } }
代码运行结果如下:
我是A
我是B
6. 接口无法被实例化(也就是不能被new出来),但是可以用类去实现它,类实现的关键字:implement。
接口和抽象类的区别
-
抽象类中的方法可以有方法体,但接口中的方法不能有方法体。
-
抽象类中的成员变量可以是各种类型的,但接口中的成员变量只能被 public static final 修饰的。
-
接口中不能含有静态代码块和静态方法,而抽象类是可以有静态代码块和静态方法。
-
一个类只能继承一个抽象类,而一个类却可以实现多个接口。

浙公网安备 33010602011771号