Java中有很多关于static
和final
变量的讨论。
我真的想知道以下声明之间的区别。似乎令人困惑
public class foo() {
private static final int a;
private static int b;
private final int c;
private int d;
public static final int e;
public static int f;
public final int g;
public int h;
}
可以在班级内外修改/访问哪一个?
P.S:In Java, difference between default, public, protected, and private中的问题是一个更大的范围。我正专注于一些令人困惑的问题!
答案 0 :(得分:4)
private
表示只能通过类foo
的实例访问它。
public
表示可以从拥有对类foo
实例的引用的任何对象访问它。
static
表示它属于该类,因此它由所有foo
个实例共享。
final
表示无法更改其初始值。
final
属性无法修改。可以修改static
个属性,但请记住,所有实例都共享新值。 private
属性只能由foo
实例本身修改。
这意味着static final
属性:无法修改;由所有实例共享。
答案 1 :(得分:1)
public
属性可以从任何类访问。
private
属性只能在声明它的类中访问。 (这就是我们需要在其他类中包含getter和setter来检索私有变量的原因)
final
属性无法修改并设置为其他值。
static
属性在类本身及其实例中被访问。
答案 2 :(得分:1)
private static final int a; // accessed only / inside only
private static int b; // accessed and modified / inside only
private final int c; // accessed only / inside only
private int d; // accessed and modified / inside only
public static final int e; // accessed only / inside and outside
public static int f; // accessed and modified / inside and outside
public final int g; // accessed only / inside and outside
public int h; // accessed and modified / inside and outside
如你所见:
static
无论如何都没有效果final
将accessed and modified
缩减为accessed only
private
/ public
确定inside only
/ inside and outside
答案 3 :(得分:0)
在类标识符的上下文中,语句具有如下所述的含义:
首先,private
和public
关键字是访问符号,这意味着所有具有private
关键字的成员仅在声明它们的类的范围内可见。具有public
关键字的所有成员都可以在班级范围之外查看。
e.g
class foo{
public int myVar;
private int myBar;
}
现在,如果你实例化`foo'
foo f = new foo();
f.myVar // is valid
f.myBar // is invalid and generates compile time error.
static
关键字表示标识符的分配对于类的所有实例都是通用的,因此在编译器第一次遇到类型定义时分配此标识符。因为,任何类的类型分配只发生一次,所以只保留了一个静态字段实例,可以在该类的所有对象中访问它。
final
关键字表示(在标识符的上下文中),这些标识符可以初始化一次,然后关闭以进行任何修改。
(在方法的上下文中,它意味着派生类不能覆盖该方法)。
现在回到你的问题,以下陈述将意味着:
private static final int a;
// 'a' has scope local to the class and its value is accessible through Type
// and shared across all instances of that type and its value cannot be
// changed once initialised.
private static int b;
// 'b' has scope local to the class and its value is accessible through Type
// and shared across all instances of that type.
private final int c;
// 'c' has scope local to the class and its value cannot be changed once
// initialised.
private int d;
// 'd' has scope local to the class
public static final int e;
// 'e' has scope beyond the class, it can be accessed outside the class
// through an instance of this class and its value is accessible through
// Type and shared across all instances of that type
// and its value cannot be changed once initialised.
public static int f;
// 'f' has scope beyond the class, it can be accessed outside the class and
// value is accessible through Type and shared across all instances of that
// type
public final int g;
// 'g' has scope beyond the class, it can be accessed outside the class
// through an instance of this class
// and its value cannot be changed once initialised.
public int h;
// 'h' has scope beyond the class, it can be accessed outside the class
// through an instance of this class
干杯!
答案 4 :(得分:0)
public
- 声明为public的类,成员方法,构造函数,接口等可以从任何其他类访问。我们可以说它具有全局访问权。
private
- 声明为private的成员方法,memeber变量和构造函数只能在声明的类本身内访问。如果类中存在公共getter方法,则可以在类外部访问声明为private的变量。
final
- final将确保该字段为常量且无法更改
static
- 它与类型相关联,而不与实例相关联。即,对于所有对象,只有一个字段的副本,而不是每个对象的单个副本。意味着该字段的所有对象之间将共享一个字段副本
static final
- 该类的所有实例将共享相同的值,并且在首次初始化后无法修改。
答案 5 :(得分:-2)
private
意味着在课外不能看到它。 static
表示变量与类关联,而不是与对象关联。这意味着对于任何对象,其静态变量将由同一个类的所有对象共享。 (more information) final
表示一旦为变量赋值,就无法重新分配。在课堂外,您只能访问public
个变量,但无法修改final
个变量。