【发布时间】:2013-05-10 17:51:36
【问题描述】:
这当然是一个基本问题,但我必须要求澄清我的一个问题。如果一个类成员被设为static,它可以在没有实例化的情况下被访问,其语法类似于class.member。创建对象时,它是否接收静态成员,并且该值可以更改吗?既然静态成员不需要对象,那么任何对象都一样吗? (即一个改变,另一个改变)。
基本上,静态成员是如何在对象中实现的,它们又是如何变化的? 只能用静态方法来操作它们吗?
谢谢大家。
【问题讨论】:
这当然是一个基本问题,但我必须要求澄清我的一个问题。如果一个类成员被设为static,它可以在没有实例化的情况下被访问,其语法类似于class.member。创建对象时,它是否接收静态成员,并且该值可以更改吗?既然静态成员不需要对象,那么任何对象都一样吗? (即一个改变,另一个改变)。
基本上,静态成员是如何在对象中实现的,它们又是如何变化的? 只能用静态方法来操作它们吗?
谢谢大家。
【问题讨论】:
从技术上讲,您可以使用这样的实例更改静态成员:
SomeClass c = new SomeClass();
c.someStaticMember = 5;
但是,这会产生一个警告,这是应该的。正确的方法是这样做:
SomeClass.someStaticMember = 5;
既然静态成员不需要对象,那么任何对象都一样吗? (即一个改变,另一个改变)。
同样,技术上是的,因为您可以这样做:
System.out.println(c.someStaticMember);
但这是不正确的,会给你一个警告;正确的做法是:
System.out.println(SomeClass.someStaticMember);
【讨论】:
静态成员是否进入对象?
没有。他们在不同的地方举行,实际上是在课堂上。
当一个对象被创建时,它是否接收到静态成员
没有。
这个值可以改变吗?
是的,除非它是最终的,但该更改会影响所有实例都看到的单个静态变量。
既然静态成员不需要对象,那么任何对象都一样吗? (即一个改变,另一个改变)。
是的。
基本上,静态成员是如何在对象中实现的
他们不是。它们在类中实现。
它们是如何变化的?
何时以及是否更改它们。
它们只能用静态方法来操作吗?
不,静态变量可以被任何可以访问它的方法操作。
【讨论】:
让我们看看这个。
首先,请记住与Class 关联的静态方法(以及就此而言的静态变量)与任何特定实例无关。即使您不创建任何实例,静态方法也存在。
要访问静态方法,请执行以下操作:
ClassName.staticMethodName(args)
虽然,Java 也允许您使用实例(对象)访问静态变量,但是不鼓励这样做,因为它会混淆该方法是否为静态。
objectName.staticMethodName(args)
现在回答你的问题:
当一个对象被创建时,它是否接收到静态成员,并且该值可以改变吗?
静态成员存在于定义类而不是任何对象。如果静态成员是可变变量,那么您当然可以更改它的值。每个人(类自己的对象、任何其他对象、任何其他静态方法)都会看到相同的值。
既然静态成员不需要对象,那么任何对象都一样吗? (即一个改变,另一个改变)。
是的。但请注意,以重复我自己为代价,静态成员与类相关联,而不是对象。
基本上,静态成员是如何在对象中实现的,它们又是如何变化的?它们只能用静态方法来操作吗?
哦,伙计,这越来越累了 :) 静态成员没有在对象中实现。它们可以通过其他静态和非静态方法进行操作(基本上可以从任何提供权限的地方)。但是,静态成员不能看到任何实例变量,除非他们定义了该实例。
【讨论】:
当一个对象被创建时,它是否接收到静态成员,并且该值可以改变吗?
当然,您可以使用对象更改静态成员的值,但最好使用类名更改它。
既然静态成员不需要对象,那么任何对象都一样吗?
再次是的,静态成员意味着该成员在该类创建的所有实例中都是相同的,并且可以通过任何对象或通过类名访问。
它们如何变化?
有两种方法可以改变静态成员的值:
public static int x = 5;
Object.x = 10;
Class.x = 20
改变静态成员值的两种方法都是正确的,但是第一种方法会给你一个警告,第二种方法不会。
【讨论】:
除了@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
【讨论】: