Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于RMI的程序结果_Java_Rmi - Fatal编程技术网

Java 关于RMI的程序结果

Java 关于RMI的程序结果,java,rmi,Java,Rmi,我有两个问题 结果将显示如下 11 11 11 12358 12358 为什么前三个结果相同 为什么第四个可以使用远程实现对象工作 代码如下: FibClient.java package fib; import java.rmi.Naming; import java.io.*; public class FibClient { public static void main(String args[]) { try { int numFib

我有两个问题

结果将显示如下

11

11

11

12358

12358

  • 为什么前三个结果相同
  • 为什么第四个可以使用远程实现对象工作
  • 代码如下:

    FibClient.java

    package fib;
    import java.rmi.Naming;
    import java.io.*;
    
    public class FibClient {
    
        public static void main(String args[]) {
            try {
                int numFibNum;
                String registryURL = "rmi://localhost:1099/fib";
                FibInterface h1 = (FibInterface)Naming.lookup(registryURL);
                numFibNum = 5;
                Fib c = new Fib();
                //numFibNum = Integer.parseInt(args[0]);
                for (int i=0; i<numFibNum; i++) {
                    h1.getNextFibNum(c);
                    System.out.print(h1.getNextFibNum(new Fib())+" ");
                }
                System.out.println();
    
                for (int i=0; i<numFibNum; i++) {
                    System.out.print(h1.getNextFibNum(h1.getFib(0,1))+" ");
                }
                System.out.println();
    
                Fib f = new Fib();
                for (int i=0; i<numFibNum; i++) {
                    System.out.print(h1.getNextFibNum(f)+" ");
                }
                System.out.println();
    
                FibImpl h2 = new FibImpl();
                for (int i=0; i<numFibNum; i++) {               
                    System.out.print(h2.getNextFibNum(f)+" "); 
                }
                System.out.println();
    
                f = new Fib();
                for (int i=0; i<numFibNum; i++) {               
                    f = h1.getNextFib(f);
                    System.out.print(f.getF1()+" ");                
    
                }
    
                System.out.println();   
            } catch(Exception ex) {
                ex.printStackTrace();
            }
        }
    
    }
    
    java

    package fib;
    import java.io.Serializable;
    @SuppressWarnings("serial")
    public class Fib implements Serializable {
    private int f0;
    private int f1;
    public Fib() {
        this(0,1);
    }
    public Fib(int f0, int f1) {
        this.f0 = f0;
        this.f1 = f1;
    }   
    public int getF0() {
        return f0;
    }
    public void setF0(int f0) {
        this.f0 = f0;
    }
    public int getF1() {
        return f1;
    }
    public void setF1(int f1) {
        this.f1 = f1;
    }   
    }
    

    回答第一个问题:在第一种情况下,您在每次远程调用时都要创建一个新的
    Fib
    对象,因此始终从0+1开始。在第三种情况下,即使在客户端维护相同的对象,通过RMI对其所做的更改也不可见

    不能通过RMI调用更改对象的内容,因为对象不同。当您调用RMI方法时,对象在另一端被序列化和反序列化,因此该对象实际上存在两个副本。在服务器端更改副本对客户端没有影响


    在第四种情况下,您使用一个本地对象来计算斐波那契数,因此当传递给该方法的对象发生更改时,新内容在调用代码中可见。

    回答第一个问题:在第一种情况下,您在每次远程调用时都创建一个新的
    Fib
    对象,所以你总是从0+1开始。在第三种情况下,即使在客户端维护相同的对象,通过RMI对其所做的更改也不可见

    不能通过RMI调用更改对象的内容,因为对象不同。当您调用RMI方法时,对象在另一端被序列化和反序列化,因此该对象实际上存在两个副本。在服务器端更改副本对客户端没有影响

    在第四种情况下,您使用一个本地对象来计算斐波那契数,因此很明显,当传递给方法的对象发生更改时,新内容在调用代码中可见

    package fib;
    import java.io.Serializable;
    @SuppressWarnings("serial")
    public class Fib implements Serializable {
    private int f0;
    private int f1;
    public Fib() {
        this(0,1);
    }
    public Fib(int f0, int f1) {
        this.f0 = f0;
        this.f1 = f1;
    }   
    public int getF0() {
        return f0;
    }
    public void setF0(int f0) {
        this.f0 = f0;
    }
    public int getF1() {
        return f1;
    }
    public void setF1(int f1) {
        this.f1 = f1;
    }   
    }