定如果义方法中的参数为对象变量,因为对象变量在传递时是传递其引用,这样方法中对对象变量的修改也会影响到调用语句中的对象变量,将对象变量 用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以被修改 或者还有其他的办法在使用对象变量 作为参数后 不影响其方法使用呢?
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以被修改 或者还有其他的办法在使用对象变量 作为参数后 不影响其方法使用呢?
你可以尝试下:
void f(final A a){
a.s=new A();
System.out.println(a.s);
}
看会发生什么。为了防止S被改变,最好的办法就是将其变为private或protected,然后添加getter/setter方法。
你可以尝试下:
void f(final A a){
a=new A();
System.out.println(a.s);
}
看会发生什么。
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();
}
}
s="B.s";//此行编译出错
System.out.println(a);
}
}
搂上的,你更改人家的东西?
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);
}不知道这样理解对不对?
void f(final A a){ //这里相当于a=al,就是把{引用的对象}再引用一次!
如果a是基本变量,那么就是值不能变
如果a是引用,final只对引用的“值”(也即它所指向的那个对象的内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的