java中为啥说静态方法先执行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中为啥说静态方法先执行?相关的知识,希望对你有一定的参考价值。

程序执行的顺序不是按书写顺序,从上往下执行吗?

1 不管是静态方法还是非静态方法,都需要调用后执行,其执行的次序和在类里声明的次序无关,区别是静态方法是“class.method"方式执行,非静态方法是"object.method"方式执行,即后者需要创建一个对象。
2 静态成员变量(也称类变量)先于非静态成员变量初始化,静态成员变量在类第一次加载时初始化,所有对象共享一份静态成员变量,非静态成员变量则在对象创建时初始化追问

奥,再请教大侠,类一共要加载几次?

追答

只加载一次,而且是懒加载的,第一次调用该类的时候加载(比如当调用该类的静态方法或者成员变量,new一个该类的对象的时候)。
具体的说,每一个类(.class)文件,都对应着一个Class对象,这个Class对象类似于一个模板,用于创建该类的对象。这个Class对象在第一次调用该类时创建并加载到java虚拟机中。

追问

还是不理解,比如当调用该类的静态方法或者成员变量,new一个该类的对象的时候,这时候才加载?main方法要执行,首先就要把代码加载到内存啊

追答

main方法执行的时候不是一次性加载的,是需要时才加载,main方法在调用一个方法或new 一个对象的时候,会首先检查是否加载过这个类(具体地说是从jvm的内存里检查是否存在这个类的Class对象),若没有加载过,则加载这个类(即生成该类的Class对象),静态成员变量和静态代码块会在第一次加载中执行;若加载过,则不重新加载。
换个角度想想,jvm怎么知道你需要哪些类呢?只有你调用了这个类,jvm才会从类路径classpath里去找这个类(.class),然后加载它,如果当前类路径找不到,就会抛出ClassNotFoundException。
相关的详细知识,可以去看下java教材中关于类加载机制的章节。

追问

大侠,我不知道加载是什么意思,任何代码都必须是机器码然后加载到内存,才会执行的啊

追答

是的,对于java虚拟机来说,机器码就是.class文件,每个.class文件被加载,就会在内存中产生一个Class对象,这个Class对象就像一个模板,你可以理解成一个模具,所有该类的对象都会从该模具中产生。
举个例子:
public Class A
static int i = 0;
static
System.out.println("静态代码块");


public static void main(String[] args)

A.i;



main方法中调用了类A的成员变量,此时类A未被加载,那么jvm就会从classpath中找到A.class文件,然后创建A.class对象,并初始化A的静态成员变量(这里是i)和执行A的静态代码块(这里会看到print语句执行),之后无论怎么调用A,这个静态代码块都不会执行,你可以多做几次实验看看。
A.class对象,你可以通过A.class语句获得,然后通过Class.newInstance()创建A的实例,这样和new A();的语句创建效果是一样的。

追问

main方法中调用了类A的成员变量,此时类A未被加载。你的这句话我不懂,类A未被加载的话,main方法怎么会被执行?

追答

1 调用前没有加载,调用时发现Class A没有加载,遂加载之
2 main方法开始时只是启动了一个java虚拟机,除了一些必要类库,其他类都不加载,目的主要是为了速度快。

追问

这点我就不明白了,调用前没有加载的话,main方法会执行吗?相当于内存里面没有任何代码啊

追答

jvm启动只会加载必要的核心类库,其中就有Class类和相关类加载器,然后其他的类会在需要的时候加载进来。

参考技术A 我想 :类的静态初始化块在加载类时先执行,此时还没有对象产生。创建对象时构造方法和非静态初始化块按先后执行。其它方法基本上是调用才执行。也有例外。 参考技术B 静态方法没有先执行

class A
static
...



public static void a()...

public static String b()...


static
...


这类代码才会先执行

a() b()就是按照你书写的顺序执行的 啊
参考技术C 源文件和类文件你没有分清。

*.java和*.class追问

怎么这么说,请大侠指教一下

以上是关于java中为啥说静态方法先执行?的主要内容,如果未能解决你的问题,请参考以下文章

java static学傻了,;类方法中给成员变量赋值必须先new个对象,普通方法却不用,为啥呢?

java 内部类为啥不能static

java新手为啥java类中要有static静态方法?

为啥main方法在java中是静态的[重复]

java:在java中为啥静态变量没有this引用?

java类的加载顺序,静态块 非静态块 构造器属性方法等