怎么可能,本来String就是采用的是"原始模式",所有对String的赋值都是一次性的,然后就不能再改变,作的任何更改实际上是从新创建了一个String对象,你怎么试验的?的确String在Java中相当特殊,你可以看<Java Pitfalls>和<Java与模式>,上面都有对String特殊性的介绍.比如:
String s1="a";
String s2="a";
你认为s1,s2是否是同一个对象,答案是Yes;但是其他类的就不是
那么
boolean f(String s1){
String s2="a";
if(s1==s2)return true;
return false;
}
那么调用f("a");返回什么呢?返回的是false;
这又和编译器对String对象的处理有关系.在RMI中的传引用与本地JVM不相同,本地是传地址,而远程是传的该对象的objID,这个ID是由RMI服务器在导出(explore)服务存根(Stub)时自动生成的,假如ID一样,那么就是同一个对象(远程),可以看看<Java分布试开发>(SUN核心丛书系列)这本书

解决方案 »

  1.   


    "在不同的虚拟机中传值,也就是复制.只传递对象的状态,不传递对象的代码."这也不太正确,这要看情况而定.
    比如一个远程方法:  public void getSome(ServerClass a)throws RemoteException;
    这个方法要求客户传入ServerClass类型的参数,但是客户有如下类:
    ClientClass extends ServerClass{}
    那么ClientClass也是可以传到服务端的,但是现在服务端不知道ClientClass的代码,便不能反串行化,所以他要求客户将Clientclass传到服务端,但是在哪里找到该代码呢,所以就要求客户还要有一个地址指明,参数名称忘了,好久没用.反正原理就是这样.在我上面说的那本书上都有
      

  2.   

    不传递代码的,看看串行化的规范就知道了,要让客户(客户是相对的)知道代码,就必须制定codebase!
      

  3.   

    比如:
    String s1="a";
    String s2="a";
    你认为s1,s2是否是同一个对象,答案是Yes;但是其他类的就不是
    String在jvm里面都要预编译的。
      

  4.   

    那么假如不传递代码,怎么将我说的那种情况反串行化呢?设定codebase作用就是将代码地址告诉之,不然不设定他试试,或是把下面你的代码三掉试试!
      

  5.   

    传值吧
    制定codebase就是要让客户知道stub类的地址啊
    传递的是stub类的代码阿