java与无对象静态成员/函数访问

wxclj1h5  于 2021-06-30  发布在  Java
关注(0)|答案(5)|浏览(357)

我是一个刚接触java的c++新手,我想知道在没有类示例的情况下调用静态方法或访问静态字段会发生什么:

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()];

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

zy1mlcev

zy1mlcev1#

我无法想象一个临时对象被创建,
不。您可以使用class对象来调用该方法。

dly7yett

dly7yett2#

临时对象已创建???
static关键字创建属于类而不是类示例的字段和方法。
大力推荐

6tr1vspr

6tr1vspr3#

我想知道当我调用静态方法或访问静态字段而没有类的示例时会发生什么
它只是进入现场。。。就这么简单。它不会创建 Foo -不需要了。
该字段与类型的任何示例都没有关联-它与类型本身关联。那是什么 static 基本上是java的意思。你应该试着忽略 static 恐怕在c++中有些不同。
需要注意的一点是java设计中的一个问题——您可以通过引用访问静态成员,但这并不意味着您所期望的。例如:

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

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

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

应该尽量避免使用第一种形式的代码。这可能会产生误导,尤其是在调用方法时-看起来调用依赖于示例(也可能是多态的),但实际上这两种方法都不正确:(

krugob8w

krugob8w4#

您使用了static和final关键字,它们都有不同的含义。
当您使用static关键字声明任何变量时,那么它被声明为类变量,意味着它对该类的所有示例都是公共的。使用类名访问不需要使用示例。
例如

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

}

如果创建这个类的10个示例,那么将创建所有者的1个副本,而类型将只保留所有10个对象的一个公共副本。一个对象更改类型值,然后它将影响所有其他对象。
如果您使用final声明static,那么它对所有人来说都是公共的,并且在编译时声明和初始化后也不允许更改。
点击这里查看更多有趣的细节

fgw7neuy

fgw7neuy5#

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

相关问题