当前位置: 首页 > 面试题库 >

什么是“静态”?

乐正意智
2023-03-14
问题内容

我开始用Java编程。

public static void main(String[]args)

一本书说,在这种情况下,我应该使用static,但没有明确说明为什么应该使用静态方法或含义。

你能澄清一下吗?


问题答案:

的概念static与某物是类的一部分还是对象(实例)有关。

对于main声明为的方法static,它表示该main方法是一个类方法-
该方法是类的一部分,而不是对象的一部分。这意味着另一个类可以通过引用来调用另一个类的类方法ClassName.method。例如,调用的run方法MyClass可以通过以下方式完成:

MyClass.main(new String[]{"parameter1", "parameter2"});

另一方面,没有static修饰符的方法或字段表示修饰符是对象的一部分(或也称为“实例”),而不是类的一部分。它由方法或字段所属的特定对象的名称而不是类名称来引用:

MyClass c1 = new MyClass();
c1.getInfo()     // "getInfo" is an instance method of the object "c1"

由于每个实例可能具有不同的值,因此在不同对象中具有相同名称的方法或字段的值不一定必须相同:

MyClass c1 = getAnotherInstance();
MyClass c2 = getAnotherInstance();

c1.value     // The field "value" for "c1" contains 10.
c2.value     // The field "value" for "c2" contains 12.
             // Because "c1" and "c2" are different instances, and 
             // "value" is an instance field, they can contain different
             // values.

结合了实例变量和类变量这两个概念。假设我们声明了一个新类,其中包含实例,类变量和方法:

class AnotherClass {
    private int instanceVariable;
    private static int classVariable = 42;

    public int getInstanceVariable() {
        return instanceVariable;
    }

    public static int getClassVariable() {
        return classVariable;
    }

    public AnotherClass(int i) {
        instanceVariable = i;
    }
}

上面的类有一个实例变量instanceVariable和一个classVariablestatic修饰符声明的类变量。同样,有一个实例和类方法来检索值。

实例的构造函数将一个值分配给实例变量作为参数。class变量被初始化为42且永不更改。

让我们实际使用上面的类,看看会发生什么:

AnotherClass ac1 = new AnotherClass(10);

ac1.getInstanceVariable();             // Returns "10"
AnotherClass.getClassVariable();       // Returns "42"

注意类和实例方法的调用方式不同。他们通过名称引用类的方式AnotherClass,或通过名称引用实例的方式ac1。让我们进一步看看这些方法的行为差异:

AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);

ac1.getInstanceVariable();             // Returns "10"
AnotherClass.getClassVariable();       // Returns "42"
ac2.getInstanceVariable();             // Returns "20"
AnotherClass.getClassVariable();       // Returns "42"

可以看出,实例变量是由对象(或“实例”)保存的变量,因此对于该特定实例是唯一的,在此示例中,该实例变量是ac1和引用的对象ac2

另一方面,类变量仅对整个类唯一。为了更好地理解这一点,让我们向中添加一个新方法AnotherClass

public int getClassVariableFromInstance() {
    return classVariable;
}

然后,运行以下命令:

AnotherClass ac1 = new AnotherClass(10);
AnotherClass ac2 = new AnotherClass(20);

ac1.getInstanceVariable();             // Returns "10"
ac1.getClassVariableFromInstance();    // Returns "42"
ac2.getInstanceVariable();             // Returns "20"
ac2.getClassVariableFromInstance();    // Returns "42"

虽然getClassVariableFromInstance是实例方法,但可以通过引用实例ac1和调用来看出ac2,它们都返回相同的值42。这是因为在这两个实例方法,它们是指类方法classVariable是唯一的类,而不是实例-
只有一个单一的副本classVariable的类AnotherClass

我希望能弄清楚static修饰符的用途。

Sun
的Java教程有一个名为“
了解实例和类成员”的部分,该部分还介绍了两种类型的变量和方法。



 类似资料:
  • 问题内容: 什么是静态嵌套类?静态和非静态嵌套类有什么区别? 问题答案: 静态内部类是嵌套在具有修饰符的另一个类中的类。除了可以访问在其内部定义的类的私有成员之外,它与顶级类几乎相同。 类是静态内部类。类是一个非静态的内部类。两者之间的区别是,非静态内部类的实例被永久连接到的实例-你不能创建一个没有。不过,您可以独立创建对象。 中的代码,并且都可以访问x; 不允许使用其他代码。

  • 问题内容: 我正在看一些从Java字节码获得的反汇编代码。我看到一些声明如下: 我无法弄清楚什么或平均值。有人可以帮我理解这部分吗? 问题答案: 合成场,(2) 甲 编译器创建的 字段,该字段的本地内部类链接到一个块的局部变量或引用类型参数。 另请参见 或Java中的综合类。

  • 问题内容: 为什么我的内部类中没有接口?为什么是天生的?抱歉,如果这是一个愚蠢的问题,我已经尽力一遍又一遍地用Google搜索,但似乎无法将其包裹在脑海中。如为什么不能在内部类/局部类中声明这些? 同样作为一个确认,我们在接口中可以包含静态最终变量的原因是因为它们未指定状态或任何此类实现权?如果我们输了而只使用了final,那么我们需要一个没有意义的实例,因为您无法实例化接口。抱歉,我真的很困惑,

  • 问题内容: 当我发现它是一个接口时,我正在阅读接口。我不太了解什么是静态接口,它与常规接口有何不同? 这是接口的定义。此处的文档: Map.Entry 。 问题答案: 我对它不是内部接口的情况感到好奇。 所述改性剂只允许在嵌套类或接口。在您的示例中,嵌套在接口内部。 对于接口,修饰符实际上是可选的。对于接口来说,这种区别是没有意义的,因为它们不包含任何仍然可以访问外部接口的代码。

  • 问题内容: 作为Java的初学者,我仍然不确定它的含义。有人精通Java 问题答案: 静态表示标记为此类的变量或方法在类级别可用。换句话说,你无需创建类的实例即可访问它。 因此,与其创建一个Foo实例,然后doStuff像这样调用: 你只需直接针对该类调用该方法,如下所示:

  • 本文向大家介绍Java类的静态成员是什么?,包括了Java类的静态成员是什么?的使用技巧和注意事项,需要的朋友参考一下 在Java中,静态成员是属于该类的成员,您可以在不实例化该类的情况下访问这些成员。 static关键字可以与方法,字段,类(内部/嵌套),块一起使用。 静态方法-您可以使用关键字static创建静态方法。静态方法只能访问静态字段,方法。要访问静态方法,无需实例化该类,只需将类名用