请问你为什么要替换this呢?有什么理由么?

解决方案 »

  1.   

    this = null;这是火星上东西。google一下this用法,其代表当前类的实例。亏你还4个三角形。
    Object o = new Object();
    o=new Object();
      

  2.   

    我用的jdk1.3来编译运行是没问题的,而且outprint出来的t也不是null,是一个object地址,我给class加了一个变量,也可以通过t.xxx来打印出来。也许这是sun自己定义的规则,我想没有必要问为什么。正比如你使用了int i;二不赋值的时候,各个编译器给得初始值也不同,只要知道避免这样写就行了。
      

  3.   

    this 返回的是当前对象的指针.
    如果你想让this指向其他对象,当然是不可能的。
      

  4.   

    打个比方,502作为某个房间的句柄,this就指向该房间,你却像让502指向其他的房间。
    不觉得奇怪吗?
      

  5.   

    那如何替换当前类的列值?
    比如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)取回来的..
      

  6.   

    this.xxx 可以取到改实例的字段
    那如何取到该实例本身?
      

  7.   

    我这不是钻牛角尖啊难道方法只能是从 getList(id)中取出实例,然后把变量get出来,再set到当前对象里????
      

  8.   

    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处理的,可能是因为它只能指向自己的句柄。
    怎么可以负值呢?
      

  9.   

    楼上,听看我后面贴的例子代码
    我并不是要设this为null,而是要把当前的实例对象改变.
      

  10.   

    从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); 
      }
    }
      

  11.   

    靠..
    那怎么解决?扔到另一个方法里去set可以不.
      

  12.   

    //我想可能是这个意思
    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根本是没有必要的,先不管它可不可行
      

  13.   

    楼上,就是这个意思但是我一定要写这个copy方法吗?一个一个set一遍?因为XXX.getList(id)是需要消耗cpu的,所以我不想在初试Assign2This实例的时候就
    Assign2This at=(Assign2This)XXX.getList(id);而是想放在get方法里,如果值为null再去setInit(),setInit()后就是把XXX.getList(id)这个对象覆盖到当前对象目前我是一个一个的set了,就相当于你的copy方法
    有没有别的更好的方法呢.
      

  14.   

    飞天红猪侠胡说,通过方法参数传进去的对象绝对不是句柄,而且是完完全全的copy对象如果是句柄的话我可以
    getInit(Assign2This inThis){
        inThis=(Assign2This)XXX.getList(id);
    }
    setInit(){
      getInit(this);
    }通过这个方法改变this,但是行不通,把this穿到getInit()里面变成inThis后,这两个对象的内存地址也不同...
      

  15.   

    你想推迟赋值,好像就这个方法了
    不过要特别注意的是,如果XXX.getList(id)得到的内部某个值是null,会造成死循环
      

  16.   

    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。
      

  17.   

    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();
    }
    }
    就是你要的东西吧!
      

  18.   

    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(); }
    }
      

  19.   

    getOne()方法里忘了return he;了
      

  20.   

    我觉得前面已经说得很清楚了,两种方法:
    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的,所以你这样做行不通的