黑马程序员技术交流社区
标题:
关于被final修饰的变量的问题
[打印本页]
作者:
Dylon
时间:
2015-4-28 00:04
标题:
关于被final修饰的变量的问题
上课时老师讲的内容,回去回想了下,还是有些不清楚的地方,希望大神们帮忙解答写:
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修饰的变量进行赋值操作了
其在方法区的常量池中
通过能对其赋值的情况来看,
是不是可以得出结论:
构造方法和构造代码块是可以直接访问常量池中的自定义常量并可对其进行操作的。
而对象并没有这个权限
还是说:
在运行过程中是先走构造代码块和构造函数对自定义常量进行初始化赋值
然后自定义常量再进入常量池中的。
作者:
Dylon
时间:
2015-4-28 00:06
求大神们讲解啊
作者:
q8893616
时间:
2015-4-28 23:25
final在声明的时候就给他一个地址值,并且这个地址值不变,我在网上看到了这样一句解释:final是一个常量指针但是不是一个指向常量的指针。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2