0

我从一点 C++ 开始对 Java 是全新的,我想知道当我调用静态方法或访问静态字段而没有类的实例时会发生什么:

class Foo {
    public final static Scanner _input = new Scanner(System.in);
}

class Bar {
    public final static Scanner _input = new Scanner(System.in);
}

...

SomeCode[Foo._input.nextInt()];

我无法想象创建了一个临时对象,但不知道。谢谢

4

5 回答 5

4

我想知道当我在没有类实例的情况下调用静态方法或访问静态字段时会发生什么

它只是访问该字段......就这么简单。它不会创建一个实例Foo——它不需要。

该字段不与类型的任何实例相关联 - 它与类型本身相关联。基本上,这就是staticJava 中的意思。static恐怕您应该尝试忽略 C++ 中有些不同的任何含义。

需要注意的一件事是 Java 设计中的一个问题——您可以通过引用访问静态成员,但这并不意味着您所期望的。例如:

Foo foo = null;
Scanner scanner = foo._input;

看起来它会爆炸NullPointerException- 但事实并非如此。该代码相当于:

Foo foo = null;
Scanner scanner = Foo._input;

尽可能避免使用第一种形式的代码是值得的。这可能真的会产生误导,特别是当您调用方法时 -看起来调用依赖于实例(并且可以是多态的)但实际上这两个都是不正确的:(

于 2013-06-06T05:58:34.020 回答
1

创建了临时对象???

static 关键字来创建属于类的字段和方法,而不是属于类的实例。

大力推荐

于 2013-06-06T05:58:27.303 回答
1

static字段与类本身相关联。它们的解析是在编译时完成的;静态变量(和静态初始化块)的初始化在 JVM 加载类时运行。

至于如何访问这些变量(或方法),你可以像你一样使用类名;但是 Java 也允许您使用类的实例变量来做到这一点。包括null那些!

所有这三个表达式都允许访问bar类中命名的静态变量Foo前提bar是调用者可见):

Foo.bar;            // using the class name
new Foo().bar;      // using an instance
((Foo) null).bar;   // using a null instance
于 2013-06-06T06:00:09.743 回答
1

我无法想象创建了一个临时对象,

没有。您使用类对象来调用方法。

于 2013-06-06T06:01:05.793 回答
1

您同时使用了 static 和 final 关键字,两者的含义不同。

当您使用 static 关键字声明任何变量时,将其声明为类变量,这意味着它对该类的所有实例都是通用的。使用类名访问无需使用实例。

例如

Class Bycicle
{
   static String Type ='exercise';
    String Owner;

}

如果您创建此类的 10 个实例,则将创建所有者的 1o 个副本,而类型将仅保留所有 10 个对象的一个​​公共副本。一个对象更改类型值,然后它将影响所有其他对象。

如果您使用 final 声明静态,那么它对所有人都是通用的,并且在编译时声明和初始化后也不允许更改。

去这里了解更多有趣的细节点击这里

于 2013-06-06T06:11:18.840 回答