没有对象的Java和静态成员/函数访问

时间:2013-06-06 05:55:38

标签: java static java.util.scanner

我从一些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()];

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

5 个答案:

答案 0 :(得分:4)

  

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

它只是访问该领域......就这么简单。它创建Foo的实例 - 它不需要。

该字段与该类型的任何实例都没有关联 - 它与类型本身相关联。这基本上就是static在Java中的含义。您应该尝试忽略C ++中static的任何含义,我担心会有所不同。

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

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

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

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

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

答案 1 :(得分:1)

创建临时对象???

  

static keyword用于创建属于该类的字段和方法,而不是该类的实例。

Heavily recommending

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

答案 3 :(得分:1)

  

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

不。您可以使用类对象来调用方法。

答案 4 :(得分:1)

你使用了static和final关键字,两者都有不同的含义。

当使用static关键字声明任何变量时,它声明为类变量,表示它对该类的所有实例都是通用的。使用类名访问不需要使用实例。

E.g。

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

}

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

如果你用final声明static,那么它对所有人都是通用的,并且一旦声明并在编译时初始化就不允许改变。

到此处查看更多有趣的详细信息click here