jvm中类的加载,static类的加载
参考文档:https://blog.csdn.net/HD243608836/article/details/80208894问题:比如我一个程序里有30个类1程序运行时候,虚拟机是一下把30类都加载还是用哪个类加载哪个类?2类里有属性和方法,那加载某个类的时候,是把该类里的所有属性和方法都加载,还是根据我调用该类的哪个方法就加载哪个方法,,其它没用到的方法并不加载?解答:1....
参考文档:https://blog.csdn.net/HD243608836/article/details/80208894
问题:
比如我一个程序里有30个类
1程序运行时候,虚拟机是一下把30类都加载还是用哪个类加载哪个类?
2类里有属性和方法,那加载某个类的时候,是把该类里的所有属性和方法都加载,还是根据我调用该类的哪个方法就加载哪个方法,,其它没用到的方法并不加载?
解答:
1. 类的加载时机:当这个类被实例化的时候 或者执行这个类里面的static静态方法时
当然java.lang这个包里的类会在java虚拟机启动的时候加载
2. 静态的属性只会加载一次,第一次实例化的时候分配空间,以后再实例化这个类的时候 不会再分配内存空间。
这个静态属性属于这个类的,供这个类的所有实例共享。
3. 非静态的属性会在每次实例化的时候就会分配内存空间,
假如一个类被实例化10次,那么这个属性会分配10次内存空间,并且它 只属于当前自己实例,不属于其他的实例对象。
4. 方法在实例化这个类的时候这个方法就被以.class文件加载到虚拟机里了。
总结: 在 实例化时 会全部加载 类,属性,方法
=============================执行顺序=========================
public class Test {
public static void main(String[] args){
User ht = new User();
}
}
public class People {
static int num = 5;//1.首先被加载
static{
System.out.println("静态语句块已经被加载"+num); //2.被加载
}
int count = 0; //5.被加载
public People(){
System.out.println("父类的构造方法在这时候加载count="+count);//7.被加载
}
{
System.out.println("普通语句块"+count++);//6.被加载
}
}
public class User extends People{
static{
System.out.println("静态语句块和静态变量被初始化的顺序与代码先后顺序有关"); //4.被加载
}
static int num = 45;//3.被加载
int numre = 0; //8.被加载
{
numre++;
System.out.println("numre"+numre);//9.被加载
}
public User(){
System.out.println("子类构造方法");//10.被加载
}
}
输出:
静态语句块已经被加载5
静态语句块和静态变量被初始化的顺序与代码先后顺序有关
普通语句块0
父类的构造方法在这时候加载count=1
numre1
子类构造方法
总结执行顺序:
1. 父类的static成员变量;
2. 父类的static代码块;
3. 子类的static成员变量;
4. 子类的static代码块;
5. 父类的普通代码块;
6. 父类的构造方法;
7. 子类的普通代码块;
7. 子类的构造方法;
变量先于方法执行, “写java代码打印输出” 验证不了;
更多推荐
所有评论(0)