关于静态成员:java对象,共享变量

java objects, shared variables

我有一个简单的问题。如果我在一个在主类中被[声明]的对象中声明一个变量,如下所示:

1
public static int number;

(通常我这样声明:

1
private int number;

)

它能用在另一个对象中吗?这个对象也是在主类中被声明的?顺便说一句,我不在乎ATM的安全性,我只想做点工作,不在乎保护)


下面是Java语言规范的一个引述:

JLS 8.3.1.1 static字段

If a field is declared static, there exists exactly one incarnation of the field, no matter how many instances (possibly zero) of the class may eventually be created. A static field, sometimes called a class variable, is incarnated when the class is initialized.

A field that is not declared static (sometimes called a non-static field) is called an instance variable. Whenever a new instance of a class is created, a new variable associated with that instance is created for every instance variable declared in that class or any of its superclasses.

[Example program follows...]

简而言之,static字段是一个类变量:它属于类,而不是类的实例。在某种程度上,您可以将static字段视为类实例共享的变量,但将static字段视为属于类更为一致,就像static方法也属于类等。

由于它们属于类,因此不需要访问所述类的实例(假设有足够的可见性),实际上,通过实例而不是类型表达式访问static成员被视为糟糕的编程实践。

相关问题

  • Java静态方法最佳实践
  • 静态方法
  • Java中静态方法调用非静态方法
  • 非静态变量不能从静态上下文引用(Java)
  • 何时不在Java中使用静态关键字?
  • 静态变量和方法

这里实际上有两个问题:内部类上下文中的public和private,以及静态变量。

第1部分:

静态意味着您不需要类的实例来访问该变量。假设您有如下代码:

1
2
3
class MyClass {
 public static String message ="Hello, World!";
}

您可以通过以下方式访问该属性:

1
System.out.println(MyClass.message);

如果删除静态关键字,则应执行以下操作:

1
System.out.println(new MyClass().message);

您正在实例上下文中访问属性,该实例是由new关键字创建的类的副本。

第2部分:

如果在同一个Java文件中定义了两个类,其中一个必须是内部类。内部类可以有一个静态关键字,就像属性一样。如果是静态的,可以单独使用。如果不是静态的,则只能在类实例的上下文中使用。

前任:

1
2
3
4
class MyClass {
 public static class InnerClass {
 }
}

然后你可以做:

1
new MyClass.InnerClass();

如果没有"静态",您将需要:

1
new MyClass().new InnerClass(); //I think

如果内部类是静态的,则只能从外部类访问静态属性。如果内部类是非静态的,它可以访问任何属性。内部类不尊重公共、受保护或私有的规则。因此,以下是合法的:

1
2
3
4
5
6
7
8
9
class MyClass {
 private String message;

 private class InnerClass {
  public InnerClass() {
   System.out.println(message);
  }
 }
}

如果内部类具有关键字static,这将不起作用,因为消息不是static。


如果包含"数字"的类称为MyClass您可以从任何方法中将其称为myclass.number。

但是,对变量执行此操作并不是好的设计。


static变量由给定类的所有实例共享。如果是public,它对任何事物都是可见的。非静态变量只属于一个实例。

由于您的main方法是static方法,它只能看到static变量。但是您应该避免静态工作——创建一个类的实例,并将数据作为方法/构造函数参数传递,而不是通过static变量共享它。