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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 她只是过客 中级黑马   /  2014-8-29 09:02  /  1581 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 她只是过客 于 2014-8-30 21:11 编辑

我在看第二遍基础视频了,第一遍有很多细节都没注意到,现在才注意了
第一个问题:子类继承父类,创建子类对象的时候,父类对象有没有被创建?如果没有被创建,那么父类中的成员又不是静态的,那么就代表成员不存在,既然成员不存在,子类又怎么继承里面的属性呢?
第二个问题:静态函数里为什么不能用super?这个问题和第一个问题可能有点关联有点重复的样子,但我还是想知道详细的解答

6 个回复

倒序浏览
首先,创建子类对象的时候,父类对象没有被创建,但是父类被初始化了,因为子类构造函数的第一句如果你不指定就会默认是super();,所以这时候子类继承父类时采用的是类似代码复制的方法,子类继承的父类的所有的属性方法都是在子类自己中的,所以创建子类对象不需要创建父类对象,但是需要父类初始化!
其次,静态函数不能用super的问题!虚拟机在类加载的第一步会对静态初始化块、静态成员变量、静态方法进行一次初始化,这时候,还没有调用子类的构造函数,所以说这时候还没有调用super();,所以这时候父类还没有被初始化,父类这时候是不存在的,所以没有办法调用父类的东西!
解释得有些粗糙,我自己其实也不是很明白,初学者大概这么理解吧!{:3_47:}与君共勉
回复 使用道具 举报 1 0
咸菜+萝卜干 发表于 2014-8-29 09:49
首先,创建子类对象的时候,父类对象没有被创建,但是父类被初始化了,因为子类构造函数的第一句如果你不指 ...

我能想到的是子类对象创建的时候,在自己内部又创建了父类对象来完成对自己属性的初始化,我理解的super是父类对象的引用,可以跟对象名似的对自己的属性进行调用,因为它里面属性不一定是静态的,如果是静态的,就不需要super了,直接父类名调用就行了
  1. class Fu {
  2.         static int num = 5;

  3. }

  4. class Zi extends Fu {
  5.         int n;

  6.         public Zi() {
  7.                 super();
  8.                 System.out.println(Fu.num);

  9.         }

  10. }

  11. class CopyOfExtendsDemo2 {
  12.         public static void main(String[] args) {
  13.                 Zi z = new Zi();

  14.         }
  15. }
复制代码
回复 使用道具 举报
建立子类的时候,构造器里默认了super();只是不显示
静态在构造器之前,所以用不了super()
回复 使用道具 举报
她只是过客 发表于 2014-8-29 10:03
我能想到的是子类对象创建的时候,在自己内部又创建了父类对象来完成对自己属性的初始化,我理解的super ...

没看懂你想表达什么?这段代码有什么问题?{:3_47:}
回复 使用道具 举报
咸菜+萝卜干 发表于 2014-8-29 11:23
没看懂你想表达什么?这段代码有什么问题?

看题目,看问题,
回复 使用道具 举报
静态代码块:可以完成类的初始化。静态代码块随着类的加载而执行,而且只执行一次(new 多个对象就只执行一次)。如果和主函数在同一类中,优先于主函数执行。
构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。
    构造函数:是给与之对应的对象进行初始化。它具有针对性。
但是静态在时,有可能没有对象,所以不能使用 this super等
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马