1

这当然是一个基本问题,但我必须要求澄清我的一个问题。如果一个类成员被设为static,它可以在没有实例化的情况下被访问,使用类似class.member的语法。创建对象时,它是否接收静态成员,并且该值可以更改吗?既然静态成员不需要对象,那么任何对象都一样吗?(即改变了一个,改变了另一个)。

基本上,静态成员是如何在对象中实现的,它们又是如何变化的?它们只能用静态方法来操作吗?

谢谢你们。

4

5 回答 5

2

从技术上讲,您可以使用如下实例更改静态成员:

SomeClass c = new SomeClass();
c.someStaticMember = 5;

但是,这将产生一个警告,它应该这样做。正确的方法是这样做:

SomeClass.someStaticMember = 5;

既然静态成员不需要对象,那么任何对象都一样吗?(即改变了一个,改变了另一个)。

同样,技术上是的,因为您可以这样做:

System.out.println(c.someStaticMember);

这是不正确的,会给你一个警告;正确的方法是:

System.out.println(SomeClass.someStaticMember);
于 2013-05-16T00:42:24.263 回答
1

静态成员是否进入对象?

不,他们在不同的地方举行,实际上是在课堂上。

创建对象时,它是否接收静态成员

不。

可以更改该值吗?

是的,除非它是最终的,但该更改会影响所有实例都看到的单个静态变量。

既然静态成员不需要对象,那么任何对象都一样吗?(即改变了一个,改变了另一个)。

是的。

基本上,静态成员是如何在对象中实现的

他们不是。它们在类中实现。

它们是如何变化的?

何时以及是否更改它们。

它们只能用静态方法来操作吗?

不,静态变量可以被任何可以访问它的方法操作。

于 2013-05-16T01:07:19.157 回答
1

让我们看看这个。

首先,请记住与Class不与任何特定实例相关联的静态方法(以及就此而言的静态变量)。即使您不创建任何实例,静态方法也存在。

要访问静态方法,请执行以下操作:

ClassName.staticMethodName(args)

虽然,Java 也允许您使用实例(对象)访问静态变量,但是不鼓励这样做,因为它会混淆该方法是否为静态方法。

objectName.staticMethodName(args)

现在回答你的问题:

创建对象时,它是否接收静态成员,并且该值可以更改吗?

静态成员存在于定义类而不是任何对象。如果静态成员是可变变量,那么您当然可以更改它的值。每个人(类自己的对象、任何其他对象、任何其他静态方法)都将看到相同的值。

既然静态成员不需要对象,那么任何对象都一样吗?(即改变了一个,改变了另一个)。

是的。但请注意,以重复自己为代价,静态成员与类相关联,而不是对象。

基本上,静态成员是如何在对象中实现的,它们又是如何变化的?它们只能用静态方法来操作吗?

哦,伙计,这越来越累了 :) 静态成员没有在对象中实现。它们可以通过其他静态和非静态方法进行操作(基本上可以从任何提供权限的地方)。但是,静态成员不能看到任何实例变量,除非他们定义了该实例。

于 2013-05-16T01:09:24.623 回答
1

创建对象时,它是否接收静态成员,并且该值可以更改吗?

是的,当然您可以使用对象更改静态成员的值,但最好使用类名更改它。

既然静态成员不需要对象,那么任何对象都一样吗?

是的,静态成员意味着这个成员在这个类的所有实例中都是相同的,并且可以通过任何对象或通过类名访问。

他们如何改变?

有两种方法可以更改静态成员的值:

public static int x = 5;
Object.x = 10;
Class.x = 20

并且改变静态成员值的两种方法都是正确的,但是第一种方法会给你一个警告,第二种方法不会。

于 2013-05-16T01:10:18.370 回答
0

除了@Doorknob 的回答,特别是回应:

并且只能用静态方法来操作它们吗

您可以通过各种方式访问​​和更改静态成员,如下所示:

public class Foo {

    public static String BAR = "BAR!!";

    public static void changeBAR() {
        BAR = "BAZ!";
    }

    public void instanceMethod() {
        // some code
        BAR = "CHANGED AGAIN!";
        // some code
    }

    public static void main(String[] args) {
        Foo f = new Foo();
        System.out.println(Foo.BAR);

        Foo.changeBAR();
        System.out.println(Foo.BAR);

        f.instanceMethod();
        System.out.println(Foo.BAR);

        Foo.BAR = "WHATS HAPPENING";
        System.out.println(Foo.BAR);
    }
}

将导致:

BAR!!
BAZ!
CHANGED AGAIN!
WHATS HAPPENING
于 2013-05-16T01:00:56.943 回答