首页 > 其他分享 >类中代码执行的顺序

类中代码执行的顺序

时间:2024-05-27 17:00:38浏览次数:27  
标签:顺序 静态 System static 代码执行 println public 类中 out

1、先执行静态代码块

点击查看代码
public class ClassTest {

    static{
        System.out.println("静态代码执行了");
    }

    public static void main(String[] args) {
        System.out.println("main方法执行了");
    }
}
![](/i/l/?n=24&i=blog/3413037/202405/3413037-20240527163903068-972407021.png)

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无参构造执行了");
    }
}
![](/i/l/?n=24&i=blog/3413037/202405/3413037-20240527164102970-1203553470.png)

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无参构造执行了");
    }
}
![](/i/l/?n=24&i=blog/3413037/202405/3413037-20240527164209067-963346583.png)

只有创建了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无参构造执行了");
    }
}
![](/i/l/?n=24&i=blog/3413037/202405/3413037-20240527164425305-1401906199.png)

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无参构造执行了");
    }
}
![](/i/l/?n=24&i=blog/3413037/202405/3413037-20240527164625294-725347159.png)
点击查看代码
加入父子级
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");
    }
}
![](/i/l/?n=24&i=blog/3413037/202405/3413037-20240527164813006-1413381649.png)

执行流程:
1.首先会加载Parent,则Parent里的静态代码块和静态成员变量会优先执行(顺序依据代码出现的先后)

2.加载Chlid,则Chlid里的静态代码块和静态成员变量会优先执行(顺序依据代码出现的先后)

3.类加载完成后,创建对象,先创建Parent对象,创建对象之前,先创建对象的资源

4.执行Parent构造器,完成对象的创建

5.创建Child对象之前,先创建对象的资源

6.执行Child构造器,完成对象的创建

7.执行sayhello的方法
总结:父类静态字段->父类静态代码块->子类静态字段->子类静态代码块->父类成员变量和非静态块(顺序加载)->父类构造函数->子类成员变量和非静态块(顺序加载)->子类构造函数

标签:顺序,静态,System,static,代码执行,println,public,类中,out
From: https://www.cnblogs.com/yumeixiaosheng/p/18215977

相关文章

  • 类中方法作为装饰器装饰类中方法
    classDataBase:""""""def__init__(self,setting:Dict=None):""""""self.process_count=0@staticmethoddefcounter_decorator(func:Callable)......
  • git clone 远程代码执行漏洞(CVE-2024-32002) 升级
    接到提醒说git有个漏洞,Gitclone远程代码执行漏洞(CVE-2024-32002)看了看,说是git的Symlinks模块存在高危漏洞,攻击者可以利用该漏洞执行任意代码,导致服务器失陷。以下这些版本都有影响0<git<2.39.42.40.0≤git<2.40.22.41.0≤git<2.41.12.42.0≤git<2.42.......
  • 队列——顺序存储
    核心思路:1、使用顺序存储的方式定义队列时,使用数组存储队列元素,然后声明两个int类型的指针——rear和front,分别指向队尾元素的下一个位置和队头元素的位置。2、初始化队列时,队列的首尾指针都指向0。3、当队列为空时,队尾和队头指针指向同一个位置(不一定等于0)。4、队满条......
  • java顺序结构,循环结构,选择结构,增强for循环,switch穿透现象,值匹配
    顺序结构inta=10;intb=20;intc=a+b;System.out.println(c);//按顺序执行循环结构一、For循环格式for(初始化语句;循环条件;迭代语句){循环语句体;}for(inti=0;i<5;i++){System.out.println("我爱你");}int[]is={1,2,3};for(inti=0;i<is.l......
  • 栈和队列4 顺序栈的应用实例(迷宫求解)
    #include<stdio.h>#include<stdlib.h>#defineINITSIZE100#defineINCREAMENT10#defineM8#defineN8typedefstruct{   intx;   inty;}PosType;typedefstruct{   intord;   PosTypeseat;   intdi;}SElemType;typedefstructS......
  • 数据结构顺序表实现通讯录
    目录1.前言:2.通讯录项目的创建3.通讯录的实现3.1通讯录的初始化3.2通讯录的销毁3.3通讯录添加数据3.4通讯录查找数据3.5通讯录展示数据  3.6通讯录删除数据 3.7通讯录修改数据 4.通讯录完整代码4.1test.c4.2SeqList.h4.3SeqList.c 4.4Contac......
  • 温州-顺序-2
    第一部分。中央及部委关于数据要素的政策。政策1。《中华人民共和国国民经济和社会发展第十三个五年规划纲要》。该政策由国务院于2016年03月发布。主要内容包括。第27章明确提出“实施国家大数据战略”,包括加快政府数据开放共享,促进大数据产业健康发展。政策2。《关于坚持和......
  • 温州-顺序
    第一部分。中央及部委关于数据要素的政策。政策1。《中华人民共和国国民经济和社会发展第十三个五年规划纲要》。该政策由国务院于2016年03月发布。主要内容包括。第27章明确提出“实施国家大数据战略”,包括加快政府数据开放共享,促进大数据产业健康发展。政策2。《关于坚持和......
  • 栈和队列1 顺序栈及基本操作实例(进制转换)
    #include<stdio.h>#include<stdlib.h>#defineINITSIZE100#defineINCREAMENT10 typedefstructSqStack{   int*data;   int*top;   intstacksize;}SqStack;voidInitStack(SqStack*L){   L->data=(int*)malloc(INITSIZE*siz......
  • C++类中封装指针函数
      classMyClass{public:voidfunc1(){//实现}voidfunc2(){//实现}//成员函数指针类型typedefvoid(MyClass::*MemberFuncPtr)();//一个成员函数指针成员变量MemberFuncPtrptrFunc;......