1.静态变量

当一个类被加载到内存中时,会立即创建一个静态对象。该对象存储静态类变量(静态类字段)。即使没有创建该类的普通(非静态)对象,静态对象也存在。

当我们在一个类中声明变量时,我们指出它们是否只创建一次,或者是否应该在每个对象中有这些变量的不同实例。默认情况下,为每个对象创建每个变量的新副本。

静态变量绑定到类的静态对象,并且始终只有一个实例。

要在类中创建静态变量,需要static在其名称前写上关键字。声明静态变量的一般格式是:

static Type name = value;

如果没有为静态变量分配初始值,则使用默认值对其进行初始化:

类型 默认值
byte
0
short
0
int
0
long
0
float
0.0
double
0.0
char
'\u0000'
(同样的事情
0
)
boolean
false
Object
和任何课程
null

例子:

代码 笔记
public static int WIDTH = 100;
public static String message = "Hello";
private static Scanner console;
private static int count = 0;
private static boolean flag;

在类内部,您可以简单地通过使用它们的名称来引用它的静态变量。但是要从另一个类访问它们,您需要在静态变量名之前写上类名。

ClassName.variable

例子:

多变的 班级 访问其类之外的变量
public static int WIDTH = 100;
Solution
Solution.WIDTH
public static String message = "Hello";
Main
Main.message
private static Scanner console;
JavaGame
变量是private。它在课堂之外是不可见的。
private static int count = 0;
Counter
变量是private。它在课堂之外是不可见的。
private static boolean flag;
Arithmetic
变量是private。它在课堂之外是不可见的。


2.静态变量和非静态变量的区别

类的非静态(普通)变量的声明方式与静态变量相同,只是没有关键字static

普通变量和静态变量有什么区别?

类的普通变量绑定到类的对象(类的实例),而静态变量绑定到类的静态对象。

如果一个类有多个实例,每个实例都有自己的非静态(普通)变量副本。一个类的静态变量总是存储在它的静态对象中,并且只存在它们的一个实例。

仅当您拥有对类对象的引用时,才能访问类的普通变量(字段)。当然,还有类的内部方法。

例子:

使用对象引用访问类的字段
public class DataInfo
{
   public int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      DataInfo info = new DataInfo();
      System.out.println(info.value);
   }
}

您可以从任何地方访问静态变量(在考虑可见性修饰符之后):从普通方法、从同一类的静态方法、从其他类的方法等。

例子:

在不使用对象引用的情况下访问类的静态字段
public class DataInfo
{
   public static int value = 100;
}

public class Solution
{
   public static void main(String[] args)
   {
      System.out.println(DataInfo.value);
   }
}

内存是如何组织的:

假设我们有一个Person包含 4 个字段的类:两个是静态的,两个不是。

public class Person
{
   public static int count = 0;
   public static int sum = 0;
   public int age = 0;
   public String name;
}

加载类后立即

当 Java 机器完成加载Person类时,内存将如下所示:

创建第一个对象后

如果我们创建一个Person对象,那么图片就变成了这样:

静态变量和非静态变量的区别2

请注意,虽然两个对象都有两个变量,但它们是不同的变量:普通对象有普通变量,静态对象有静态变量。

我们需要更多物品

让我们再创建两个Person对象。现在内存看起来像这样:

静态变量和非静态变量的区别3

请注意,每个对象都有自己的年龄和名称变量。



3.删除和添加static修改器

从静态到普通

如果我们拿一个静态变量并通过删除它的修饰符将它变成一个普通变量会发生什么static?例如,static int sum变量。

修改后的代码将如下所示:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public int age = 0;
   public String name;
}

现在内存看起来像这样:

静态变量和非静态变量的区别

静态变量从静态对象中消失了,现在每个普通对象都有自己的sum变量。

从普通到静态

我们可以反其道而行之:将static修饰符添加到类的普通变量中。它们将从所有普通对象中消失,并会出现在静态对象中。假设我们决定将agename变量设为静态。然后代码将如下所示:

public class Person
{
   public static int count = 0;
   public int sum = 0;
   public static int age = 0;
   public static String name;
}

现在内存看起来像这样:

删除和添加静态修饰符