java中的静态变量是否被视为内部指针?

时间:2013-09-13 17:06:28

标签: java

我对关键字static有疑问。让我们说比如我们有这段代码。

public class Foo
{
private int age;
private static int weight;
.. 
...
}

在main中说你创建了2个对象。您将年龄改为1,然后更改另一个的重量。这是否意味着重量也会在第一个对象中发生变化?如果是这种情况,那么这是否意味着重量是一个指针?

我想我的问题简而言之。静态内部如何工作?它本质上是一个指针类型?

3 个答案:

答案 0 :(得分:2)

静态变量由类的所有实例共享。这些不是指针,但所有引用(静态/实例)都将指向保存静态值的相同内存块。同样重要的是要注意,静态变量与类而不是与任何对象相关联,这意味着可以初始化和使用静态变量,甚至无需创建对象。

答案 1 :(得分:2)

要了解static的工作原理,您必须了解两种可能的成员:

  • 类成员:由给定类的每个实例共享,这类成员是使用static关键字定义的成员。它们属于类,而不是任何特定的实例。
  • 实例成员:在类中声明的非静态成员属于该实例。它们中的每一个都将为其定义一个特定的值(或者在null对象的情况下没有定义)。

要回答您的特定问题,类的每个实例都会与其他实例共享类成员,并在内存中引用固定位置。这种共享意味着更改给定实例中类成员的值,更新所有类的值。

答案 2 :(得分:2)

Java掩盖底层内存管理使用的指针,因此您通常不必担心它们。但是让我们理清一些术语。

Java 是一个蓝图;它定义了行为(方法)和状态(变量)。对象的某些部分,特别是那些 static 的部分由该类的所有实例共享(在相同的执行环境中运行),并且实际上不需要将该类实例化为可访问的

对象是类的特定实例。所有非静态变量和方法都是此对象和此对象所独有的。当您使用 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类留出的另一个内存区域中保存的代码和状态变量的引用。在第二个区域中,保留所有静态代码和静态变量。但通常你不必担心这种细节。