代码块的使用

代码块的使用

	/*类的内部成员之四:代码块
	 * 1. 代码块的作用:用来初始化类、对象
	 * 2. 代码块如果有修饰的话,只能使用static.
	 * 3. 分类:静态代码块  vs 非静态代码块
	 * 
	 * 4. 静态代码块
	 * 	   >内部可以有输出语句
	 * 	   >随着类的加载而执行,而且只执行一次(重要)
	 * 	   >作用:初始化类的信息
	 * 	   >如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
	 * 	   >静态代码块的执行要优先于非静态代码块的执行
	 * 	   >静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
	 * 
	 * 5. 非静态代码块
	 * 		>内部可以有输出语句
	 * 		>随着对象的创建而执行
	 * 		>每创建一个对象,就执行一次非静态代码块
	 * 		>作用:可以在创建对象时,对对象的属性等进行初始化
	 * 		>如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
	 * 		>非静态代码块内可以调用静态的属性、静态的方法,或非静态的属性、非静态的方法
	 */
class Father {
//下面观察输出的顺序
	static {//静态代码块
		System.out.println("11111111111");
	}
	{//普通代码块(非静态代码块)
		System.out.println("22222222222");
	}

	public Father() {
		System.out.println("33333333333");
	
	}

}

public class Son extends Father {
	static {
		System.out.println("44444444444");
	}
	{
		System.out.println("55555555555");
	}
	public Son() {
		System.out.println("66666666666");
	}

//总结:由父及子 静态先行
	public static void main(String[] args) { 
		//注意main方法下的每一条语句的先后运行 需要提前干什么
		System.out.println("77777777777");
        //Son类加载 -> Father类加载 -> Object类加载 -> Object类中没有静态代码块 ->Father类执行静态代码块 -> Son类执行静态代码块 -> 下一行
        //加载之后的类不会再次执行静态代码块中的内容
        //可以看到静态代码块会优先于main方法运行
            //下面的自己想
		System.out.println("************************");
		new Son();
		System.out.println("************************");
		new Son();
		System.out.println("************************");
		new Father();
	}
        //在JDK1.7之前Java一直存在一个Bug,如下
        public class AA{
			static {
			System.out.println("奥利给");
			System.exit(1);
        	}
        }
        //没有main方法,竟然输出了  奥利给!!!!!
        
	/*
	 这里给出结果
		11111111111
		44444444444
		77777777777
		************************
		22222222222
		33333333333
		55555555555
		66666666666
		************************
		22222222222
		33333333333
		55555555555
		66666666666
		************************
		22222222222
		33333333333
	
	 */
}
posted @ 2021-01-21 12:19  QU头  阅读(133)  评论(0编辑  收藏  举报