我在网上找到了这个代码,其中的人正在实例化一个在类外有私有构造函数的类。我无法理解这是如何工作的,因为根据我之前读过的内容,你在类中使用私有构造函数,以便它不能在类之外实例化。
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
,但无法从中得到任何结果。
答案 0 :(得分:5)
看起来代码是通过序列化实例化对象然后将该对象强制转换为类A.这里调用的是A类构造函数。
答案 1 :(得分:2)
好吧,从不调用构造函数,因为对象没有被构造但是反序列化。因此,访问修饰符在此处没有效果。
序列化基本上是将堆的一部分内容写入某些流/文件等的过程。构造对象将在堆上创建一个新对象并调用构造函数来初始化它。然后它具有在序列化期间保留的状态。因此,在反序列化时不需要再次初始化该对象。这就像从流/文件中再次读取堆中的那部分内容一样。
除此之外,请记住,有办法通过使用反射来绕过访问修饰符。
答案 2 :(得分:1)
这与序列化有关,当你反序列化时,实际上没有调用构造函数。