静态成员是否输入对象?

时间:2013-05-16 00:40:35

标签: java oop object static

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

基本上,如何在对象中实现静态成员,以及它们如何更改? 它们只能用静态方法操作吗?

谢谢大家。

5 个答案:

答案 0 :(得分:2)

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

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

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

SomeClass.someStaticMember = 5;
  

由于静态成员不需要对象,对于任何对象都是一样的吗? (即在一个中改变,在另一个中改变)。

再次,从技术上讲,是的,因为你可以这样做:

System.out.println(c.someStaticMember);

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

System.out.println(SomeClass.someStaticMember);

答案 1 :(得分:1)

  

静态成员是否输入对象?

没有。他们被关押在一个不同的地方,实际上是在课堂上。

  

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

没有

  

并且可以更改该值吗?

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

  

由于静态成员不需要对象,对于任何对象都是一样的吗? (即在一个中改变,在另一个中改变)。

  

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

他们不是。它们在课堂上实现。

  

他们如何改变?

何时以及是否更改它们。

  

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

不可以,任何有权访问它的方法都可以操纵静态变量。

答案 2 :(得分:1)

让我们来看看。

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

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

ClassName.staticMethodName(args)

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

objectName.staticMethodName(args)

现在回答你的问题:

  
    

创建对象时,是否收到静态成员,是否可以更改该值?

  

静态成员的存在与定义的Class没有任何对象。如果静态成员是一个可变变量,那么你当然可以改变它的值。每个人(类自己的对象,任何其他对象,任何其他静态方法)将看到相同的值。

  
    

由于静态成员不需要对象,对于任何对象都是一样的吗? (即在一个中改变,在另一个中改变)。

  

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

  
    

基本上,如何在对象中实现静态成员,以及它们如何更改?它们只能用静态方法操作吗?

  

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

答案 3 :(得分:1)

  

创建对象时,是否收到静态成员,是否可以更改该值?

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

  

由于静态成员不需要对象,对任何对象都是一样的吗?

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

  

他们如何改变?

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

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

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

答案 4 :(得分: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