我对关键字static有疑问。让我们说比如我们有这段代码。
public class Foo
{
private int age;
private static int weight;
..
...
}
在main中说你创建了2个对象。您将年龄改为1,然后更改另一个的重量。这是否意味着重量也会在第一个对象中发生变化?如果是这种情况,那么这是否意味着重量是一个指针?
我想我的问题简而言之。静态内部如何工作?它本质上是一个指针类型?
答案 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
类留出的另一个内存区域中保存的代码和状态变量的引用。在第二个区域中,保留所有静态代码和静态变量。但通常你不必担心这种细节。