既然变量已经设置了static修饰为什么还要new

静态变量不是在类加载的时候就加载进内存了吗?为什么还要new,new了的还与之前的一样吗?

你可能不太理解 static 关键字的作用。它是一个修饰符,如果有一个变量或者方法,你希望不通过 new 对象就可以直接调用的话,那么就可以修饰为 static。

可以打个比方,你可以这么想 static 是标示所修饰的内容要放在一个类盒子里,而这个盒子是类加载的时候创建的,每个类都唯一。而如果不修饰 static 的话,是标示所修饰的内容是和对象放在一个对象盒子里的,在创建对象的时候才会创建这个盒子,同一个类可以有很多对象盒子

所以如果不需要 new 就可以使用 static 修饰的内容(因为类加载完之后就已经放到盒子里了)。所以 static 和 new 的作用你要分清楚,这两个关键字的作用没有任何交集。

注:例子只是方便理解,底层并不是这样。

楼上解释的非常详细,但是不太好理解。我通俗易懂的讲一下。

变量前面的static只是说变量的特性,只做声明用,和实际的内容没有关系,也就是说static String a。只是说我是一个静态的字符串,我需要一个静态字符串的空间,那它的内容是什么呢?暂时还没有。因为只做了声明,没有初始化。

而new String("a")或者 a="a"才是初始化,将某个值(引用或值地址)赋给这个变量。赋值以后,变量才有了内容。

再回到static,static说明的是变量存储空间和使用的特性,什么特性呢?就是静态栈存储和类调用,你可以通过类.变量调用,这个变量在静态区只有一份引用。不像非static对象,在堆空间上,每一次new都可以有新的引用地址。

总结一下,变量前面的关键字都是讲我需要一个什么样的盒子装这个变量。至于变量到底是什么,得看我new或者=的时候往盒子里装什么东西。对java而言,修饰符决定了盒子装变量的类型,不能随便装,不能把int装进string盒子里,但是同一类型,就不限制了。

new关键字的作用是申请一个内存区域并执行相关的构造方法,可以理解为创建一个变量,但是还没有名称

而使用static关键字仅仅是声明一个变量,可以简单的理解为仅创造一个变量的名字,但是这个名字并没有和变量关联在一起

静态变量不是在类加载的时候就加载进内存

类加载的过程有以下几个过程:加载、验证、准备、解析

在准备的过程中,静态成员变量就会进行内存分配,而不包括实例变量,实例变量是在对象实例化随着对象一起分配在java堆中的。但是要注意一点,比如:public static int a=1;那变量在准备阶段过后的初始值是0而不是1.因为这个时候尚未执行任何的Java方法。而是赋值了一个初始值,如果是引用成员变量就会为null,其他基本类型对应的是其基本默认值。

在解析时给静态变量赋值