1、先执行静态代码块
点击查看代码
public class ClassTest {
static{
System.out.println("静态代码执行了");
}
public static void main(String[] args) {
System.out.println("main方法执行了");
}
}
2、类中定义静态成员变量,会先创建对象
点击查看代码
public class ClassTest {
static User user=new User();
static{
System.out.println("静态代码执行了");
}
public static void main(String[] args) {
System.out.println("main方法执行了");
}
}
class User{
public User() {
System.out.println("user无参构造执行了");
}
}
3、如果是非静态代码块和非静态成员变量,不执行
点击查看代码
public class ClassTest {
User user=new User();
{
System.out.println("静态代码执行了");
}
public static void main(String[] args) {
System.out.println("main方法执行了");
}
}
class User{
public User() {
System.out.println("user无参构造执行了");
}
}
只有创建了ClassTest对象,非静态代码块和非静态成员变量才会执行,new 了几次对象就会执行多少次,执行的顺序跟代码位置有关
点击查看代码
public class ClassTest {
User user=new User();
{
System.out.println("代码块执行了");
}
public static void main(String[] args) {
System.out.println("main方法执行了");
ClassTest classTest = new ClassTest();
ClassTest classTest2 = new ClassTest();
}
}
class User{
public User() {
System.out.println("user无参构造执行了");
}
}
4、如果同时存在静态代码块和非静态代码块,以及静态成员变量和非静态成员变量,先执行静态的对象,并且只执行一次,再执行非静态的对象(创建对象),创建多少个对象就会执行多少次
点击查看代码
public class ClassTest {
User user=new User();
{
System.out.println("代码块执行了");
}
static {
System.out.println("静态代码块执行了");
}
static User user1=new User();
public static void main(String[] args) {
System.out.println("main方法执行了");
ClassTest classTest = new ClassTest();
ClassTest classTest2 = new ClassTest();
}
}
class User{
public User() {
System.out.println("user无参构造执行了");
}
}
点击查看代码
加入父子级
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.sayHello();
((Parent)child).sayHello();
}
}
class Stub{
public Stub(String str){
System.out.println(str + "-object creat");
}
}
class Parent{
static Stub parentStaticObject=new Stub("parent static object");
static {
System.out.println("parent static code");
}
{
System.out.println("parent code");
}
Stub parentStub=new Stub("parent object");
Stub stub;
public Parent() {
System.out.println("parent constructor");
stub=new Stub("parent constructor create");
}
public void sayHello(){
System.out.println("hello from parent");
}
}
class Child extends Parent{
static Stub childStaticObject=new Stub("child static object");
static {
System.out.println("child static code");
}
{
System.out.println("child code");
}
Stub parentStub=new Stub("child object");
Stub stub;
public Child() {
System.out.println("child constructor");
stub=new Stub("child constructor create");
}
public void sayHello(){
System.out.println("hello from child");
}
}
执行流程:
1.首先会加载Parent,则Parent里的静态代码块和静态成员变量会优先执行(顺序依据代码出现的先后)
2.加载Chlid,则Chlid里的静态代码块和静态成员变量会优先执行(顺序依据代码出现的先后)
3.类加载完成后,创建对象,先创建Parent对象,创建对象之前,先创建对象的资源
4.执行Parent构造器,完成对象的创建
5.创建Child对象之前,先创建对象的资源
6.执行Child构造器,完成对象的创建
7.执行sayhello的方法
总结:父类静态字段->父类静态代码块->子类静态字段->子类静态代码块->父类成员变量和非静态块(顺序加载)->父类构造函数->子类成员变量和非静态块(顺序加载)->子类构造函数