我在这里有一个简单的问题。如果我在主类中 [declared] 的对象中声明一个变量,如下所示:
public static int number;
(通常我这样声明:
private int number;
)
它可以在主类中也被[声明]的不同对象中使用吗?顺便说一句,我不关心安全atm,我只想做点什么,不关心保护)
我在这里有一个简单的问题。如果我在主类中 [declared] 的对象中声明一个变量,如下所示:
public static int number;
(通常我这样声明:
private int number;
)
它可以在主类中也被[声明]的不同对象中使用吗?顺便说一句,我不关心安全atm,我只想做点什么,不关心保护)
以下是 Java 语言规范中的一句名言:
static
字段如果声明
static
了一个字段,则无论最终可能创建多少个类的实例(可能为零),都只存在该字段的一个化身。一个static
字段,有时称为类变量,在类初始化时体现。未声明的字段
static
(有时称为非static
字段)称为实例变量。每当创建一个类的新实例时,都会为该类或其任何超类中声明的每个实例变量创建一个与该实例关联的新变量。[示例程序如下...]
简而言之,static
字段是一个类变量:它属于类,而不是类的实例。在某种程度上,您可以将 static
字段视为由类的实例共享的变量,但将字段视为属于类更为一致static
,就像static
方法也属于类等一样。
由于它们属于该类,因此它们不需要访问所述类的实例(假设有足够的可见性),事实上,static
通过实例而不是类型表达式访问成员被认为是不好的编程习惯。
这里实际上有两个问题:内部类上下文中的公共与私有,以及静态变量。
第1部分:
static意味着您不需要类的实例来访问该变量。假设您有一些代码,例如:
class MyClass {
public static String message = "Hello, World!";
}
您可以通过以下方式访问该属性:
System.out.println(MyClass.message);
如果您删除static关键字,您将改为:
System.out.println(new MyClass().message);
您正在实例的上下文中访问该属性,它是由new关键字创建的类的副本。
第2部分:
如果在同一个 java 文件中定义了两个类,其中一个必须是内部类。一个内部类可以有一个静态关键字,就像一个属性一样。如果是静态的,可以单独使用。如果不是静态的,则只能在类实例的上下文中使用。
前任:
class MyClass {
public static class InnerClass {
}
}
然后你可以这样做:
new MyClass.InnerClass();
如果没有“静态”,您将需要:
new MyClass().new InnerClass(); //I think
如果内部类是静态的,它只能从外部类访问静态属性。如果内部类是非静态的,它可以访问任何属性。内部类不遵守public、protected或private的规则。所以以下是合法的:
class MyClass {
private String message;
private class InnerClass {
public InnerClass() {
System.out.println(message);
}
}
}
如果内部类有关键字static,这将不起作用,因为message不是静态的。
static
变量由给定类的所有实例共享。如果是public
,它对所有东西都是可见的。非静态变量只属于一个实例。
由于您的main
方法是static
,它只能看到static
变量。但是你应该避免静态工作——创建一个类的实例,并将数据作为方法/构造函数参数传递,而不是通过static
变量共享它。
如果持有“数字”的类称为 MyClass,您可以从任何方法将其称为 MyClass.number。
但是,为变量这样做并不是好的设计。