代码块01
- 一、介绍
- 二、语法
- 三、好处
- 举例
- 四、使用细节
- 五、练习
- 题1
- 题2
一、介绍
代码块又称为初始化块,属于类中的成员[即是类的一部分],类似于方法,将逻辑语句封装在方法体中,通过包围起来。
但和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是加载类时,或创建对象时隐式调用。
二、语法
[修饰符] {
代码
};
注意:修饰符可选,要写的话,也只能写static。
- 修饰符可选,要写的话,也只能写static。
- 代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,叫普通代码块。
- 逻辑语句可以为任何逻辑语句(输入、输出、方法调用、循环、判断等)
- 分号 ; 号可以写上,也可以省略。
三、好处
- 相当于另外一种形式的构造器(对构造器的补充机制),可以做初始化的操作。
- 如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的重用性
- 代码块调用的顺序优先于构造器
举例
代码块的快速入门 CodeBlock01.java
class Movie {
private String name;
private double price;
private String director;
// 三个构造器->构成重载
public Movie(String name) {
System.out.println("电影屏幕打开……");
System.out.println("广告开始……");
System.out.println("电影正式开始……");
this.name = name;
}
public Movie(String name, double price) {
System.out.println("电影屏幕打开……");
System.out.println("广告开始……");
System.out.println("电影正式开始……");
this.name = name;
this.price = price;
}
public Movie(String name, double price, String director) {
System.out.println("电影屏幕打开……");
System.out.println("广告开始……");
System.out.println("电影正式开始……");
this.name = name;
this.price = price;
this.director = director;
}
}
可以看到在每一个构造器中都有同样的代码
把相同的语句放在一个代码块中即可
{
System.out.println("电影屏幕打开……");
System.out.println("广告开始……");
System.out.println("电影正式开始……");
}
//这样不管调用哪一个构造器创建对象,都会先调用代码块
public Movie(String name) {
System.out.println("public Movie(String name)");
this.name = name;
}
public Movie(String name, double price) {
System.out.println("public Movie(String name, double price)");
this.name = name;
this.price = price;
}
public Movie(String name, double price, String director) {
System.out.println("public Movie(String name, double price, String director)");
this.name = name;
this.price = price;
this.director = director;
}
(1) 不管调用哪个构造器创建对象,都会先调用代码块
(2) 代码块调用的顺序优先于构造器
四、使用细节
见上篇
五、练习
做题前先看代码块的使用细节。
题1
下面的代码输出什么?
class Person {
public static int total;
static {
total = 100;
System.out.println("in static block!");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("total = "+Person.total);
System.out.println("total = "+ Person.total);
}
}
我的答案:
in static block!
total = 100
total = 100
正确。
分析:① 直接访问类的静态成员(变量和方法)会使得类加载。类加载的时候静态代码块&静态变量初始化会执行。
② 静态代码块只在类加载的时候执行一次。
题2
public class CodeBlockExercise02 {
public static void main(String str[])
{
Test a = new Test();//无参构造器
}
}
class Sample
{
Sample(String s)
{
System.out.println(s);
}
Sample()
{
System.out.println("Sample默认构造函数被调用");
}
}
class Test{
Sample sam1=new Sample("sam1成员初始化");//
static Sample sam=new Sample("静态成员sam初始化 ");//
static{
System.out.println("static块执行");//
if(sam==null)System.out.println("sam is null");
}
Test()//构造器
{
System.out.println("Test默认构造函数被调用");//
}
}
我的答案:
(类加载)
静态成员sam初始化
static块执行
(new)
sam1成员初始化(普通变量)
Test默认构造函数被调用(构造器)
正确。
本笔记是对韩顺平老师的Java课程做出的梳理。方便本人和观看者进行复习。
课程请见: https://www.bilibili.com/video/BV1fh411y7R8/?spm_id_from=333.999.0.0&vd_source=ceab44fb5c1365a19cb488ab650bab03