通过字节码观察接口和抽象类
1.接口中有默认方法,只需要default修饰即可,可以有多个
public interface A {
default int print1(){
System.out.println("---1----");
return 0;
}
default void print2(){
System.out.println("----2-----");
};
default String print3(){
System.out.println("----3-----");
return "aaa";
};
default int print4(){
System.out.println("---4----");
return 0;
}
default void print5(){
System.out.println("----5-----");
};
default String print6(){
System.out.println("----6-----");
return "aaa";
};
}
从上面可以看出,其默认default被替换为public
2.接口中的成员变量默认都是public static final修饰的,方法是透过public abstract修饰的
public interface D { //public static final int c = 1; //public abstract void test(); }
2.接口不能继承抽象类,接口可以继承接口
3.抽象类必须实现接口
4.接口要被实现,抽象类要被继承
5.抽象类中可以有构造方法
public abstract class B implements A { int num = 1; private B(int num) { this.num = num; } public B(int num,int sum) { this.num = num; this.num = sum; } public static void print(){ System.out.println("------------"); } }
6.接口和抽象类不能直接实例化,实例化只能用多态体现
7.未完全实现接口的类,只能是抽象类;抽象类的子类,如果不能完全实现抽象类中的方法,只能是抽象类。
public interface D { int c = 1; void test(); void print(); }
抽象类可以没有抽象方法,有抽象方法的类必须是抽象类
public abstract class DImpl implements D { }
从图中可以看出默认进行了的抽象类的初始化
抽象方法只能声明,不能实现;即不能有方法体;
抽象方法是需要被继承实现的,所以不能是私有的,也不能是静态的;