我对静态成员的行为有一些问题:
1)初始化静态字段和静态构造函数有区别吗?据我所知,静态字段是通过程序执行来初始化的。静态构造函数的成员的行为方式是相同的,还是它们在第一次使用时被初始化:
MyClass.myStaticField;或者我必须先初始化MyClass:
Myclass m = new MyClass(); // static constructor is called
MyClass.myStaticField; // and after that2)我记得,静态字段不是垃圾回收的吗?这就是为什么我不应该实例化静态方法的原因吗?当我读到这个话题时,大多数人都声称,当你可以在静态和非静态之间选择时,你应该使用静态方法。
3)从具有静态构造函数的父类派生类时,是否存在必须指出的问题?
4)出于好奇,你能处理静态成员吗?
发布于 2010-09-15 00:07:34
静态字段和构造函数初始化之间的区别有点复杂,因为它在不同的框架版本之间是不同的。Jon在这个主题上写了一篇深入的博客文章,你应该看看。
静态字段就像普通值一样被垃圾回收。也就是说,当它们不能再被访问时,它们被收集。在许多情况下都会发生这种情况,其中最常见的是当AppDomain卸载时。静态字段是特定于AppDomain的,因此一旦卸载,它的成员就有资格进行集合(对于AppDomain中性类型,这可能会有所不同,但我不这么认为)。
处置静态成员是完全合法的,尽管如果您将已处置的值留在字段中,从而可供应用程序的其余部分访问,则可能会导致一些问题(应用程序的其余部分可能没有意识到它已被处置)
发布于 2010-09-15 00:04:39
静态方法也不能幸免于垃圾回收。你喜欢怎么用就怎么用。
静态字段通常不会被垃圾回收,因为它不会超出范围。但是,如果您将静态字段设置为null,则它用于引用的实例将成为垃圾收集的候选对象。您甚至可以在将静态字段设为空之前对其调用Dispose。
发布于 2010-09-15 00:10:08
静态字段和实例(非静态)字段具有非常不同的含义,在决定使用哪种字段之前,了解它们是很重要的。
静态变量或方法属于类,而不属于类的特定实例。每个类都有一个副本(无论您创建了多少个实例),并且可以在没有类的实例的情况下访问它。例如,
public class MyClass {
static int myInt = 5;
}
System.out.println(MyClass.myInt); // this prints 5
MyClass.myInt = 10;
System.out.println(MyClass.myInt); // this prints 10实例变量需要类的实例
public class MyClass {
private int myInt2;
public void setMyInt2(int val) {
myInt2 = val;
}
public int getMyInt2() {
return myInt2;
}
}
MyClass m1 = new MyClass();
MyClass m2 = new MyClass();
System.out.println(m1.getMyInt2()); // prints 0, the default value
System.out.println(m2.getMyInt2()); // prints 0, the default value
m1.setMyInt2(3);
m2.setMyInt2(5);
// each object operates on its own instance of the variable
System.out.println(m1.getMyInt2()); // prints 3
System.out.println(m2.getMyInt2()); // prints 5此外,没有static constructor.这样的东西,因为它有构造函数和静态初始值设定项块。静态初始值设定项代码块编写为:
static {
// initialize some static members here
}通常,当实例变量/方法的值影响对象的单个实例时,使用实例变量/方法,而在不影响对象的单个实例时,使用静态变量和方法。
https://stackoverflow.com/questions/3710648
复制相似问题