首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于静态构造函数、方法和字段的几个问题

问关于静态构造函数、方法和字段的几个问题
EN

Stack Overflow用户
提问于 2010-09-15 00:01:05
回答 6查看 733关注 0票数 1

我对静态成员的行为有一些问题:

1)初始化静态字段和静态构造函数有区别吗?据我所知,静态字段是通过程序执行来初始化的。静态构造函数的成员的行为方式是相同的,还是它们在第一次使用时被初始化:

代码语言:javascript
复制
MyClass.myStaticField;

或者我必须先初始化MyClass:

代码语言:javascript
复制
Myclass m = new MyClass();  // static constructor is called
MyClass.myStaticField;      // and after that

2)我记得,静态字段不是垃圾回收的吗?这就是为什么我不应该实例化静态方法的原因吗?当我读到这个话题时,大多数人都声称,当你可以在静态和非静态之间选择时,你应该使用静态方法。

3)从具有静态构造函数的父类派生类时,是否存在必须指出的问题?

4)出于好奇,你能处理静态成员吗?

EN

回答 6

Stack Overflow用户

发布于 2010-09-15 00:07:34

静态字段和构造函数初始化之间的区别有点复杂,因为它在不同的框架版本之间是不同的。Jon在这个主题上写了一篇深入的博客文章,你应该看看。

静态字段就像普通值一样被垃圾回收。也就是说,当它们不能再被访问时,它们被收集。在许多情况下都会发生这种情况,其中最常见的是当AppDomain卸载时。静态字段是特定于AppDomain的,因此一旦卸载,它的成员就有资格进行集合(对于AppDomain中性类型,这可能会有所不同,但我不这么认为)。

处置静态成员是完全合法的,尽管如果您将已处置的值留在字段中,从而可供应用程序的其余部分访问,则可能会导致一些问题(应用程序的其余部分可能没有意识到它已被处置)

票数 3
EN

Stack Overflow用户

发布于 2010-09-15 00:04:39

静态方法也不能幸免于垃圾回收。你喜欢怎么用就怎么用。

静态字段通常不会被垃圾回收,因为它不会超出范围。但是,如果您将静态字段设置为null,则它用于引用的实例将成为垃圾收集的候选对象。您甚至可以在将静态字段设为空之前对其调用Dispose。

票数 1
EN

Stack Overflow用户

发布于 2010-09-15 00:10:08

静态字段和实例(非静态)字段具有非常不同的含义,在决定使用哪种字段之前,了解它们是很重要的。

静态变量或方法属于类,而不属于类的特定实例。每个类都有一个副本(无论您创建了多少个实例),并且可以在没有类的实例的情况下访问它。例如,

代码语言:javascript
复制
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

实例变量需要类的实例

代码语言:javascript
复制
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.这样的东西,因为它有构造函数和静态初始值设定项块。静态初始值设定项代码块编写为:

代码语言:javascript
复制
static {
   // initialize some static members here
}

通常,当实例变量/方法的值影响对象的单个实例时,使用实例变量/方法,而在不影响对象的单个实例时,使用静态变量和方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3710648

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档