✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】
代码化块又称为初始化块,属于类中的成员[即是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过0包围起来。
但是和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或者类显示调用,而是加载类或创建对象时隐式调用。
[修饰符]{
代码
};
说明:
韩老师的理解:
举个栗子
package com.dingjiaxiong.codeblock_;
/**
* ClassName: CodeBlock01
* date: 2022/9/3 16:50
*
* @author DingJiaxiong
*/
public class CodeBlock01 {
public static void main(String[] args) {
Movie movie = new Movie("你好,李焕英");
System.out.println("======================");
Movie movie2 = new Movie("唐探3",100,"陈思诚");
}
}
class Movie{
private String name;
private double price;
private String director;
{
System.out.println("电影屏幕打开...");
System.out.println("广告开始...");
System.out.println("电影正式开始...");
};
public Movie(String name) {
System.out.println("Movie(String name)被调用 ...");
this.name = name;
}
public Movie(String name, double price) {
System.out.println("Movie(String name, double price)被调用...");
this.name = name;
this.price = price;
}
public Movie(String name, double price, String director) {
System.out.println("Movie(String name, double price, String director)被调用...");
this.name = name;
this.price = price;
this.director = director;
}
}
运行结果

小结:
- static代码块是类加载时执行,只会执行一次
- 普通代码块是在创建对象时调用的,创建一次,调用一次
- 类加载的3种情况,背!
举个栗子
package com.dingjiaxiong.codeblock_;
/**
* ClassName: CodeBlockDetail01
* date: 2022/9/3 17:03
*
* @author DingJiaxiong
*/
public class CodeBlockDetail01 {
public static void main(String[] args) {
//创建对象实例
AA aa = new AA();
//创建子类对象实例,父类也会被加载,而且父类先被加载
AA aa2 = new AA();
//使用类的静态成员
System.out.println(Cat.n1);
//static代码块,是在类加载时,执行的,而且只会执行一次。
DD dd = new DD();
DD dd1 = new DD();
System.out.println(DD.n1); //静态模块一定会执行
}
}
class DD{
public static int n1 = 8888; //静态属性
//静态代码块
static {
System.out.println("DD的静态代码块1被执行");
}
//普通代码块,在 new 对象时,被调用,而且是每创建一个对象,就调用一次
{
System.out.println("DD的普通代码块...");
}
}
class Animal{
//静态代码块
static {
System.out.println("Animal的静态代码1被执行...");
}
}
class Cat extends Animal{
public static int n1 = 999;//静态属性
//静态代码块
static {
System.out.println("Cat的静态代码1被执行...");
}
}
class BB{
//静态代码块
static {
System.out.println("BB的静态代码块1被执行");
}
}
class AA extends BB{
static {
System.out.println("AA的静态代码1被执行");
}
}
运行结果

【创建一个对象时,在一个类中的调用顺序】
举个栗子
package com.dingjiaxiong.codeblock_;
/**
* ClassName: CodeBlockDetail02
* date: 2022/9/3 17:17
*
* @author DingJiaxiong
*/
public class CodeBlockDetail02 {
public static void main(String[] args) {
A a = new A();
}
}
class A{
//普通代码块
{
System.out.println("A 普通代码块01");
}
//普通属性的初始化
private int n2 = getN2();
//静态代码块
static {
System.out.println("A 静态代码块01");
}
//静态属性的初始化
private static int n1 = getN1();
public static int getN1(){
System.out.println("getN1被调用");
return 100;
}
public static int getN2(){
System.out.println("getN2被调用");
return 200;
}
//无参构造器
public A(){
System.out.println("A() 构造器被调用");
}
}
运行结果

【构造器的最前面其实隐含了super()和调用普通代码块】
举个栗子
package com.dingjiaxiong.codeblock_;
/**
* ClassName: CodeBlockDetail03
* date: 2022/9/3 17:23
*
* @author DingJiaxiong
*/
public class CodeBlockDetail03 {
public static void main(String[] args) {
new BBB();
}
}
class AAA{ //父类
{
System.out.println("AAA的普通代码块");
}
public AAA() {
System.out.println("AAA() 构造器被调用");
}
}
class BBB extends AAA{
{
System.out.println("BBB的普通代码块");
}
public BBB() {
System.out.println("BBB()构造器被调用");
}
}
运行结果

【创建一个子类对象时(继承关系),他们的静态代码块、静态属性初始化、普通代码块、普通属性初始化、构造方法的调用顺序】
静态代码块只能直接调用静态成员(静态属性和静态方法),普通代码块可以调用任意成员。
举个栗子
package com.dingjiaxiong.codeblock_;
/**
* ClassName: CodeBlockDetail04
* date: 2022/9/3 17:28
*
* @author DingJiaxiong
*/
public class CodeBlockDetail04 {
public static void main(String[] args) {
new B02();
new C02();
}
}
class A02{ //父类
private static int n1 = getVal01(); //静态属性初始化
static {
System.out.println("A02的一个静态代码块...");
}
{
System.out.println("A02的第一个普通代码块...");
}
public int n3 = getVal02(); //普通属性初始化
public static int getVal01(){
System.out.println("getVal01");
return 10;
}
public int getVal02(){
System.out.println("getVal02");
return 10;
}
public A02(){
System.out.println("A02的构造器");
}
}
class C02{
private int n1 = 100;
private static int n2 = 200;
private void m1(){
}
private static void m2(){
}
static {
//静态代码块,只能调用静态成员
System.out.println(n2);
m2();
}
{
//普通代码块,可以使用任意成员
System.out.println(n1);
System.out.println(n2);
m1();
m2();
}
}
class B02 extends A02{
private static int n3 = getVal03();
static {
System.out.println("B02的一个静态代码块...");
}
public int n5 = getVal04();
{
System.out.println("B02的一个普通代码块...");
}
private static int getVal03() {
System.out.println("getVal03");
return 10;
}
public int getVal04(){
System.out.println("getVal04");
return 10;
}
public B02() {
System.out.println("B02的构造器");
}
}
运行结果
