1.基本介绍
基本语法
代码块的好处
1.相当于另外一种形式的构造器((对构造器的补充机制),可以用来做初始化的操作
2.场景:如果多个构造器中都有重复的语句,可以抽取到初始化块中,提高代码的复用性
package codeblock;
public class code1 {
public static void main(String[] args) {
new Movie();
System.out.println("----------------------");
new Movie("tom");
System.out.println("----------------------");
new Movie("jack","jim");
System.out.println("----------------------");
new Movie("jacky","tim",20);
}
}
class Movie{
private String name;
private String director;
private double price;
{
System.out.println("电影开始");
System.out.println("准备观看");
}
public Movie() {
System.out.println("无参构造器被调用");
}
public Movie(String name) {
System.out.println("Movie(String name)被调用");
this.name = name;
}
public Movie(String name, String director) {
System.out.println("Movie(String name,String director)被调用");
this.name = name;
this.director = director;
}
public Movie(String name, String director, double price) {
System.out.println("Movie(String name,String director,double price)被调用");
this.name = name;
this.director = director;
this.price = price;
}
}
执行结果
如果构造器当中有相同的语句,我们可以把这些语句放在代码块中,不然会显得代码冗余
这样子不管我们调用哪一个构造器,创建对象,都会先调用代码块的内容
代码块调用顺序优先于构造器
2.代码块使用的注意事项
代码块先执行,构造器再执行
package codeblock;
public class code2 {
public static void main(String[] args) {
new A();
}
}
class A{
static {
System.out.println("静态代码块A执行");
}
{
System.out.println("代码块A执行");
}
public A(){
System.out.println("构造器A执行");
}
}
执行结果:
静态代码块A执行
代码块A执行
构造器A执行
package com.zyh.codeblock;
/**
* @author zengyihong
* @create 2022--02--20 9:22
*/
public class code2 {
public static void main(String[] args) {
//new A();
new B();
}
}
class A{
static {
System.out.println("静态代码块A执行");
}
{
System.out.println("代码块A执行");
}
public A(){
System.out.println("构造器A执行");
}
}
class B extends A{
static {
System.out.println("静态代码块B执行");
}
{
System.out.println("代码块B执行");
}
}
执行结果:
静态代码块随着类的加载而加载,并且只会加载一次,代码块随着对象的创建,每创建一次,都会调用一次
package codeblock;
public class code2 {
public static void main(String[] args) {
//new A();
new B();
System.out.println("-------------------");
new B();
}
}
class A{
static {
System.out.println("静态代码块A执行");
}
{
System.out.println("代码块A执行");
}
public A(){
System.out.println("构造器A执行");
}
}
class B extends A{
static {
System.out.println("静态代码块B执行");
}
{
System.out.println("代码块B执行");
}
}
package codeblock;
public class code3 {
public static void main(String[] args) {
D d = new D();// (1) A 静态代码块 01 (2) getN1 被调用...(3)A 普通代码块 01(4)getN2 被调用...(5)A() 构造器被调
}
}
class D {
//普通代码块
{
System.out.println("A 普通代码块 01");
}
private int n2 = getN2();//普通属性的初始化
private static int n1 = getN1();
static { //静态代码块
System.out.println("D 静态代码块 01");
}
//静态属性的初始化
public static int getN1() {
System.out.println("getN1 被调用...");
return 100;
}
public int getN2() { //普通方法/非静态方法
System.out.println("getN2 被调用...");
return 200;
}
//无参构造器
public D() {
System.out.println("A() 构造器被调用");
}
}
package codeblock;
public class CodeBlockDetail03 {
public static void main(String[] args) {
//(1)AAA 的普通代码块(2)AAA() 构造器被调用(3)BBB 的普通代码块(4)BBB() 构造器被调用 }
new BBB();
}
}
class AAA { //父类 Object
{
System.out.println("AAA 的普通代码块");
}
public AAA() {
//(1)super()
//(2)调用本类的普通代码块
System.out.println("AAA() 构造器被调用....");
}
}
class BBB extends AAA {
{
System.out.println("BBB 的普通代码块...");
}
public BBB() {
//(1)super()
//(2)调用本类的普通代码块
System.out.println("BBB() 构造器被调用....");
}
}
静态代码块只能调用静态属性,静态方法,而普通代码块可以调用任何成员
注:本文是学习韩顺平老师的课程所写