java面向对象18 代码块的使用

/*

  • 类成员之代码块
  • 代码块也叫初始化块,作用是对Java类或对象进行初始化
  • 一个类中代码块若有修饰符,则只能被static修饰,称为静态代码块(static block),没有使用static修饰的,为非静态代码块。
  • 静态代码块
    1. 可以有输出语句。
    1. 可以对类的属性、类的声明进行初始化操作。
    1. 不可以对非静态的属性初始化。即:不可以调用非静态的属性和方法。
    1. 若有多个静态的代码块,那么按照从上到下的顺序依次执行。
    1. 静态代码块的执行要先于非静态代码块。
    1. 静态代码块随着类的加载而执行,且只执行一次。
  • 非静态代码块
    1. 可以有输出语句。
    1. 可以对类的属性、类的声明进行初始化操作。
    1. 除了调用非静态的结构外,还可以调用静态的变量或方法。
    1. 若有多个非静态的代码块,那么按照从上到下的顺序依次执行。
    1. 每次创建对象的时候,都会执行一次。且先于构造器执行。
  • 子父类的情况:子类的对象创建时,先加载父类,会先执行父类中的静态代码块,再执行父类中的非静态代 码块,再执行父类的构造器。最后执行子类的非静态代码块,再执行子类的构造器。
  • 属性赋值的先后顺序:
  • 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值