Compiling with the Sun 1.4.2_02 javac returns an error: C:\orpe\jtst>c:\j2sdk1.4.2_02\bin\javac Assign2This.java Assign2This.java:3: cannot assign a value to final variable this this = null; ^ 1 error可以看出,java是把this作为final处理的,可能是因为它只能指向自己的句柄。 怎么可以负值呢?
楼上,听看我后面贴的例子代码 我并不是要设this为null,而是要把当前的实例对象改变.
从error信息里可以看出,jvm是把this作为final处理的,当对象产生的时候,this已经被负值了 public class Assign2This { int id=-1; String name=null; String sex=null; //等等,很多. public Assign2This(int input){ this.id=input; } setInit() { //在这之前this已经有它指向的对象了,并且this为final的。 this = (Assign2This)XXX.getList(id); } }
靠.. 那怎么解决?扔到另一个方法里去set可以不.
//我想可能是这个意思 public class Assign2This { int id=-1; String name=null; String sex=null; //等等,很多. public Assign2This(int input){ this.id=input; } void setInit() { copy( (Assign2This)XXX.getList(id) ); } void copy(Assign2This at){ this.name=at.getName(); this.sex=at.getSex(); //..... } } //我想可能你想用id来初始化一个对象 //比如Assign2This at=new Assign2This(id); //但是如果你有一个方法XXX.getList(id)可以得到这个对象 //那为什么不直接Assign2This at=(Assign2This)XXX.getList(id)呢? //所以我认为改变this根本是没有必要的,先不管它可不可行
public class test { int x; public void setX (int xx) { this.x = xx; } public int getX () { return this.x; }
public void change(test t) { test tt = t; tt.setX(9); System.out.println(t.getX()); }public static void main(String[] args) { test v = new test(); v.setX(1); v.change(v); System.out.println(v.getX()); } }如果传递时对象的copy,change方法传进就是v的copy了? 但tt 得改变影响到了t。
public class Test implements Cloneable{ Test t1; private String x; private String y; public void printDetai() throws FileNotFoundException { System.out.println("X is " + this.x); System.out.println("Y is " + this.y); } /** * @return Returns the x. */ public String getX() { return x; } /** * @param x The x to set. */ public void setX(String x) { this.x = x; } /** * @return Returns the y. */ public String getY() { return y; } /** * @param y The y to set. */ public void setY(String y) { this.y = y; } public static void main(String[] args) throws CloneNotSupportedException { Test testObj = new Test(); testObj.setX("1"); testObj.setY("1"); Test newObj = (Test) testObj.clone(); newObj.printDetai(); } } 就是你要的东西吧!
public class TestThis { public TestThis(){} String a="我是空的"; String b="我也是空的"; public void setA(String input){ this.a=input; } public void setB(String input){ this.b=input; } public String getA(){ return a; } public String getB(){ return b; } private static TestThis getOne(){ TestThis he=new TestThis(); he.setA("哈哈"); he.setB("嘿嘿"); } public void huan(){ this=getOne(); //问题在这里,怎么把当前对象换成 getOne()取得的对象 } //运行,在这个里面我仅能调用public方法,不能调用getOne()方法 public static void main(String[] args) { TestThis testThis=new TestThis(); testThis.huan(); } }
Object o = new Object();
o=new Object();
如果你想让this指向其他对象,当然是不可能的。
不觉得奇怪吗?
比如public class Assign2This {
int id=-1; String name=null;
String sex=null;
//等等,很多. public Assign2This(int input){
this.id=input;
} setInit() {
this = (Assign2This)XXX.getList(id);
}
}
不知道各位能不能明白我的意思, XXX.getList(id)会返回一个Assign2This的实例我想在setInit()的时候直接把当前对象改成从XXX.getList(id)取回来的..
那如何取到该实例本身?
C:\orpe\jtst>c:\j2sdk1.4.2_02\bin\javac Assign2This.java
Assign2This.java:3: cannot assign a value to final variable this
this = null;
^
1 error可以看出,java是把this作为final处理的,可能是因为它只能指向自己的句柄。
怎么可以负值呢?
我并不是要设this为null,而是要把当前的实例对象改变.
public class Assign2This {
int id=-1; String name=null;
String sex=null;
//等等,很多. public Assign2This(int input){
this.id=input;
} setInit() {
//在这之前this已经有它指向的对象了,并且this为final的。
this = (Assign2This)XXX.getList(id);
}
}
那怎么解决?扔到另一个方法里去set可以不.
public class Assign2This {
int id=-1; String name=null;
String sex=null;
//等等,很多. public Assign2This(int input){
this.id=input;
} void setInit() {
copy( (Assign2This)XXX.getList(id) );
} void copy(Assign2This at){
this.name=at.getName();
this.sex=at.getSex();
//.....
}
}
//我想可能你想用id来初始化一个对象
//比如Assign2This at=new Assign2This(id);
//但是如果你有一个方法XXX.getList(id)可以得到这个对象
//那为什么不直接Assign2This at=(Assign2This)XXX.getList(id)呢?
//所以我认为改变this根本是没有必要的,先不管它可不可行
Assign2This at=(Assign2This)XXX.getList(id);而是想放在get方法里,如果值为null再去setInit(),setInit()后就是把XXX.getList(id)这个对象覆盖到当前对象目前我是一个一个的set了,就相当于你的copy方法
有没有别的更好的方法呢.
getInit(Assign2This inThis){
inThis=(Assign2This)XXX.getList(id);
}
setInit(){
getInit(this);
}通过这个方法改变this,但是行不通,把this穿到getInit()里面变成inThis后,这两个对象的内存地址也不同...
不过要特别注意的是,如果XXX.getList(id)得到的内部某个值是null,会造成死循环
int x;
public void setX (int xx) {
this.x = xx;
}
public int getX () {
return this.x;
}
public void change(test t) {
test tt = t;
tt.setX(9);
System.out.println(t.getX());
}public static void main(String[] args) {
test v = new test();
v.setX(1);
v.change(v);
System.out.println(v.getX());
}
}如果传递时对象的copy,change方法传进就是v的copy了?
但tt 得改变影响到了t。
Test t1;
private String x;
private String y; public void printDetai() throws FileNotFoundException {
System.out.println("X is " + this.x);
System.out.println("Y is " + this.y);
}
/**
* @return Returns the x.
*/
public String getX() {
return x;
}
/**
* @param x The x to set.
*/
public void setX(String x) {
this.x = x;
}
/**
* @return Returns the y.
*/
public String getY() {
return y;
}
/**
* @param y The y to set.
*/
public void setY(String y) {
this.y = y;
}
public static void main(String[] args) throws CloneNotSupportedException {
Test testObj = new Test();
testObj.setX("1");
testObj.setY("1");
Test newObj = (Test) testObj.clone();
newObj.printDetai();
}
}
就是你要的东西吧!
{
public TestThis(){} String a="我是空的";
String b="我也是空的"; public void setA(String input){
this.a=input;
}
public void setB(String input){
this.b=input;
} public String getA(){
return a;
}
public String getB(){
return b;
} private static TestThis getOne(){
TestThis he=new TestThis();
he.setA("哈哈");
he.setB("嘿嘿");
} public void huan(){
this=getOne(); //问题在这里,怎么把当前对象换成 getOne()取得的对象
} //运行,在这个里面我仅能调用public方法,不能调用getOne()方法
public static void main(String[] args)
{
TestThis testThis=new TestThis();
testThis.huan(); }
}
1.要么你copy内部的所有的值;
SomeClass sc=new SomeClass();
sc.copy(anotherClass);
2.要么你在对象赋值的地方显式指定指向另一个对象
Object o=new Object();
Object anotherObj=new Object();
o=anotherObj;
现在你想用的方法有点类似于
int a=2;
2=3;//通过改变2来改变a 但是2是final的,你不能改
因为this是final的,所以你这样做行不通的