黑马程序员技术交流社区

标题: final问题 [打印本页]

作者: 浩临天下    时间: 2013-6-18 19:28
标题: final问题



public void method(final  int  i)
{

}

想阻止方法内部修改传进来的参数对象,
可不可以?

作者: shang1jk    时间: 2013-6-18 20:15
可以.
下面代码可以验证.
  1. class Test
  2. {
  3.         public static void main(String[] args)
  4.         {         
  5.                 new Test().test1(4);
  6.         }
  7.         
  8.         public void test1(final int x)
  9.         {
  10.                 x++;                        //这句注释掉之后就不报错了
  11.                 System.out.println(x);
  12.         }
  13. }
复制代码
虽然可以,  但是这么做好像没有太大意义..
作者: changweihua    时间: 2013-6-18 21:04
传的是值的副本,而不是引用
作者: 沐有鱼丸    时间: 2013-6-18 22:13
不可以,Java中全是值调用,方法得到的是所有参数值的一个拷贝,对于基本数据类型和String类,如果有方法类似
method(fina int i)
{
         //code.....
},或者
method(final String s)
{
     //code...
}就相当于:
method()
{
      final int i;
     //code...
}和
method(){
      final String s
      //code...
},
java中final修饰的变量是常量,常量必须在定义时初始化且不可更改,所以
method(final int i )
{
      i++; //编译不通过,报错
},final String s  类似,
对于自定义的引用数据类型,区别如下:
public class  Person{
    String name = "李四";
    int age = 20;
   public void updat1(Person p) {
     p.name="张三";   //没有final修饰,程序正确
     p.age = 34;
   }
public  void updat2(final Person p) {
     p.name="张四"; //程序正确,final修饰的变量指 该变量的引用不变,而引用指向的对象的属性内容是可以改变的
     p.age = 30;
   }
public  void updat3(final Person p) {
//    p = new Person(); //程序错误,该引用指向了另一个内存空间
   }
}       
所以final修饰引用数据类型时,只能保证该变量的引用不变,而该引用指向对象的内容是可以改变的。
作者: 孙百鑫    时间: 2013-6-24 23:56
楼主您好,由于帖子长时间没有动态,我已经讲帖子改成已解决了,如有问题,可以私聊我。{:soso_e100:}




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