/*
- 类成员之代码块
- 代码块也叫初始化块,作用是对Java类或对象进行初始化
- 一个类中代码块若有修饰符,则只能被static修饰,称为静态代码块(static block),没有使用static修饰的,为非静态代码块。
- 静态代码块
-
- 可以有输出语句。
-
- 可以对类的属性、类的声明进行初始化操作。
-
- 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
-
- 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
-
- 静态代码块的执行要先于非静态代码块。
-
- 静态代码块随着类的加载而执行,且只执行一次。
- 非静态代码块
-
- 可以有输出语句。
-
- 可以对类的属性、类的声明进行初始化操作。
-
- 除了调用非静态的结构外,还可以调用静态的变量或方法。
-
- 若有多个非静态的代码块,那么按照从上到下的顺序依次执行。
-
- 每次创建对象的时候,都会执行一次。且先于构造器执行。
- 子父类的情况:子类的对象创建时,先加载父类,会先执行父类中的静态代码块,再执行父类中的非静态代 码块,再执行父类的构造器。最后执行子类的非静态代码块,再执行子类的构造器。
- 属性赋值的先后顺序:
- 1,默认初始化
- 2,显示初始化,3,代码块中赋值(对于非静态属性2,3的顺序看先后位置,
- 代码块写在属性之前则代码块赋值先执行,显示初始化赋值后执行。
- 对于静态属性最后还是输出代码块中的赋值)
- 4,构造器中赋值
- 5,有对象后,通过对象调用属性或者方法来赋值
*/
package object_chapter2;
public class Object_Block {
static {
System.out.println("*******");//执行main方法前先加载类,会执行类的静态代码块
}
public static void main(String[] args) {
int i = Block.argus;//调用Block类的静态属性,Block类加载,执行一次static代码块中的语句
System.out.println(i);
Block b1 = new Block();//创建Block类的对象,非静态代码块执行一次,静态代码块执行过一次,不再执行
System.out.println(b1.toString());
Block b2 = new Block();//再次创建Block类的对象,非静态代码块再次执行一次,静态代码块执行过一次,不再执行
System.out.println(b2.toString());
i = Block.argus;
System.out.println(i);
System.out.println("*******");
BlockSonKid s1 = new BlockSonKid();
//先输出父类和子类的静态代码块,在输出父类的父类的代码块和构造器,
//再输出父类的代码块和构造器,再输出子类的代码块和构造器
System.out.println("*******");
BlockSonKid s2 = new BlockSonKid();
System.out.println(s2.number);//输出代码块赋值
System.out.println(s2.argus);//输出显示初始化赋值
System.out.println("*******");
BlockSonKid s3 = new BlockSonKid(77,16.16);
System.out.println(s3.number);//输出构造器赋值
System.out.println(s3.argus);//输出构造器赋值
}
}
class Block{
//属性
String name = "KK";
int number = -1;
static int argus;
//构造器
public Block() {
argus++;
}
public Block(String name, int number) {
this();
this.name = name;
this.number = number;
}
//方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public static int getArgus() {
return argus;
}
public static void setArgus(int argus) {
Block.argus = argus;
}
//特别方法
@Override
public String toString() {
return "Block [name=" + name + ", number=" + number + ", argus=" + argus + "]";
}
void say() {
System.out.println("白衣天使");
}
static void speak() {
System.out.println("奥利给");
}
//代码块
static {
System.out.println("全民战疫");
argus = 1000;
}
static {
System.out.println("自我隔离");
speak();
argus = 1001;
}
{
System.out.println("武汉加油");
name = "AA";
number = 1;
}
{
System.out.println("中国加油");
number = 2;
argus = 0;
say();
speak();
}
}
class BlockSon extends Block{
static {
System.out.println("一方有难");
}
{
System.out.println("战疫必胜");
}
BlockSon(){
System.out.println("子类构造器");
}
}
class BlockSonKid extends BlockSon{
BlockSonKid(int num,double argus) {
this();
this.number = num;
this.argus = argus;
}
static {
System.out.println("八方支援");
number = 11;
}
{
System.out.println("保卫家园");
number = 15;
argus = 11.11;
}
BlockSonKid(){
System.out.println("孙类构造器");
}
static int number = 12;
double argus = 12.12;
}