A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Dylon 中级黑马   /  2015-4-28 00:04  /  787 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

上课时老师讲的内容,回去回想了下,还是有些不清楚的地方,希望大神们帮忙解答写:

  1. class Test
  2. {
  3.         /*
  4.         Test()
  5.         {
  6.                 NAME = "SSS";
  7.         }
  8.         */
  9.         Test(String name)
  10.         {
  11.                 NAME = name;
  12.         }
  13.        
  14.         /*static
  15.         {
  16.                 NAME = "SSS";
  17.         }
  18.         */
  19.         public final String NAME;
  20.         //public final String NAME = "SSSS";
  21.         public static void main(String[] args)
  22.         {
  23.                 //Test t = new Test();
  24.                 Test t = new Test("sss");
  25.                 //t.NAME = "sss";
  26.                 //t.setName("sss");
  27.                 System.out.println(t.NAME);
  28.                
  29.         }
  30.         /*
  31.         public void setName(String name)
  32.         {
  33.                 NAME = name;
  34.                
  35.         }
  36.         */
  37. }
复制代码


通过上面的程序不断修改注释符可以验证出如下结论:

final修饰的变量
       
        1.可以通过带参数的构造方法对其赋值
        2.也可以通过无参数构造方法对其初始化赋值
        3.可以通过构造代码块初始化对其赋值
        4.不能用静态代码块对其赋值
        5.可以在定义时直接赋值

        A.在创建对象后不能够直接对其赋值
        B.创建对象后也不能通过其他方法对其赋值

我的困惑是:

        上述无法赋值的结论就是说
创建对象后就不能对final修饰的变量进行赋值操作了
        其在方法区的常量池中

        通过能对其赋值的情况来看,
       
        是不是可以得出结论:
                构造方法和构造代码块是可以直接访问常量池中的自定义常量并可对其进行操作的。
                而对象并没有这个权限
       
        还是说:
                在运行过程中是先走构造代码块和构造函数对自定义常量进行初始化赋值
                然后自定义常量再进入常量池中的。

2 个回复

倒序浏览
求大神们讲解啊
回复 使用道具 举报
final在声明的时候就给他一个地址值,并且这个地址值不变,我在网上看到了这样一句解释:final是一个常量指针但是不是一个指向常量的指针。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马