-5
public class A{
    private static flag;

    public void count(){
        flag++;
    }
}

public class B extends A{
    public void count(){
        super.count();
    }
}

public class C extends A{
    public void count(){
        super.count();
    }
}

}

public class D extends A{
    public void count(){
        super.count();
    }
}

让我们假设我的课程以下列方式执行 class B Class C class D

现在我想知道在 D 类计数方法之后标志实例变量的值是多少

4

4 回答 4

2

您只需调用 flag++ 三次。所以最终的值是 flag+3(你必须初始化 flag)。不过,您必须处理并发问题。

于 2012-11-21T05:05:30.453 回答
1

它是静态的,所以无论你调用它多少次,如果你所做的只是每次都递增它,无论你从哪个类调用它,这就是它的值。

不确定这是否是问题。

于 2012-11-21T04:59:44.703 回答
1

假设您更正了声明:

private static int flag;

...直到/除非有人实际创建 , , 或 , 的实例AB因为CDflag0在初始化时获得的值。

如果你开始实例化事物并调用它们的count函数(你必须实例化它们才能做到这一点,而count不是static),它的值将被A#count. 因为它是static,所以同一个成员在实例之间共享。因此:

new A().count();
// Now it's 1
new B().count();
// Now it's 2

等等。

于 2012-11-21T05:04:05.560 回答
1

tldr; “静态字段”或“类变量”表示在类的所有实例(包括子类)之间共享的单个变量:

有时,您希望拥有所有对象共有的变量。这是通过静态修饰符完成的。在声明中带有 static 修饰符的字段称为静态字段或类变量。它们[静态字段]与类相关联,而不是与任何对象相关联。类的每个实例共享一个类变量,该变量位于内存中的一个固定位置。任何对象都可以更改类变量的值,但也可以在不创建类实例的情况下操作类变量。

There is only one variable with that particular name. In this case the class qualified name is A.flag (prepending the package would make it fully qualified). Java just allows static fields be accessed in an instance-qualified manner, which I would consider a historical mistake .. as static fields exist independent of any instance.

于 2012-11-21T05:10:31.760 回答