抽象类和接口的区别

2023-03-27 09:45:14

抽象类和接口的区别

一 接口和抽象类的相似性

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 初始化块初始化静态变量();
		
	}

}

 

  • 作者:Eaxker
  • 原文链接:https://blog.csdn.net/qq_34602647/article/details/80560741
    更新时间:2023-03-27 09:45:14