黑马程序员技术交流社区

标题: 关于final与static的小知识点 [打印本页]

作者: 黑马张立国    时间: 2012-5-6 19:43
标题: 关于final与static的小知识点
final  SringBuffer fsb= new StringBuffer("abc")
static  SringBuffer ssb= new StringBuffer("abc")
fsb=new StringBuffer("bro")  错      
fsb.append("bro") 对   
ssb=new StringBuffer("bro")对
ssb.append("bro")错      
上面的例子总结:
fianl   引用不能变,引用的对象可变
static   引用能变,引用的对象不能变
当被 final static同时修饰时  两者都不能变,但可以赋值给同类型的另一个变量
例如:   static  fianl  SringBuffer sfsb= new StringBuffer("abc");
              StringBuffer  str = null;
              str = sfsb;(这个地方是否有点绕,想一下内存图)
学习的知识积累 希望对在学基础的兄弟们有帮助
作者: 张小锋    时间: 2012-5-7 05:04
对楼主的提问,我稍有不同见解:
final  SringBuffer fsb= new StringBuffer("abc")
static  SringBuffer ssb= new StringBuffer("abc")
fsb=new StringBuffer("bro")  错      
fsb.append("bro") 对   
ssb=new StringBuffer("bro")对
ssb.append("bro")错                              ???,你确定会报错吗?我的就没问题啊
上面的例子总结:
fianl   引用不能变,引用的对象可变                        此处我要斧正的就是final修饰引用属性的时候,地址不可改变,但属性本身的值可以改变
static   引用能变,引用的对象不能变                   你想得太多了吧,他不就是一个静态初始化标志吗?,为什么不能给static对象重新赋值呢?
当被 final static同时修饰时  两者都不能变,但可以赋值给同类型的另一个变量      
我觉的此句不严谨,如果修饰引用类型,是引用的地址不能改变,如果是基本数据类型就是值不能变。


作者: —__    时间: 2012-5-7 05:35
潇洒飘过
意思一样
作者: 黑马张立国    时间: 2012-5-7 14:08
恩 好想不严谨,这是我学习总结的,如下是具体例子:
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

     使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:

     Final StringBuffera=newStringBuffer("immutable");
执行如下语句将报告编译期错误:

     a=newStringBuffer("");
但是,执行如下语句则可以通过编译:

a.append(" broken!");

     有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final  StringBuffer  param)

{

}

     实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

     param.append("a");
使用static关键字修饰一个变量时,是引用不能变,还是引用的对象不能变?

关于static确实是我想多了(学晕了,总结了错误结果),而最后一句,我是想表达这样的意思
public class ListTest {
public static final int x=1;
public static void main(String[] args){
int y=x;
System.out.println(y);
}
}
感谢你的帮助,要不然我还在错误中呢,谢谢

作者: H_H_K    时间: 2012-5-7 14:31
学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2