我对关键字静态有疑问。例如,我们有这段代码。
public class Foo
{
private int age;
private static int weight;
..
...
}
说主要你创建2个对象。你改变一个的年龄,然后你改变另一个的体重。这是否意味着第一个对象的权重也会发生变化?如果是这种情况,那么这是否意味着重量是一个指针?
简而言之,我想我的问题是。静态如何在内部工作?它本质上是指针类型吗?
我对关键字静态有疑问。例如,我们有这段代码。
public class Foo
{
private int age;
private static int weight;
..
...
}
说主要你创建2个对象。你改变一个的年龄,然后你改变另一个的体重。这是否意味着第一个对象的权重也会发生变化?如果是这种情况,那么这是否意味着重量是一个指针?
简而言之,我想我的问题是。静态如何在内部工作?它本质上是指针类型吗?
静态变量由类的所有实例共享。这些不是指针,但所有引用(静态/实例)都将指向保存静态值的同一内存块。同样重要的是要注意,静态变量与类相关联,而不是与任何对象相关联,这意味着静态变量甚至可以在不创建对象的情况下初始化和使用。
要了解其static
工作原理,您必须了解两种可能的成员:
static
关键字定义的成员。它们属于类,而不是任何特定的实例。null
对象的情况下没有)。为了回答您的特定问题,类的每个实例都与其他实例共享类成员,引用内存中的固定位置。这种共享意味着在给定实例中更改类成员的值会更新所有这些成员的值。
Java 屏蔽了底层内存管理使用的指针,因此您通常不需要担心它们。但是让我们理顺一些术语。
Java类是一个蓝图;它定义了行为(方法)和状态(变量)。对象的某些部分,特别是那些静态的部分由该类的所有实例共享(在相同的执行环境中运行),并且实际上根本不需要实例化该类即可访问。
对象是类的特定实例。所有非静态变量和方法对于这个对象和这个对象都是唯一的。当您使用new时,您正在创建一个类的新对象实例。
当您检查静态方法与非静态方法的执行方式有何不同时,这一点变得很明显:
MyObject.aStaticMethod();//Note I don't instantiate the class.
MyObject obj = new MyObject();
obj.aNonStaticMethod(); //For non-static methods, I MUST have an object instance of the class.
请注意,在上面的示例中,obj
令牌是对内存中特定位置的引用(与指针略有不同)。内存中的那个位置是 的实例,并且恰好包括对代码和状态变量的引用,这些变量和状态变量保存在为该类obj
预留的另一个内存区域中。MyObject
在第二个区域中,保留了所有静态代码和静态变量。但通常你不必担心那种精细的细节。