定如果义方法中的参数为对象变量,因为对象变量在传递时是传递其引用,这样方法中对对象变量的修改也会影响到调用语句中的对象变量,将对象变量 用final进行声明,会防止无意的修改而影响到调用方法。 在网上看到这段说明后 我做的测试:class A{
String s="A.s";

void f(){
System.out.println(s);
}
}
class B{ void f(final A a){
a.s="B.s";
System.out.println(a.s);
}
}
class Demo{

public static void main(String []args){
A a1=new A();
a1.f();
B b1=new B();
b1.f(a1);

a1.f();
}
}
运行结果如下:
A.s
B.s
B.s将对象变量 用final进行声明后  在此调用A.s以被修改  或者还有其他的办法在使用对象变量 作为参数后  不影响其方法使用呢?

解决方案 »

  1.   

    final A a  的意思是a不能被改变,而不不是指A.s不能改变。
    你可以尝试下:
    void f(final A a){
    a.s=new A();
    System.out.println(a.s);
    }
    看会发生什么。为了防止S被改变,最好的办法就是将其变为private或protected,然后添加getter/setter方法。
      

  2.   

    纠正:
    你可以尝试下:
    void f(final A a){
    a=new A();
    System.out.println(a.s);
    }
    看会发生什么。
      

  3.   

    final class A{
       String s="A.s";

    void f(){
    System.out.println(s);
    }
    }
    class B{ void f(final String s){
    s="B.s";//此行编译出错
    System.out.println(a);
    }
    }
    class Demo{

    public static void main(String []args){
    A a1=new A();
    a1.f();
    B b1=new B();
    b1.f(a1.s);

    a1.f();
    }
    }
      

  4.   

    接上,至于还有什么方法保证对象不可变,一是产生A的克隆对象,或者把A作成不可变类(具体的可以参考工厂模式,或者每次修改A的属性,都返回新的A的对象,保证原对象不变)
      

  5.   

    class B{ void f(final String s){
    s="B.s";//此行编译出错
    System.out.println(a);
    }
    }
    搂上的,你更改人家的东西?
      

  6.   

    用final修饰的引用 是不能改变了,就是说这个引用只能指向这个对象了,但不代表这个引用所指向的对象不能改变
      

  7.   

    我是学c++的,今天看了一天的thinking in java 我的理解是这样的:
    public static void main(String []args){
    A a1=new A();//这里al是在栈中,而A对象是分配在堆中.new返回的是引用.就是 al
    a1.f();
    B b1=new B();
    b1.f(a1);//这里传递的是引用而非对象
    }void f(final A a){         //这里相当于a=al,就是把对象的引用再引用一次!final 是指引用不变,而非对象不变!就相当于c++中的指针,指针不变(地址)。但指针的内容是可以变的!所以结果al就变了!
    a.s="B.s";  //这里是将所引用的对象(是对象)改变了。
    System.out.println(a.s);
    }不知道这样理解对不对?
      

  8.   

    纠正:
    void f(final A a){         //这里相当于a=al,就是把{引用的对象}再引用一次!
      

  9.   

    final A a;
    如果a是基本变量,那么就是值不能变
    如果a是引用,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的
      

  10.   

    knight12(12Knight) ,zxbjlu1983,eagle4510()等解释都不错