站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题static final 类型的数据成员如何初始化?

static final 类型的数据成员如何初始化?

摘要: static final 类型的数据成员如何初始化?


public class test{
private static final a;
private test(){
a=0;
}
public static method1(){}
public static method2(){}
......
public static init(){}
}
其中构造函数为私有,其余成员函数都为static,有一个init(),
1构造函数报错,如何初始化?
2请问为了把数据初始化是否把构造函数放入init()中?


如果要静态初始化可以这样写
public class Test{
static{
//初始化代码,注意这里面的所有引用到的非局部变量 都要是静态的
}
}


private static final int a=0;这个是常量。


楼主为什么要这样做啊?static final必须在定义的时候初始化。


private static final int a=0;这个必须在定义的时候赋值,在程序中不可以改变它的数值!


1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.

public class test{
public static a;
private test(){
a=0;
}
}
如果属性被修饰为static静态类资源,那么这个字段永远只有一个,也就是说不管你new test()多少个类的对象,操作的永远都只是属于类的那一块内存资源.例如:
test t1=new test();
t1.a=10;
test t2=new test();

System.out.println(t1.a);
System.out.println(t2.a);
System.out.println(test.a);

结果是3个0
2.final 用于声明属性,方法和类,分别表示属性一旦定义必须初始化并且以后不可变,方法一旦定义必须有实现代码并且子类里不可被覆盖,类一旦定义不能被定义为抽象类或是接口,因为不可被继承。
而你的代码里对final修饰的属性进行了修改,所以错误.


final定义一个变量后这个变量就将成为常量,不能再被改变,楼上的说的很详细了


感谢各位,
我举a=0只是个例子,我的目的是用init()方法产生的值对a进行赋值,我要做的是
public class test{
private static final a;
private test(int b){
a=b;
}
public static method1(){}
public static method2(){}
......
public static init(){
int b=amethod();
test(b);
}
}
据我所知,不是能够对final的值在构造函数中赋值吗?
但是针对我上面的要求我现在脑子里比较糊涂,觉得乱套了,各位有什么解决方法吗?



2.final 用于声明属性,方法和类,分别表示属性一旦定义必须初始化并且以后不可变,方法一旦定义必须有实现代码并且子类里不可被覆盖,类一旦定义不能被定义为抽象类或是接口,因为不可被继承。
而你的代码里对final修饰的属性进行了修改,所以错误.

这里说的还不够明白吗?被final修饰的类的属性,也就是你的a ,一但定义就必须赋初始化值,以后任何地方不能再改变.也就是说:private static final a;这句是错的,必须private static final int a=0;


上面都说完啦。。
路过


lip009(深蓝忧郁)已经把final的用法讲的很明白了,搞的我都没有什么要说的了


请教lip009(深蓝忧郁),下面这段话不是说明可以在构造函数中对final属性进行赋值吗?

当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。下面这段代码演示了这一点:


import java.util.List;
import java.util.ArrayList;
import java.util.LinkedList;
public class Bat{
final PI=3.14; //在定义时便给址值
final int i; //因为要在构造函数中进行初始化,所以此处便不可再给值
final List list; //此变量也与上面的一样
Bat(){
i=100;
list=new LinkedList();
}
Bat(int ii,List l){
i=ii;
list=l;
}
}


如果在定义的时候没有被初始化,那么就必须在构造函数里初始化
是对的!


汗自己一个...以前没注意到!


那我现在的问题是我用private final int a;在构造函数中初始化正确,
但用private static final int a;则报错;
为什么?


不会吧..我刚才试过了可以的撒,没有报错


发现问题所在,如果类的属性同时被修饰为static和final,那么此属性属于类本身资源,所以只能通过static{a=0;}静态块或者是定义的时候来初始化.


原因应该是:
当这个属性被修饰为static的时候,他属于类的资源,那么就是类在被加载进内存的时候就要已经为此属性分配了内存,所以此时属性已经存在,它有被final修饰,所以必须在属性定义了以后就给其初始化值.而构造函数是在当类被实例化的时候才会执行,所以用构造函数,这时候这个属性没有被初始化.程序就会报错.而static块是类被加载的时候执行,且只执行这一次,所以在static块中可以被初始化.
当这个属性被修饰为final,而非static的时候,它属于类的实例对象的资源,当类被加载进内存的时候这个属性并没有给其分配内存空间,只有当类被实例化的时候这个属性才被分配内存空间,所以每个类的实例都有一个此属性,分别是不同的,而实例化的时候执行了构造函数,所以属性被初始化了,也就符合了当它被分配内存空间的时候就需要初始化,以后不再改变的条件.


----------------------------------------------------------------
那我现在的问题是我用private final int a;在构造函数中初始化正确,
但用private static final int a;则报错;
为什么?
----------------------------------------------------------------
上面这两句看起来只差一个static,意义差别却很大。
static只与类名相关,与具体的类实例无关,它不应出现在与类实例相关的构造函数中,所以会报错。
唉,啰哩啰嗦地不知说明白了没有?


static函数不能调用non-static成员,而程序中是non-static函数调用static成员,乍一看我还以为是对的,呵呵,其实这还是编程习惯问题,一般建议对于final成员在定义时候就应该初始化,这样总没错。恩,这个问题看似简单,但是要把原因说清楚也不容易,楼上红猩猩说的不错


↑返回目录
前一篇: 建立中文文件建名出現亂碼?
后一篇: 如何获得文件大小?