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、一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口
相关推荐
代码or搬砖18 小时前
Collections和Arrays
java·开发语言
Yiii_x19 小时前
Object类与包装类
java·经验分享·笔记·课程设计·ai编程
吴名氏.19 小时前
电子书《Java程序设计与应用开发(第3版)》
java·开发语言·java程序设计与应用开发
喵手19 小时前
数字处理的那些事:从 `Math` 到 `BigDecimal`,如何玩转数字与随机数?
java·数字处理
Wang153019 小时前
2025-2026 Java核心技术热点全景解析:从LTS革新到生态跃迁,筑牢后端技术核心竞争力
java
ss27319 小时前
ScheduledThreadPoolExecutor异常处理
java·开发语言
ssschema19 小时前
M4芯片MAC安装java环境
java·macos
星辰_mya19 小时前
RocketMQ
java·rocketmq·java-rocketmq
一叶飘零_sweeeet20 小时前
2025 实战复盘:物联网 + 数据检索融合项目的核心技术实现与心得
java·物联网·mqtt
码农水水20 小时前
阿里Java面试被问:慢查询的优化方案
java·adb·面试