具有私有构造的类在类外实例化

时间:2012-08-13 16:37:58

标签: java

我在网上找到了这个代码,其中的人正在实例化一个在类外有私有构造函数的类。我无法理解这是如何工作的,因为根据我之前读过的内容,你在类中使用私有构造函数,以便它不能在类之外实例化。

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,但无法从中得到任何结果。

3 个答案:

答案 0 :(得分:5)

看起来代码是通过序列化实例化对象然后将该对象强制转换为类A.这里调用的是A类构造函数。

答案 1 :(得分:2)

好吧,从不调用构造函数,因为对象没有被构造但是反序列化。因此,访问修饰符在此处没有效果。

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

除此之外,请记住,有办法通过使用反射来绕过访问修饰符。

答案 2 :(得分:1)

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