广州市天河区建设局网站,建设企业网站e路护航官网企业端,门户网站构建,wordpress建站优化代码块 SE.10.0…02.28
非静态普通代码块#xff1a;定义在方法内部的代码块#xff0c;不用任何关键字修饰#xff0c;又名构造代码块、实例代码块 静态代码块#xff1a;用static修饰的代码块
非静态代码块
public class Test {public static void main(String[] args…代码块 SE.10.0…02.28
非静态普通代码块定义在方法内部的代码块不用任何关键字修饰又名构造代码块、实例代码块 静态代码块用static修饰的代码块
非静态代码块
public class Test {public static void main(String[] args) {{//普通代码块int a 10;System.out.println(a);//打印10}int a 100;System.out.println(a);//打印0100}
}构造代码块实例代码块非静态代码块
class Student {private static String classroom 八年级二班;//班级private String name;//姓名private int age;//年龄public Student(String name, int age) {this.name name;this.age age;}{System.out.println(构造代码块/非静态代码块/实例代码块一般用于初始化非静态的对象属性);System.out.println(而且在顺序上他会比构造方法先被编译器调用);name baixian;//所以这里对象实例化后的name应该是白线因为构造方法最后运行}
}public class Test {public static void main(String[] args) {Student student new Student(白线,18);}
}
但是如果我的构造方法是空的或者我没有写构造方法那么实例化就赋值的就是我构造代码块里面的值
class Student {private static String classroom 八年级二班;//班级private String name;//姓名private int age;//年龄public Student() {}{System.out.println(构造代码块/非静态代码块哦/实例代码块吗一般用于初始化非静态的对象属性);System.out.println(如果构造代码为空那么实例化的值就会优先选择这);name baixian;//所以这里对象实例化后的name应该是baixian}public String getName() {return name;}}public class Test {public static void main(String[] args) {Student student new Student();System.out.println(student.getName());}
}那么如果定义类的成员变量的时候初始就附了值构造代码块里也赋了值那么究竟实例化成哪一个的
class Student {private String classroom 八年级二班;//班级private String name 白线;//姓名private int age;//年龄{System.out.println(无论是一开始赋值还是构造代码块赋值本身都是非静态的所以谁最后执行谁就是实例化都的值);this.name baixian;//所以这里对象实例化后的name应该是白线}public Student() {}public String getName() {return name;}}public class Test {public static void main(String[] args) {Student student new Student();System.out.println(student.getName());}
}实际底层是编译器将构造代码块非静态代码块全部拷贝到构造方法里面并且放在最前面。这样就能更深刻理解是这样的一个执行顺序了。
静态代码块
只要类被加载就会先执行静态代码块并且无论实例化几次静态代码块只会被执行一次
class Student {static {System.out.println(执行静态代码块);}private String classroom 八年级二班;//班级private String name 白线;//姓名private int age;//年龄{System.out.println(执行非静态代码块);}public Student() {}}public class Test {public static void main(String[] args) {Student student1 new Student();Student student2 new Student();}
}在继承背景下的静态代码块与非静态代码块构造方法的执行顺序
看下面的代码思考123456这六行代码的执行顺序
class Animal {static {System.out.println(Animal static{});//1}public String name;public int age;{System.out.println(Animal{});//2}public Animal() {System.out.println(Animal());//3}
}class Dog extends Animal {static {System.out.println(Dog static{});//4}{System.out.println(Dod{});//4}public Dog() {System.out.println(Dog());//6}public void wangwang() {System.out.println(name 汪汪叫);//5}
}public class Test {public static void main(String[] args) {Dog dog new Dog();}
}1、父类静态代码块优先于子类静态代码块执行且是最早执行 2、父类实例代码块和父类构造方法紧接着执行 3、子类的实例代码块和子类构造方法紧接着再执行 4、第二次实例化子类对象时父类和子类的静态代码块都将不会再执行