2

我在网上找到了这段代码,该人正在实例化一个在类外具有私有构造函数的类。我无法理解这是如何工作的,因为从我之前读过的内容来看,您在类中使用了私有构造函数,因此它不能在类之外实例化。

public final class A extends B {
  private A(Something, Something)
  {
    //Something
  }

  public void someMethods()
  {
    //Something
  }
}

public final class B {
  private A a;
  public void someMethod()
  {
    final ObjectInputStream objectInputStream = new ObjectInputStream(
                            new ByteArrayInputStream(buffer.toByteArray()));
    a = (A) objectInputStream.readObject();
    objectInputStream.close();

    a.someMethods();
  }
} 

我只是想了解这里到底发生了什么?我试着继续阅读,ObjectInputStream但无法从中得到任何东西。

4

3 回答 3

5

看起来代码正在通过序列化实例化一个对象,然后将该对象强制转换为 A 类。这里没有调用 A 类构造函数。

于 2012-08-13T16:46:29.630 回答
2

好吧,构造函数永远不会被调用,因为对象不是被构造而是反序列化的。因此,访问修饰符在这里没有作用。

序列化基本上是将堆的部分内容写入某个流/文件等的过程。构造一个对象将在堆上创建一个新对象并调用构造函数对其进行初始化。然后它具有在序列化期间保留的状态。因此,在反序列化时无需再次初始化该对象。这就像再次将堆的那部分从流/文件读取到内存中一样。

除此之外,请记住,有一些方法可以通过使用反射来规避访问修饰符。

于 2012-08-13T16:49:25.133 回答
1

这与序列化有关,当您反序列化时,实际上并未调用构造函数。

于 2012-08-13T16:45:03.027 回答