代码块
10.3.1 基本介绍
![](https://img-blog.csdnimg.cn/img_convert/7c06d2be19ef492d8dbd56aad3a54fd0.png)
10.3.2 基本语法
![](https://img-blog.csdnimg.cn/img_convert/a226d1a139f14ff68fc4426293dc7d9b.png)
10.3.3 代码块的好处和案例演示
![](https://img-blog.csdnimg.cn/img_convert/e9b82c6f84f7430090ddf296243775ca.png)
==小结:==
1、我们可以把相同的语句,放入到一个代码块中
2、这样当我们不管调用哪个构造器,创建对象,都会先调用代码块的内容
3、代码块调用的顺序优先于构造器
package SeniorJava;
public class CodeBlock01
{
public static void main(String[] args)
{
Movie movie01 = new Movie("皮卡丘大战变形金刚4");
Movie movie02 = new Movie("流浪的路易十六的头颅2", 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("电影屏幕打开...");
// System.out.println("广告开始...");
// System.out.println("电影正式开始...");
System.out.println("Movie(String name)被调用");
this.name = name;
}
public Movie(String name, double price) {
// System.out.println("电影屏幕打开...");
// System.out.println("广告开始...");
// System.out.println("电影正式开始...");
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("电影屏幕打开...");
// System.out.println("广告开始...");
// System.out.println("电影正式开始...");
System.out.println("Movie(String name, double price, String director)被调用");
this.name = name;
this.price = price;
this.director = director;
}
}
10.3.4 代码块使用注意事项和细节讨论
![](https://img-blog.csdnimg.cn/img_convert/b6936881b76548d6909732a503beb20e.png)
package SeniorJava;
public class CodeBlockDetail01
{
public static void main(String[] args)
{
//类被加载的情况举例
//1. 创建对象实例时(new)
AA aa = new AA();
//2. 创建子类对象实例,父类也会被加载, 而且,父类先被加载,子类后被加载
AA aa2 = new AA();
//3. 使用类的静态成员时(静态属性,静态方法)
System.out.println(Cat.n1);
//static 代码块,是在类加载时,执行的,而且只会执行一次.
DD dd = new DD();
DD dd01 = new DD();
//普通的代码块,在创建对象实例时,会被隐式的调用。
// 被创建一次,就会调用一次。
// 如果只是使用类的静态成员时,普通代码块并不会执行
System.out.println(DD.n2);//静态模块块一定会执行
}
}
class AA extends BB//继承的本质:先加载父类,再加载子类
{
//静态代码块
static
{
System.out.println("AA的静态代码1被执行...");
}
}
class BB//继承的本质:先加载父类,再加载子类
{
//静态代码块
static
{
System.out.println("BB的静态代码1被执行...");
}
}
class Cat
{
public static int n1 = 999;
static
{
System.out.println("Cat的静态代码1被执行...");
}
}
class DD
{
public static int n2 = 888;
static
{
System.out.println("DD的静态代码1被执行...");
}
//普通代码块, 在 new 对象时被调用,而且是每创建一个对象,就调用一次
//和类是否加载没有关系
{
System.out.println("DD的普通代码被执行...");
}
}
![](https://img-blog.csdnimg.cn/img_convert/b091501beaf34051a9a037a36ef58b6a.png)
小结:
==1、默认初始化>变量初始化赋值>普通代码块>构造器赋值==
==2、先静态,后普通,其次看顺序==
==3、静态>普通>构造器==
package SeniorJava;
public class CodeBlockDetail02
{
public static void main(String[] args) {
AAA a = new AAA();
}
}
class AAA
{
//静态属性的优先级与静态代码块一样,但由于静态属性先写在前面,
//所以先调用静态属性,也就是说先调用 getN1()
//静态属性的初始化
private int n2 =getN2() ;
//普通代码块
{
System.out.println("AAA 普通代码块被调用...");
}
//静态代码块
static
{
System.out.println("AAA 静态代码块被调用...");
}
private static int n1 =getN1() ;
public static int getN1()
{
System.out.println("getN1()被调用...");
return 100;
}
public int getN2()
{
System.out.println("getN2()被调用...");
return 200;
}
//无参构造器
public AAA() {
System.out.println("AAA() 构造器被调用");
}
}
![](https://img-blog.csdnimg.cn/img_convert/7b5a5fe364c440e2b342e728932b360a.png)
==如果说父类和子类都有静态变量时,调用子类静态变量,父类先静态、普通、构造器,然后再到子类的==
package SeniorJava;
public class CodeBlockDetail03
{
public static void main(String[] args) {
BBBB bbbb = new BBBB();
}
}
class AAAA
{
{
System.out.println("AAAA 普通代码块被调用");
}
public AAAA()
{
System.out.println("AAAA 构造器被调用");
}
}
class BBBB extends AAAA
{
{
System.out.println("BBBB 普通代码块被调用");
}
public BBBB()
{
System.out.println("BBBB 构造器被调用");
}
}
![](https://img-blog.csdnimg.cn/img_convert/da14319460c04680b2af8259ed9d8182.png)
package SeniorJava;
public class CodeBlockDetail04 {
public static void main(String[] args) {
//老师说明
//(1) 进行类的加载
//1.1 先加载 父类 A02 1.2 再加载 B02
//(2) 创建对象
//2.1 从子类的构造器开始
//new B02();//对象
new C02();
}
}
class A02 { //父类
private static int n1 = getVal01();
static {
System.out.println("A02 的一个静态代码块..");//(2)
}
{
System.out.println("A02 的第一个普通代码块..");//(5)
}
public int n3 = getVal02();//普通属性的初始化
public static int getVal01() {
System.out.println("getVal01");//(1)
return 10;
}
public int getVal02() {
System.out.println("getVal02");//(6)
return 10;
}
public A02() {//构造器
//隐藏
//super()
//普通代码和普通属性的初始化...... System.out.println("A02 的构造器");//(7)
}
}
class C02 {
private int n1 = 100;
private static int n2 = 200;
private void m1() {
}
private static void m2() {
}
static {
//静态代码块,只能调用静态成员
//System.out.println(n1);错误
System.out.println(n2);//ok
//m1();//错误
m2();
}
{
//普通代码块,可以使用任意成员
System.out.println(n1);
System.out.println(n2);//ok
m1();
m2();
}
}
class B02 extends A02 { //
private static int n3 = getVal03();
static {
System.out.println("B02 的一个静态代码块..");//(4)
}
public int n5 = getVal04();
{
System.out.println("B02 的第一个普通代码块..");//(9)
}
public static int getVal03() {
System.out.println("getVal03");//(3)
return 10;
}
public int getVal04() {
System.out.println("getVal04");//(8)
return 10;
}
//一定要慢慢的去品.. public B02() {//构造器
//隐藏了
//super()
//普通代码块和普通属性的初始化... System.out.println("B02 的构造器");//(10)
// TODO Auto-generated constructor stub
}
10.3.5 课堂练习题
第一题
先执行了静态属性,不过没输出,后面静态代码块里才输出
package SeniorJava;
public class CodeBlockExercise01 {
public static void main(String[] args) {
System.out.println("total = " + Person.total); //100
System.out.println("total = " + Person.total); //100
}
}
class Person {
public static int total;//静态变量
static {//静态代码块
total = 100;
System.out.println("in static block!");//(1)
}
}//先执行了静态属性,不过没输出,后面静态代码块里才输出