抽象类和接口的区别
一 接口和抽象类的相似性
1 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。
2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
二 接口和抽象类的区别
1 (不能为普通方法提供方法体)接口里只能包含抽象方法,静态方法和默认方法(加default),不能为普通方法提供方法实现,抽象类则完全可以包含普通方法,接口中的普通方法默认为抽象方法。
2 .(public static final 赋值)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的,并且必须赋值,否则通不过编译。
3 (是否有构造器)接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。
4 .(不能包含初始化块)接口里不能包含初始化块,但抽象类里完全可以包含初始化块。
5. (继承一个抽象类、多个接口)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
什么时候使用抽象类和接口
如果你拥有一些方法并且想让他们中的一些有默认实现,那么使用抽象类吧。
如果你想实现多重继承,那么你必须使用接口。由于Java不支持多继承,子类不能够继承多个类,但可以实现多个接口。因此你就可以使用接口来解决它。
如果基本功能在不断改变,那么就需要使用抽象类。如果不断改变基本功能并且使用接口,那么就需要改变所有实现了该接口的类。
额外总结:
静态初始化块在类第一次加载时执行,且只执行一次。
非静态初始化块在构造器之前执行但前提是要调用构造方法。
静态初始化块》》非静态初始化块---构造器
非静态初始化块在构造器前面执行就想着不实例化也能执行....原来就算顺序是这样,也要初始化,不然无法执行初始化块。好坑的..(如标记11)
//非静态初始化块能初始化静态变量,也可以初始化实例变量。(顺序问题但是前提是得通过实例化来调用构造方法,内存中还没有这个实例变量,非静态变量依赖于对象存在。)
//静态初始化块可以初始化静态变量,但是不能初始化实例变量。和静态初始化块的加载时间有关
package java基本知识点复习;
public class 初始化块初始化静态变量 {
//非静态初始化块能初始化静态变量,也可以初始化实例变量。(顺序问题但是前提是得通过实例化来调用构造方法)
//静态初始化块可以初始化静态变量,但是不能初始化实例变量。和静态初始化块的加载时间有关。
static int i,j;
int k=0;
//非静态初始化
{
System.out.println("输出结果");
i=5;
System.out.println(i);
k=6;//内存中还没有这个k变量,非静态变量依赖于对象存在
System.out.println(k);
}
//静态初始化块
static{
j=6;
// k=0;
System.out.println("静态代码块");
}
public static void main(String[] args) {
System.out.println(i);
System.out.println(j);
//11 初始化块初始化静态变量 AA=new 初始化块初始化静态变量();
}
}