按照道理来说String是不可以变的,final也是引用不变的,而类变量会先在构造器之前因为类初始化而初始化。那么它的值已经是定下来了啊。但是我在think in java一书里面看到一段代码是这样的。
class Person{
public final String first;....
public Person(String first,String last,String address){
this.first = first;....
}
}
这些是怎么回事呢?
class Person{
public final String first;....
public Person(String first,String last,String address){
this.first = first;....
}
}
这些是怎么回事呢?
public class PersonTest {
final String a; public PersonTest(String a) {
super();
this.a = a;
}// {
// this.a = "这是被允许的";
// }
public static void main(String[] args) {
PersonTest p = new PersonTest("这也是被允许的");
// PersonTest p = new PersonTest();
System.out.println(p.a);
}
}
如图,只要不用public修饰还是可以的因为public权限太大了
你好,这里你搞错一个问题吧,final修饰的,只要在new对象的时候初始化就OK了,编译异常是要求你构造器里必须对这个变量赋值,而不是必须创建时赋值; 如果加上static的话,那就是常量了,那创建的时候确实必须赋值。
如图,只要不用public修饰还是可以的因为public权限太大了你这里都直接把成员变量和局部变量混为一谈了,他这里的问题,具体请看#6我对上面这为朋友的回复。
若在定义成员变量的时候就对first进行了初始化,如public static final String first = “我是菜鸟”,此时就不能在构造方法中再次对fisrt成员变量进行赋值
-------------------------------------------ne
对于:final
友元定义只允许在实例构造器内初始化,在全局段初始化的代码,编译器自动移动代码 To 实例构造器内用户代码之前
静态定义与友元定义相同,但只允许“静态构造( [Java 称静态代码块])”
那么上面的问题就好解释了。
非静态的成员变量在使用前一定会先实例化类,那么只需要在构造方法或者块结束之前确保实例化即可。
对于不是final 的类变量来说,它们都会在类初始化前被赋一个值。但final类变量却好像不太相同,系统认为这个东西必须让你自己进行赋值,而不能只是使用其默认值(但凡定义一个保持不变的常量,其肯定要具有一定的意义)。
class Person{
public final String first;
String last,address;
public Person() {} /当定义时有final变量是 构造不能为空,这句会报错。
public Person(String first, String last, String address) {
this.first = first;
this.last = last;
this.address = address;
}
}class Person{
public String first;
String last,address;
public Person() {} /没有final变量,可以定义空构造
public Person(String first, String last, String address) {
this.first = first;
this.last = last;
this.address = address;
}
}