黑马程序员技术交流社区

标题: 基类和子类的实例化问题 [打印本页]

作者: 崔松鹤    时间: 2013-6-28 20:27
标题: 基类和子类的实例化问题
本帖最后由 崔松鹤 于 2013-6-29 17:33 编辑

如果A是某一基类,B是A的一个子类。
下面两种初始化的区别:
(1)A aa = new B();

(2)B aa = new B();
作者: ﹏Lifeヽ    时间: 2013-6-28 22:10
本帖最后由 ﹏Lifeヽ 于 2013-6-28 22:11 编辑

(1)A aa = new B();
通过aa.的是基类(A)的方法和字段,(调用B里面派生自A类的部分 )!前提是被调用的方法和字段必须声明为public ,如果在同一个类中则不必声明为public

(2)B aa = new B();

通过aa.调用子类的方法和字段!前提是被调用的方法和字段必须声明为public 如果在同一个类中则不必声明为public


扩展:
B派生自A,那么显然B是A的扩展,也就是说B具备所有A具备的特性,
而且还有自身的特性,因此从类的实例化后的占用空间来看,B的对象空间比A的对象要大,
而且空间的一部分结构是和A一致的。A *a=new B();这个指定了a是A类型的指针,
但是实例化是来自B,因此new B()这句话产生的类空间有一部分B自由特性的东西a将无法应用到,
那么a所指向的空间智能访问到B里面派生自A类的部分,其余部分将被丢弃,这些丢弃的空间会在以后分配给其它资源
作者: ゞ灬伊夏風    时间: 2013-6-29 15:43
A aa = new B();

aa 应该只能映射到B中和A相同的部分,  就结果来说两者包含的东西应该是一样的
作者: 关关雎鸠    时间: 2013-6-30 12:46
这样理解:A是鸟类,B是鸟类中的一类(比如麻雀类);用new B()实例化的对象一定是鸟类对吧,而如果这样写B b = new A()实例化的不一定是麻雀了有可能是乌鸦对吧(鸟类包括所有的)?
至于B b = new B();就不用我说了吧?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2