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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨华东 中级黑马   /  2013-4-20 13:03  /  1615 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨华东 于 2013-4-20 13:20 编辑
  1. class Fu {
  2.           static int a=99;
  3. }

  4. class Zi extends Fu{
  5.         static int a=90;
  6. }
  7. public class Demo2{
  8.         public static void main(String[] args){
  9.                 Fu f=new Zi();
  10.                 System.out.print(f.a);
  11.         }
  12. }
复制代码
此面试题运行结果:99
此中的a不存在覆盖。原因是:a先于对象的存在。
请看下面去除static关键字后的的问题:
  1. class Fu {
  2.            int a=99;
  3. }

  4. class Zi extends Fu{
  5.          int a=90;
  6. }
  7. public class Demo2{
  8.         public static void main(String[] args){
  9.                 Fu f=new Zi();
  10.                 System.out.print(f.a);
  11.         }
  12. }
复制代码
运行结果还是:99
此题中的a随着对象的存在而存在。我认为是:内存中其实已经建立了父类的对象了。不然不会出现这样的情况!
如果是这样的话,那么也就验证了那句话:在整个java语言体系中,特别是多态中只有函数具有覆盖其他的不可能存在覆盖!
无论这个类的成员是静态的还是非静态的!
接下来又产生问题了:大部分情况下,我们是考虑了程序的扩展或者升级才继承父类,我们的目的是使用子类升级后的扩展部分。这个时候的父类对象已经产生了,也就是无用的垃圾对象。这个时候java的垃圾回收机制是否启动呢?
不知道我的想法对不对!!??
求详细解释。。。。。。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 杨同旺 于 2013-4-20 14:05 编辑

new任何一个子类的时候,肯定是先new的其父类,

所以只要是new了,肯定在内存中已经生成了父类的对象和子类的对象,

以上会产生多态的现象,但是多态是专门针对成员函数而言的,成员变量并没有多态的现象,这是一个规则,不管静态不静态,

既然类的成员变量不会产生多态的现象,所以成员变量只好重写,以上写法Fu f=new Zi()显然还是多态的写法,不产生成员变量多态的现象,应该这样:

Zi z = new Zi();
System.out.print(z.a);

只有这样,才能调到子类中的成员变量.

子类的对象在内存中生成后,只要子类对象存在,父类的对象也不会被垃圾回收.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
杨同旺 发表于 2013-4-20 13:21
new任何一个子类的时候,肯定是先new的其父类,

所以只要是new了,肯定在内存中已经生成了父类的对象和子类的 ...

继续      。。。。。。
谢谢。。。
回复 使用道具 举报
   在多态中的成员变量中,无论编译和运行,都参考左边(引用型变量所属的类),
   因为父类出现同名变量的时候,会先去找父类的

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 张洪慊 于 2013-4-20 14:49 编辑

搜了下:
http://zhidao.baidu.com/question/453806149.html
也就是说  Fu f=new Zi(); 并没有创建父类对象
  1. class Fu {
  2.            int a=99;
  3. }

  4. class Zi extends Fu{
  5.          int a=90;
  6. }
  7. public class Demo2{
  8.         public static void main(String[] args){
  9.                 Fu f=new Zi();//老毕曾经在继承中提到过:在堆内存中,父类的a和子类的a 均在new  Zi()中,即使父类的a 为 private 也是.
  10.                 System.out.print(f.a);
  11.         }
  12. }
复制代码
回复 使用道具 举报
张洪慊 发表于 2013-4-20 14:45
搜了下:
http://zhidao.baidu.com/question/453806149.html
也就是说  Fu f=new Zi(); 并没有 ...

你能画出详细的内存图吗?解释清楚。。。
谢谢
回复 使用道具 举报
杨华东 发表于 2013-4-20 19:36
你能画出详细的内存图吗?解释清楚。。。
谢谢


评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
黄玉昆 黑马帝 2013-4-21 07:38:24
8#
如果问题未解决,请继续追问,如果问题解决了,请将问题分类改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马