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、一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口
相关推荐
qq_2518364574 小时前
AI 疾病自查功能SpringbootAI项目实战 · 技术实现文档
java·ai·ai编程
逆境不可逃4 小时前
Pi Agent 学习笔记:对话太长以后,如何压缩上下文
java
MetaLite4 小时前
JDK 8~26 核心特性一览:从 Stream 到 Scoped Values
java
wno7045 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
君顾15 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房
SL_staff6 小时前
别急着买商业规则引擎:90%风控场景根本不需要全量编码能力
java·程序员·groovy
ManageEngineITSM7 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理
SL_staff7 小时前
ERP排程总在纸上谈兵?JVS-APS如何用真实产能约束打通计划与执行闭环
java·人工智能·开源
xcl09257 小时前
24小时自助健身房系统软件开发实战指南:从架构到部署
java·spring boot
码少女8 小时前
Linux--多路转接之select
java·服务器·数据库