父类和子类两个东西,只是在”类“ 这个范围,到了对象实例时,就只有一个东西,我们能观察到的只有可见性的差别,当我们 new Parent() 或 new Child() 时就只得到一个东西,它就是 new 后面那个类型的,这决定了它拥有什么属性和方法。
Parent p = new Child(); 时这个对象实例依然是 Child 类型,终身不变。当它赋值给 Parent 的符号 p 时,编译器知道,现在 p 只有 Parent 中的方法可以被访问,如果有一个代码调用了 Child 才有方法就是编译错误。但我们都知道,我们可以通过反射动态地调用,对吗?这也在暗示,其实我们只是可见性变了,实例的类型并未改变。最终到底哪个方法或字段可见是由类决定的,这是定义过程。到了运行的时候就是由 new 后面的选用的类型确实的,不管你后来把这个 new 出来的东西赋值给了谁。
我们也不管 JVM 实现中如何处理内存存储问题,我们只要知道,你只是 new 了一个 Child 实例,仅此一个是你的程序可以直接或间接访问的,就算JVM实现中在隐藏地创建了关联的 Parent 对象 (似乎实际中并没有,也不必要),这个隐藏的也不应该被我们的程序以任何方式探测到,它应该是透明的。
在某些特殊实现中或者特殊情况下,生成实例不会调用构造方法。这句话可有依据?求解释[/quote]哥们,比如单例设计模式中,那种对象获取的方式,多例设计模式也可以这么理解。[/quote]
public class Pet {
private Pet(){
}
}
public class Dog extends Pet{
public static void main(String[] args) {
new Dog();
}
}
这是我写的请教下,下面报错了
Implicit super constructor Pet() is not visible for default constructor. Must define an explicit constructor[/quote]
父类构造函数被你私有化了,子类是看不到的,即无法调用。也就意味着,子类实例化的时候(new Dog())时,子类构造函数会自底向上调用父类构造函数(由于私有,不能调用,故报错)
在某些特殊实现中或者特殊情况下,生成实例不会调用构造方法。这句话可有依据?求解释[/quote]哥们,比如单例设计模式中,那种对象获取的方式,多例设计模式也可以这么理解。[/quote]
public class Pet {
private Pet(){
}
}
public class Dog extends Pet{
public static void main(String[] args) {
new Dog();
}
}
这是我写的请教下,下面报错了
Implicit super constructor Pet() is not visible for default constructor. Must define an explicit constructor