刚学到继承这里,被super难住了。
 在网上查资料,super代表父类对象的引用,但是 子类生成对象时 只是调用了父类的构造方法,并未生成父类对象,那么此时
super为什么能调用父类的方法,设定改方法被子类重写。
   super既然调用了父类的方法,说明super就是父类对象的引用,但是又没生成父类的对象,那么此时super是怎么调用父类方法的?希望大家帮我分析下这个问题,谢谢。

解决方案 »

  1.   

    我不知道这样理解对不对啊,你可以把子类看做父类+子类中新的代码,也就是说,在电脑看来,子类和父类没有一点关系,在编译期间,子类的代码中包含了父类的代码,所以子类和父类根本就是两个不相关的类,只是我们在敲代码的时候有继承这个概念不知道你听明白没有。
    举个例子类A时父类,B是子类
    A中有123,B继承了A,并且添加了456
    但是在电脑看来A包含123,吧、B包含123456.,在电脑看来,A和B没有关系
    所以B中调用所谓的父类构造方法时,其实还是在自己本身
    纯属个人见解,不知道对不对。如果不对就当我没说
      

  2.   

      我刚开始学,基础也的确不好,但是 调用父类构造方法 不是 创建父类对象,这个培训的老师 还有在网上查的资料很多都这样描述。
    http://bbs.csdn.net/topics/390836899
      

  3.   

    我只说说我个人的看法,可能不对。
    SUPER关键字调用了父类的构造方法,那么无论父类是否有其它构造方法,它都有一个无参的构造方法,而我们普通的创建对象,就是引用的无参构造方法。所以能够在子在中使用父类的方法。而且,子类继承父类的一切方法与关键字,可以重载,从关系上来说它们有关系,但其实子类和父类是两个完全独立的新类。不会因为修改了子类的方法或者属性而影响到父类。
      

  4.   

    刚学java半个月,看视频有讲到这点不知道我记得对不对,子类中存在一个指向父类的指针super,调用super构照函数时,会按指针的指向到方法区里面去找父类的构造函数然后将方法加载进栈执行
      

  5.   

    super不是对父类对象实例的引用 ,你可以把他当作像private/pubic一样的修饰符,一旦加上了super.XXX,就直接用的是父类方法或变量。
      

  6.   

    画一个内存图就明白了! 所有new的东西都是在堆里,当你new一个子类对象的时候在堆里有块区域是子类对象,然后子类对象里还有一个父类对象,然后super也在堆里。指向父类对象,而this将会指向子类对象!
      

  7.   

    画一个内存图就明白了! 所有new的东西都是在堆里,当你new一个子类对象的时候在堆里有块区域是子类对象,然后子类对象里还有一个父类对象,然后super也在堆里。指向父类对象,而this将会指向子类对象!
      

  8.   

    this是对当前对象的引用,但super更多的仅仅是一个关键字,他的用处就是在调用父、子类中无法区分的成员时使用或者调用父类构造函数。前者比如重载了的方法或者子类中有父类同名的属性(Field)时使用。
      

  9.   

    创建子类的对象的时候,内存中,实际上是创建了两个对象,你想也是啊,调用了子类和父类的构造方法,只不过这时候创建的父类对象是在子类对象中,使用子类对象的引用去访问属性或者方法时,首先在子类中看是否能找到,如果找不到,再去父类对象中找,这也就是覆盖的原理,如果想跳过子类直接去父类中找属性或者调用方法,那就要使用super了,不过要注意访问控制权限,父类中私有的属性和方法在子类中用super是访问不到的,,同时,super是可以访问抽象父类的,虽然抽象类没有构造函数不能被实例化,但是的的确确是可以像正常父类那样访问,只要控制权限正确,具体原因不明
      

  10.   

    换个例子重新说一下这个问题:你是一个设计房子图纸的人。你原本设计的房子(房子设计1)只有一个房间(房间1),
    后来,你又在房子设计1的基础上设计了“房子设计2”
    除了房间1,你又另设计了一个房间(房间2),
    于是现在这个房子设计2有两个房间了。
    (但房子设计2图纸中只说明房间1的设计请参考房子设计1图纸,没有在房子设计2图纸中体现)现在,你将房子设计2图纸交给房产开发商,
    房产开发商依房子设计2图纸盖了一个房子(对象实例)。上面的文字用代码来表现是类似这样子的:class HouseDesign1 {
        private Room1 room1 = new Room1();
    protected void enterRoom1(){}
    }class HouseDesign2 extend HouseDesign1 {
        private Room2 room2 = new Room2();
    protected void enterRoom2(){}
    }HouseDesign2 house = new HouseDesign2();这样,就有了house对象实例。一般来说,在软件领域,所谓对象实例是由new ClassName()或Class.newInstance()出来的,
    因此LZ问的到底有没有生成父类对象,
    就要看上面的例子中有没有new HouseDesign1()?我想答案很明显了吧,没有!
    虽然house中既有room2也有room1,
    但都是HouseDesign2的对象实例,
    没有HouseDesign1的对象实例。LZ的问题“没生成父类的对象,那么此时super是怎么调用父类方法的?”
    简单的说就是,子类实例中已包含了父类的一切(即room1)。
    在house,room1是子类(HouseDesign2)实例中的(虽然是在父类图纸中设计的)。