上课时老师讲的内容,回去回想了下,还是有些不清楚的地方,希望大神们帮忙解答写:
- class Test
- {
- /*
- Test()
- {
- NAME = "SSS";
- }
- */
- Test(String name)
- {
- NAME = name;
- }
-
- /*static
- {
- NAME = "SSS";
- }
- */
- public final String NAME;
- //public final String NAME = "SSSS";
- public static void main(String[] args)
- {
- //Test t = new Test();
- Test t = new Test("sss");
- //t.NAME = "sss";
- //t.setName("sss");
- System.out.println(t.NAME);
-
- }
- /*
- public void setName(String name)
- {
- NAME = name;
-
- }
- */
- }
复制代码
通过上面的程序不断修改注释符可以验证出如下结论:
final修饰的变量
1.可以通过带参数的构造方法对其赋值
2.也可以通过无参数构造方法对其初始化赋值
3.可以通过构造代码块初始化对其赋值
4.不能用静态代码块对其赋值
5.可以在定义时直接赋值
A.在创建对象后不能够直接对其赋值
B.创建对象后也不能通过其他方法对其赋值
我的困惑是:
上述无法赋值的结论就是说
创建对象后就不能对final修饰的变量进行赋值操作了
其在方法区的常量池中
通过能对其赋值的情况来看,
是不是可以得出结论:
构造方法和构造代码块是可以直接访问常量池中的自定义常量并可对其进行操作的。
而对象并没有这个权限
还是说:
在运行过程中是先走构造代码块和构造函数对自定义常量进行初始化赋值
然后自定义常量再进入常量池中的。 |
|