Java基础知识总结(43)

(1)初始化块

复制代码
    和构造方法具有相同功能的是初始化块。当创建Java对象时,系统总是先调用类中定义的初始化块

(2)静态初始化块 如果定义初始化块使用了static修饰,则这个初始化块就变成了静态初始化块,也被称为类初始化块。静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象时才执行,因此静态初始化块比普通初始化块先执行。 注意:静态初始化块也被称为类初始化块,同样静态成员不能访问非静态成员,因此静态初始化块不能访问实例变量和实例方法。 静态代码块和初始化块的顺序: 父类静态块 ->子类静态块->父类初始化块和构造器->子类初始化块和构造器

public class Base { //先执行 创建子类对象时的代码 先调用父类初始化块和构造方法,然后执行子类的初始化块和构造方法 static Sub sub = new Sub(); //然后再按照静态代码块和初始化块的顺序的顺序执行 static{ System.out.println("Base静态初始化块!"); } { System.out.println("Base初始化块!"); } public Base() { System.out.println("Base构造方法!"); } }

public class Sub extends Base{

复制代码
static{
    System.out.println("Sub静态初始化块!");
}
{
    System.out.println("Sub初始化块!");
}
public Sub() {
    System.out.println("Sub构造方法!");
}

}

运行结果:

Base初始化块! Base构造方法! Sub初始化块! Sub构造方法! Base静态初始化块! Sub静态初始化块! Base初始化块! Base构造方法! Sub初始化块! Sub构造方法! (3)final关键字 1.final修饰的类不能被继承 2.final修饰的变量初始化后不能被重新赋值。final修饰的实例变量可以直接初始化,也可以在初始化块和构造器中初始化。static修饰的常量只能在定义时静态块中初始化 3.final修饰的方法不能被重写(但是可以被重载) /**

  • 父类

  • @author Ray * */ public class Base { String name; int age;

    public final void test() { } //final修饰的方法可以被重载 public final void test(int i) { }

}

/**

  • 子类

  • @author Ray * */ public class Sub extends Base{ // 子类不能重写父类中用final修饰的方法 // public void test() { // // }

} (4)抽象类和接口

复制代码
 父类一般描述了子类共有的,通用的行为或者属性,但是有些情况下,父类定义的方法体不具备通用性,或者该行为一定会被子类重写,那么此时定义方法体就显得多余,Java中提供了抽象方法,抽象方法只有方法头,没有方法体,也就是说抽象方法只规定子类的行为,而不提供实现。

(5)抽象类

复制代码
 使用abstract修饰的类就是抽象类,普通类中包含的内容,在抽象类中都可以包含(成员变量,成员方法,构造器,内部类),此外抽象类中还可以声明抽象方法。抽象类可以理解为是对普通父类的抽象。如果某个普通类继承了抽象类,那么就必须要重写抽象方法,否则这个普通类也必须是抽象类。

(6)抽象方法

复制代码
 使用abstract修饰的方法,叫做抽象方法,抽象方法只有方法头,没有方法体。
 定义抽象方法本来就是用来继承的,抽象方法不能用static、final、private修饰。

(7)接口 接口可以理解为对抽象类的抽象,因为抽象类中不但有抽象方法,还有实例方法及类方法等等,而接口中的内容则更加简洁。一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类。 接口中只能包含:常量,抽象方法,默认方法,私有方法,类方法,不能包含构造器,初始化块,静态初始化块。

复制代码
声明:

public interface Test { //常量 //抽象方法方法

复制代码
 //Java8新增了默认方法(可以有方法体)
default void interfaceTest() {
    System.out.print("123");
}
//Java8新增了类方法
static void interfaceTest2() {
​
}
//Java9新增了私有方法(可以有方法体)
@SuppressWarnings("unused")
private void interfaceTest3() {
    System.out.print("123");
}

}

(8)接口和抽象类的区别

复制代码
1、接口和抽象类都不能被实例化
2、接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。
3、接口里只能包含抽象方法、静态方法、默认方法和私有方法,抽象类则完全可以包含实例方法。
4、接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量。
5、接口里不包含构造器; 抽象类里可以包含构造器,抽象类里的构造器并不是用于创建对象。
6、接口里不能包含初始化块; 但抽象类则完全可以包含初始化块。
7、一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口
相关推荐
郑州吴彦祖77210 分钟前
【java】数据类型与变量以及操作符
java·intellij-idea
程序员大金11 分钟前
基于SpringBoot+Vue+MySQL的在线学习交流平台
java·vue.js·spring boot·后端·学习·mysql·intellij-idea
吹老师个人app编程教学16 分钟前
阿里巴巴_java开发规范手册详解
java·开发语言
天上掉下来个程小白16 分钟前
Stream流的终结方法(一)
java·windows
天上掉下来个程小白38 分钟前
请求响应-08.响应-案例
java·服务器·前端·springboot
大白_dev39 分钟前
数据校验的总结
java·开发语言
失落的香蕉1 小时前
Java第二阶段---10方法带参---第三节 面向对象和面向过程的区别
java·开发语言
哎呀呀嗯呀呀1 小时前
class 031 位运算的骚操作
java·算法·位运算
2401_858120531 小时前
古典舞在线交流平台:SpringBoot设计与实现详解
java·spring boot·后端
大白飞飞1 小时前
IDEA创建、导入、删除maven项目
java·maven·intellij-idea