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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔朋朋 中级黑马   /  2012-9-30 00:00  /  1513 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔朋朋 于 2012-9-30 10:36 编辑

问题1:static 变量分配在静态域中,而final 变量分配在常量池中,而这两种变量都实现了对象间数据共享,这两中变量在用途上有啥区别?

问题2:又如这条语句  private static String str=new String("abc");中   str 、new String() 、"abc" 这三者在内存是如何创建、如何指向的?

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

2 个回复

正序浏览
这两种变量都实现了对象间数据共享,但static所修饰的变量值时可以改变的,final所修饰的值是不可以改变的,或初始化时没有赋值,仅可以在构造函数中赋值一次。
private static String str=new String("abc");
1.赋值语句首先看右边:new String("abc"); 这条语句用String的构造函数创建了一个字符串,它首先会查看字符串池中有没有"abc"这条字符串。如果有,就创建一个引用指向这条字符串;如果没有,就创建该字符串。
2.然后看左边:private static String str,该语句会在静态区开辟一块空间,存放第一步中创建字符串的地址,也就是指向第一步中创建的字符串。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.static修饰的变量值可以改变,而final修饰的变量值不可改变。
2.关于分配内存,String str=new String();这个语句已建立,就要首先给对象str分配内存,然后调用默认初始化构造函数初始化;而你的string(abc),那这个就是调用有参构造函数来进行初始化,new String()获取地址传给str,str在堆栈,而abc在堆中。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马