代码块和静态代码块
语法格式:
【修饰符】class 类名{
{//非静态代码块 }
static{//静态代码块}
}
什么时候执行代码块?
(1)静态代码块,在类初始化的时候执行,并且只执行一次
(2)非静态代码块,在实例初始化的时候执行,创建一个对象,执行一次,并且比构造方法要早
(成员变量:我们通常说的属性:)
(1)实例变量,大多数人在说成员变量时,一般他说的是实例变量
(2)类变量
public class TestBlock {
public static void main(String[] args) {
Init.test();//加载类Init到内存中初始化,需要执行一次静态代码块
Init.test();//方法每调用一次执行一次内容
Init.test();
}
}
class Init{
static {
System.out.println("静态代码块");
}
public static void test(){
System.out.println("静态方法");
}
}
结果为:
静态代码块
静态方法
静态方法
静态方法
public class TestBlock {
public static void main(String[] args) {
Init n1= new Init();//创建对象,需要将类加载到内存中,且优先于构造器,执行一次静态代码块初始化
Init n2= new Init();
Init n3 = new Init();
}
}
class Init{
public Init(){
System.out.println("构造器");
}
static {
System.out.println("静态代码块");
}
public static void test(){
System.out.println("静态方法");
}
}
执行结果为:
静态代码块
构造器
构造器
构造器
public class TestBlock {
public static void main(String[] args) {
Init.test();
}
}
class Init{
public Init(){
System.out.println("构造器");//只有创建对象才执行
}
static {//静态代码块
System.out.println("静态代码块");
}
public static void test(){
System.out.println("静态方法");
}
{//非静态代码块
System.out.println("非静态代码块");//只有创建对象才执行
}
}
执行结果为:
静态代码块
静态方法
public class TestBlock {
public static void main(String[] args) {
Init n1 = new Init();
Init n2 = new Init();
Init n3 = new Init();
}
}
class Init{
public Init(){
System.out.println("构造器");//只有创建对象才执行
}
static {
System.out.println("静态代码块");
}
public static void test(){
System.out.println("静态方法");
}
{
System.out.println("非静态代码块");//只有创建对象才执行
}
}
执行结果为:
静态代码块
非静态代码块
构造器
非静态代码块
构造器
非静态代码块
构造器
public class Demo01 {
public static void main(String[] args) {
System.out.println(A1.max);
}
}
class A1 extends A_Father{
public static final int max = 300;
//final修饰的常量不会发生类的初始化
//只有调用类的静态成员变量和静态方法 会发生类的初始化
static {
System.out.println("静态初始化A");
}
public A1(){
System.out.println("创建A类的对象");
}
public static void test(){
}
}
执行结果为:
300
++++++++++++++++++++++++++++++++++++++++++++++
类初始化
每一个类,编译器会自动生成一个<“clinit”>()称为类初始化方法
class—》initalize,方法体由下面两部分组成
(1)静态变量的显示赋值语句
(2)静态代码块中的语句
这两个部分,谁在上面谁先执行
public class TestClinit {
public static void main(String[] args) {
A a= new A();//会导致类初始化
}
}
class A{
private static int num= getNum();
static {
num++;
System.out.println(“静态代码块:num=”+num);
}
public static int getNum(){
num++;
System.out.println(“getNum,num=”+num);
return 10;
}
}
//执行结果为:
getNum,num=1
静态代码块:num=11
实例初始化