既然非静态构造函数里可以对静态字段赋值,那还要静态构造函数干嘛?

问题描述

既然非静态构造函数里可以对静态字段赋值,那还要静态构造函数干嘛?难道是为了在本类被实例化之前就可以使用静态字段吗?

解决方案

本帖最后由 syncsdn9 于 2016-03-23 16:29:23 编辑
解决方案二:
你没见过不需要实例化就能用的类吗?比如System.Array
解决方案三:
静态构造函数是你在调用这个函数的任何方法、属性(尤其是static的)之前执行,非静态构造函数是在new的时候才执行,这能一样吗?
解决方案四:
你最后句话还真说对了,静态字段与实例无关,不需要实例化就可以直接使用如果在非静态构造函数内对静态字段赋值,那么每次实例化的时候都会执行这个操作这样“随意”就可以修改静态字段值的行为在多线程编程中是很危险的,比如:classTest{publicTest(){IsActive=false;}publicstaticboolIsActive{get;privateset;}publicstaticvoidDoSthing(){IsActive=true;while(IsActive){if(xxx)break;}}}

调用DoSthing(),有可能本意是想直到满足xxx条件才退出,但是只要别的线程newTest()就会导致退出,此时可能什么都没做,跟方法的调用者设想的完全不同上面的例子有些极端,正常都不会那么写
解决方案五:
静态对象生命周期很长,一旦被引用,就不会被gc回收,需要手动释放。
解决方案六:
静态构造函数只是相对非静态构造函数的说辞而已静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用LoadLibrary方法。显然他被设计成:让你有悄悄完成一些工作的机会
解决方案七:
如果有个静态成员,然后要在静态构造函数里初始化,就可以直接通过静态方法调用了,没有静态构造函数,你就没办法初始化,你说在非静态构造函数里初始化,那可不行,因为静态方法不需要实例化就可以调用的,调用静态方法时,不会执行你的非静态构造函数,
解决方案八:
静态构造函数,更准确的描述应该叫做“类型构造器”,用于构造类型所需的信息。实例构造函数,更准确的描述应该叫做“对象构造器”,用于构造对象所需的信息。至于类型和对象的关系,这个就是基础中的基础了。

时间: 2024-09-03 07:07:12

既然非静态构造函数里可以对静态字段赋值,那还要静态构造函数干嘛?的相关文章

右值引用-移动构造函数里为什么要将参数赋值为空指针

问题描述 移动构造函数里为什么要将参数赋值为空指针 移动构造函数里为什么要将参数赋值为空指针 解决方案 这是移动语法啊.把数据移动成功后.本身变量清空.这样防止再次被使用 解决方案二: 似乎只是为了初始化变量而已 解决方案三: 应该只是为了初始化,以后的操作可以通过检测指针是否为空来判断指针是否被分配了内存. 解决方案四: 感觉其目的在销毁sp时不至于释放其内存

java-类是非静态的,而类中的主函数是静态的,静态方法为什么可以调用非静态类的内部类的非静态方法

问题描述 类是非静态的,而类中的主函数是静态的,静态方法为什么可以调用非静态类的内部类的非静态方法 代码如下所示,TestEX是非静态类,而它的主方法是静态的,TestEX类中含有两个内部类,两个内部类也是非静态的,内部类中的方法同样也是非静态的. 问题是:在静态的主方法中,实例化了内部类,为什么就可以调用非静态了呢? 哪个圈绕不出来了,求帮助! public class TestEX{ public class IntegerException extends Exception { Stri

C#构造函数里的base和this的区别

用法一: 父类的构造函数总是在子类之前执行的.既先初始化静态构造函数,后初始化子类构造函数. public class BaseCircle { public BaseCircle() { Console.WriteLine(" no arguments base constructor!!!"); } public BaseCircle(double arg) { Console.WriteLine("double arg base constructor!!!"

XHTML:非IE浏览器里对style.height赋值无效的问题

xhtml|浏览器|问题 今天我在做多页面MDI脚本控件(MzMultiPage),在IE等浏览器里都已经测试通过没有任何问题,但是在Mozilla.Firefox.Netscape里测试时问题就来了,我的多页面是在页面里用到了 iframe,这些 iframe 初始的 style.height 都是0,而在加载页面之后,iframe 就会自适应被加载的页面高度,我是通过 iframe.style.height=300 这样撑起 iframe 的高度,这样处理在IE系列浏览器里没有任何问题,但在

final修饰的终态变量只能在声明变量时或构造函数里赋值嘛?

问题描述 final修饰的终态变量只能在声明变量时或构造函数里赋值嘛? class GongChengShi { final String name;//名字 final String dizhi;//地址 int age;//年龄 public GongChengShi(String name, int age) { this.name = name;//构造函数初始化时给名字和年龄赋值 this.age = age; } void setDizhi(String dizhi){//在子类中调

c++-Qt为啥在构造函数里建立的radiobutton不显示

问题描述 Qt为啥在构造函数里建立的radiobutton不显示 MainWidget::MainWidget(QWidget *parent) : QMainWindow(parent) ui(new Ui::MainWidget){ int ij; for(i=0;i<10;i++) for(j=0;j<19;j++) { radio_arr[i][j] = new QRadioButton; init_RadioButton(radio_arr[i][j]40+j*3860+i*38);

c++ 类和对象-【C++】写在构造函数里的变量能够被同一个类中其他成员访问吗?为什么?

问题描述 [C++]写在构造函数里的变量能够被同一个类中其他成员访问吗?为什么? class rational { private: long denom,den; //denom为分子,den为分母 double a; public: rational(int n, int m) { denom=n; den=m;a=(double)denom/(double)den; //比如这里构造函数里的a能被其他成员函数访问吗?为什么? } int operator<(rational r) cons

select-php网页中查询非0或者非空结果的同时显示其字段名

问题描述 php网页中查询非0或者非空结果的同时显示其字段名 表名是2014: select * from `2014` where username= 4 得到一行结果后,怎么样才能取得非空的集合,像这样的,而不是连空值也显示出来.不要以固定的形式显示,要根据内容来显示字段. 解决方案 两种处理方案!一种是取出结果集,遍历的时候做判断如果空的则0跳过!第二种是查询数据库的时候按相应的列去做非空的判断!比如 username<>''或者username <> null! 不知道解决

下面模块代码,拨号时无法封送处理类型为“RASDIALPARAMS95”的字段“szEntryName”: 无效的托管/非托管类型组合(Array 类型的字段必

问题描述 ImportsSystem.Runtime.InteropServicesModulelinkPublichRasConnAsInt32'定义一个指向RAS调用的全局句柄PublicConstAPINULLAsInt32=0&PublicConstUNLENAsInt32=256PublicConstDNLENAsInt32=15PublicConstPWLENAsInt32=256PublicConstRAS95_MaxPhoneNumberAsInt32=128PublicCons