搜索
简帛阁>技术文章>java类中代码执行顺序

java类中代码执行顺序

java类中代码执行顺序

          首先,没有学java或者不知道类继承的,可以不用浪费时间乐,直接左上角,看多了有害。
          java的代码执行顺序是自上而下,从左到右,方法是以main方法为主方法(通常情况下,事实上很多时候也会不用主方法)。但是就像HTML中CSS有执行先后顺序一样,java中类的内容也是有先后执行顺序的。java中类的组成结构有主方法,代码块,构造函数,成员变量和函数,除此外还有静态和非静态修饰之分。看起来很繁复但是实际上是有规律可依循的。
         首先先创建一个demo:
         package exclass;

 

public class HelloWorld {

private int age;

private String name;

private String WorkNumber;

 

public HelloWorld(){}

public HelloWorld(String bb)

{

System.out.println("父类构造函数开始执行");

}

{

System.out.println("父类非静态代码块执行");

}

static{

System.out.println("父类静态代码块执行");

}

void run()

{

System.out.println("正常方法执行");

}

public int getAge(){

return age;

}

public void setAge(int age){

this.age=age;

}

public String getName(){

return name;

}

public void setName(String name){

this.name=name;

}

public String getWorkNumber()

{

return WorkNumber;

}

public void setWorkNumber(String WorkNumber)

{

this.WorkNumber=WorkNumber;

}

public static void main(String[] args){

System.out.println("main方法执行");

HelloWorld demo=new HelloWorld("bb");

demo.run();

}

 

}


执行结果如下图:图片
这张图我们可以看到顺序是:静态代码块 main方法 非静态代码块 构造方法(我口胡了,你们随意)
但是后来我分成两个类之后顺序又变了(这也是我为什么发日志的原因,以前都没注意这个),所以这个说说相当于是一个笔记性质,纯粹我放飞自我,请自带B数。
两个类的情况:
HelloWorld.class:

package exclass;

 

public class HelloWorld {

private int age;

private String name;

private String WorkNumber;

 

public HelloWorld(){}

public HelloWorld(String bb)

{

System.out.println("父类构造函数开始执行");

}

{

System.out.println("父类非静态代码块执行");

}

static{

System.out.println("父类静态代码块执行");

}

void run()

{

System.out.println("正常方法执行");

}

public int getAge(){

return age;

}

public void setAge(int age){

this.age=age;

}

public String getName(){

return name;

}

public void setName(String name){

this.name=name;

}

public String getWorkNumber()

{

return WorkNumber;

}

public void setWorkNumber(String WorkNumber)

{

this.WorkNumber=WorkNumber;

}

 

 

}

helloworld1.class:

package exclass;

 

public class helloworld1 {

public static void main(String[] args){

System.out.println("main方法执行");

HelloWorld HW=new HelloWorld("BB");

HW.run();

}

}

运行截图如下:
图片
 顺序变为: main方法 静态代码块 非静态代码块 构造方法 run方法
这个问题其实也不难理解,但是容易犯错误,首先第一个代码中我们是在类的内部用的主方法,对于一个类而言首先是对静态进行处理,然后再执行相应代码,因此优先执行了静态代码块然后执行main,而第二份代码中因为是其他类中通过对象去调用HelloWorld,因此是main置前,实际上是 (helloworld1的相关预先执行) main方法 静态代码块 非静态代码块 构造方法 run方法,两个代码都没得问题.

那么讲远一点,假设我们这有一个父类,一个子类。在子类执行的时候,父子类的处理顺序是什么呢?(SOLO父子局)
首先,子类数据是继承自父类的,因此在子类调用时会先调用父类,那么就很好理解了,放上如下代码:
HelloWorld.class:

package exclass;

 

public class HelloWorld {

public int age;

public String name;

public String WorkNumber;

 

public HelloWorld(){}

public HelloWorld(String bb)

{

System.out.println("父类构造方法开始执行");

}

{

System.out.println("父类非静态代码块执行");

}

static{

System.out.println("父类静态代码块执行");

}

void run()

{

System.out.println("父类一般方法执行");

}

public int getAge(){

return age;

}

public void setAge(int age){

this.age=age;

}

public String getName(){

return name;

}

public void setName(String name){

this.name=name;

}

public String getWorkNumber()

{

return WorkNumber;

}

public void setWorkNumber(String WorkNumber)

{

this.WorkNumber=WorkNumber;

}

 

 

}

chilclass.class:

package exclass;

 

public class chilclass extends HelloWorld{

public chilclass(){

System.out.println("子类构造方法执行");

}

static{

System.out.println("子类静态代码块执行");

}

{

System.out.println("子类非静态代码块执行");

}

@Override

void run(){

System.out.println("子类一般方法执行");

}

public static void main(String[] args){

System.out.println("main方法执行");

chilclass ch=new chilclass();

ch.run();

}

}
附上运行截图:图片 

 执行顺序为:父类静态代码块>子类静态代码块>当前主程序>父类非静态代码块>父类构造函数>子类非静态代码块>子类构造方法>子类一般方法,如果是外部调用chilclass那么main开头。结合父子类关系(你大爷还是你大爷)已经前面对比的结论其实可以直接推出,这里只是佐证。

总而言之......你以为是标准结局其实是还有情况哒!(非常想说的台词-1),我岸边黄某最喜欢对自以为是的猴子说NO(非常想说的台词-2)

一、通过子类调用了父类的静态字段,子类不会被初始化
二、类作为数组的组件类型不会触发类初始化
三、常量池引用也会导致不初始化类
用大白话讲:我从金库拿钱走金库还能像NPC一样每天十二点刷新不成

 

java代码执行顺序首先,没有学java或者不知道继承的,可以不用浪费时间乐,直接左上角,看多了有害。java代码执行顺序是自上而下,从左到右,方法是以main方法为主方法(通常情况下,事实
new一个对象时:静态代码块普通代码块构造方法普通方法publicclassMain{publicstaticvoidmain(String[]args){AppleapplenewApple();
在运行一个Java程序时,分为加载过程和实例化过程,即static修饰的代码块、属性、声明为加载,的普通属性、代码块、构造器为实例化过程。其中加载的代码属于整个,只执行一次;而实例化过程中的
只要了解过多线程,我们就知道线程开始的顺序执行顺序是不一样的。如果只是创建三个线程然后执行,最后的执行顺序是不可预期的。这是因为在创建完线程之后,线程执行的开始时间取决于CPU何时分配时间片,线程
言今天在看AndroidContentProvider实现的时候,突然想到了Java在new的过程,静态域、静态块、非静态域、非静态块、构造函数的执行顺序问题。其实这是一个很经典的问题,非常考察
classcode{publiccode(){Systemoutprintln("hello");}}publicclassTest{static{Systemoutprintln("静态代码块");
代码执行顺序如下:1、一个的静态代码块、构造代码块、构造方法的执行流程为:静态代码块>构造代码块>构造方法2、静态的内容是随着的加载而加载,静态代码块的内容会优先执行3、子类初始化之
具体代码如下所示:publicclassParent{publicstaticintaparentStaticMethod2();{Systemoutprintln("父类非静态初始化块");}sta
Java,new一个的对象,里面的静态代码块、非静态代码、无参构造方法、有参构造方法、的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证。比如新建一个测试父。publicc
实话,这块真的不好理解啊~都怪jvm执行顺序搞这么复杂,哼╭(╯^╰)╮但是我们能怎么办,只能研究呗!!!!:首先,毫无置疑的,静态代码块在加载时就执行了,所以肯定是最先执行的。。。。2:老师是不是