【问题标题】:Do static members enter objects?静态成员是否进入对象?
【发布时间】:2013-05-10 17:51:36
【问题描述】:

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

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

谢谢大家。

【问题讨论】:

    标签: java oop object static


    【解决方案1】:

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

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

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

    SomeClass.someStaticMember = 5;
    

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

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

    System.out.println(c.someStaticMember);
    

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

    System.out.println(SomeClass.someStaticMember);
    

    【讨论】:

      【解决方案2】:

      静态成员是否进入对象?

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

      当一个对象被创建时,它是否接收到静态成员

      没有。

      这个值可以改变吗?

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

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

      是的。

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

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

      它们是如何变化的?

      何时以及是否更改它们。

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

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

      【讨论】:

        【解决方案3】:

        让我们看看这个。

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

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

        ClassName.staticMethodName(args)
        

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

        objectName.staticMethodName(args)
        

        现在回答你的问题:

        当一个对象被创建时,它是否接收到静态成员,并且该值可以改变吗?

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

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

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

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

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

        【讨论】:

          【解决方案4】:

          当一个对象被创建时,它是否接收到静态成员,并且该值可以改变吗?

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

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

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

          它们如何变化?

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

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

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

          【讨论】:

            【解决方案5】:

            除了@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
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2020-07-16
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多