Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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 如果对象调用前一状态的类函数,会发生什么_Java - Fatal编程技术网

Java 如果对象调用前一状态的类函数,会发生什么

Java 如果对象调用前一状态的类函数,会发生什么,java,Java,假设一个客户机有一个类的对象,而这个类已更改为新状态。如果该类调用以前的状态,会发生什么 例如: 我写了一节课如下 Class Old{ int a; } 假设我已经创建了Old类的新对象。我也序列化了这个对象。然后,我将旧类更改如下: Class Old{ int a; int b; } 如果我尝试使用新旧类取消序列化对象,会发生什么情况?由于客户端持有对该对象的引用,因此它将始终访问当前对象及其当前状态。类的实例不是有状态的,因为它们变得陈旧或无效 对某个位置的类实例的更改将可供引用该实

假设一个客户机有一个类的对象,而这个类已更改为新状态。如果该类调用以前的状态,会发生什么

例如:

我写了一节课如下

Class Old{
int a;
}
假设我已经创建了Old类的新对象。我也序列化了这个对象。然后,我将旧类更改如下:

Class Old{
int a;
int b;
}

如果我尝试使用新旧类取消序列化对象,会发生什么情况?

由于客户端持有对该对象的引用,因此它将始终访问当前对象及其当前状态。类的实例不是有状态的,因为它们变得陈旧或无效

对某个位置的类实例的更改将可供引用该实例的所有类访问

这个例子说明了上面的要点,因为类
State,B,C
都包含
A
的一个实例,它指向内存中的同一个点,
aka:reference
。当类
B
更改
A的状态时,会更改类
状态B、C所引用的内存实例

不要认为它是
C
changed
A
,所以现在
A
的所有实例都被更新了。想象一下,就像现在每个人都指向更新的对象一样

这是一个非常简单的现实生活的例子。假设我允许所有朋友编辑我的LinkedIn个人资料。把我的LinkedIn配置文件视为“A”。当我的所有朋友都查看我的个人资料(A)时,他们会看到我作为Web应用程序开发人员的头衔。现在,如果我的一个朋友(B)访问我的个人资料并将我的头衔更改为“流浪汉”(field),我的所有朋友(A、B、C)都将看到新的头衔。为什么我的其他朋友(州,C)不把“Web应用程序开发人员”作为我的标题(字段)?这是因为我的个人资料(A)有一个实例,任何有权访问该个人资料的人都可以查看或更新该个人资料

public class State {

    public static void main(String[] args) {
        A a = new A();
        B b = new B(a);
        C c = new C(a);

        System.out.println(a.field); //0
        System.out.println(b.a.field); //0
        System.out.println(c.a.field); //0

        b.change();

        System.out.println(a.field); //3
        System.out.println(b.a.field); //3
        System.out.println(c.a.field); //3

    }
}

class A{
    public Integer field = 0;
}

class B{
    public A a;

    public B(A a){
        this.a = a;
    }

    public void change(){
        this.a.field = 3;
    }
}

class C{
    public A a;

    public C(A a){
        this.a = a;
    }
}
正如Kevin所提到的,“由于客户端持有对该对象的引用,因此它将始终访问当前对象及其当前状态。”


但是如果您使用的是RMI和序列化,那么当您拥有的类和序列化的字节之间存在版本不匹配时,可能会出现反序列化问题。Java可以识别要反序列化的字节是否与本地类版本匹配。如果不是,它将抛出一个异常。SerialVersionId是用于序列化的类的唯一标识符。

如果旧实例被序列化并与新类反序列化,会发生什么情况?