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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Demo3_Final {
  2.         public static void main(String[] args) {
  3.                 Demo d = new Demo();
  4.                 d.print();
  5.         }
  6. }
  7. /*
  8. * A:final修饰变量的初始化时机
  9.         * 显示初始化
  10.         * 在对象构造完毕前即可
  11. */

  12. class Demo {
  13.         final int num;                                                //成员变量的默认初始化值是无效值
  14.        
  15.         public Demo() {
  16.                 num = 10;
  17.         }
  18.         public void print() {
  19.                 System.out.println(num);
  20.         }
  21. }
复制代码
有关 num 变量的初始化,Demo对象d的建立过程,是否存在默认初始化;如果只有显示初始化,那final关键字的作用怎么理解呢?
求指教,,,



3 个回复

正序浏览
最后复习一下:
创建一个对象的过程做了哪些事情
1,Student s = new Student();
2,Student.class加载进内存
3,声明一个Student类型引用s
4,在堆内存中创建对象
5,给对象中属性默认初始化值
6,属性进行显示初始化
7,构造方法进栈,对对象中的属性赋值,构造方法弹栈
8,将对象的地址值赋值给s

这是我今天搜集的一些资料,不过对于问题还是有些疑问,继续求指导{:3_56:}
回复 使用道具 举报
问题结论:
(1)当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值。
问题分析:
(1)final 修饰符表示是个对象实例级常量,每个对象实例有自己单独的值。对象实例创建完成后,常量值不能改变!
(2)成员变量:有默认初始化值
(3)对于有 final 修饰的基本数据类型,如果不初始化,不能像没有final修饰的变量那样,输出默认值。
回复 使用道具 举报
相关知识补充:
(1)用final修饰的成员变量表示常量,值一旦给定就无法改变!
(2)常量池的好处
常量池是为了避免频繁的创建和销毁对象而影响系统性能,其实现了对象的共享。例如字符串常量池,在编译阶段就把所有的字符串文字放到一个常量池中。
—— 节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。
—— 节省运行时间:比较字符串时,==比equals()快。对于两个引用变量,只用==判断引用是否相等,也就可以判断实际值是否相等。
(3)对final属性在声明时就赋值,而且赋的值是常量的话,那编译器会将所有用到此属性的地方都替换成常量。
(4)对不是在编译时确定final属性值的情况下,final属性的值是可以改变的,让final属性在构造方法中初始化。
(5)相关分析:
—— final属性的值还是可以被改变的,但只有在特殊情况下(没有在编译时被替换),使用特殊的方式(像反射这样的方式),final属性的值才可以被改变。所以说一般情况下说final属性的值是不允许被修改的还是可以说的,但必须得知道这些例外情况。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马