A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔松鹤 中级黑马   /  2013-6-28 20:27  /  1318 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔松鹤 于 2013-6-29 17:33 编辑

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

(2)B aa = new B();

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

3 个回复

倒序浏览
本帖最后由 ﹏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类的部分,其余部分将被丢弃,这些丢弃的空间会在以后分配给其它资源

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
A aa = new B();

aa 应该只能映射到B中和A相同的部分,  就结果来说两者包含的东西应该是一样的
回复 使用道具 举报
这样理解:A是鸟类,B是鸟类中的一类(比如麻雀类);用new B()实例化的对象一定是鸟类对吧,而如果这样写B b = new A()实例化的不一定是麻雀了有可能是乌鸦对吧(鸟类包括所有的)?
至于B b = new B();就不用我说了吧?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马