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、一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口
相关推荐
小薛博客25 分钟前
22、Jenkins容器化部署Java应用
java·运维·jenkins
西贝爱学习29 分钟前
如何在 IntelliJ IDEA 中进行全局替换某个字段(或文本)
java·ide·intellij-idea
南部余额33 分钟前
Spring 基于注解的自动化事务
java·spring·自动化
alf_cee33 分钟前
通过Idea 阿里插件快速部署java jar包
java·ide·intellij-idea
坚持每天敲代码1 小时前
【教程】IDEA中导入springboot-maven工程
java·maven·intellij-idea
CodeCraft Studio1 小时前
国产化PDF处理控件Spire.PDF教程:如何在 Java 中通过模板生成 PDF
java·python·pdf·spire.pdf·java创建pdf·从html创建pdf
阿方.9181 小时前
《数据结构全解析:栈(数组实现)》
java·开发语言·数据结构
YC运维1 小时前
Ansible题目全解析与答案
java·算法·ansible
程序员清风2 小时前
贝壳一面:年轻代回收频率太高,如何定位?
java·后端·面试
考虑考虑2 小时前
Java实现字节转bcd编码
java·后端·java ee