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中为啥说静态方法先执行?的主要内容,如果未能解决你的问题,请参考以下文章