扩展类采用extends关键字引用超类进行继承的时候,会动态加载超类的构造函数,那么请问这个时候是否创建了超类的实例?昨天在贴吧看到一个这个问题,大部分人认为会创建对象实例,但是并不是这样的,首先大家都知道如果构造函数被加载,那么必定会创建对象实例,这种理解确实是正确的,但是创建对象只有一种方式就是采用new关键字创建,采用new关键字创建以后,会返回对象引用,该引用所指向的就是存放于堆内存(heap)中的目标对象的地址,地址中所存放的就是目标对象的对象实例。扩展类采用extends关键字引用超类进行继承,并且可以加载父类的构造函数,以及可以调用超类的所有非私有类成员,这并不是说是将超类进行了创建,仅仅只是使用的super对超类的类成员进行了引用。堆内存中(heap)其实并无超类的对象实例。你们试想一下,内存不是无限的,如果随意调用一个扩展类,并且这个扩展类拥有过多且复杂的多重继承,那么这样是否会将所有扩展类的超类都按照派生顺序全部创建对象实例?这是不可能的。所以希望大家加强对Java基础的理解。

解决方案 »

  1.   

    关于这个问题java语言规范中貌似没有明确说明,也就是说sun的jre可以有自己的实现,IBM的jre也可以有自己的实现如果谁在java语言规范中找到类似的规定麻烦也跟我说说
      

  2.   


    呵呵,我请问你什么叫做使用了所有的JDK?????
      

  3.   

    你的依据是什么,sun jdk only?还是《java语言规范》,我只信《java语言规范》,这个是宪法
    “扩展类采用extends关键字引用超类进行继承,并且可以加载父类的构造函数,以及可以调用超类的所有非私有类成员,这并不是说是将超类进行了创建,仅仅只是使用的super对超类的类成员进行了引用。堆内存中(heap)其实并无超类的对象实例。”
    上面这一段的依据是什么?不能凭空想象或者狭隘经验吧“你们试想一下,内存不是无限的,如果随意调用一个扩展类,并且这个扩展类拥有过多且复杂的多重继承,那么这样是否会将所有扩展类的超类都按照派生顺序全部创建对象实例?这是不可能的。”这是狭隘推测?!
      

  4.   

    你要知道,sun出的是java规范,可以有很多人自己去实现jdk,只要不违反《java语言规范》就是可行的!
    如果规范中没有说明的,各家jdk厂商可以自行决定怎么实现,比如java引用占的内存大小,可以是32位,可以是64位,没人管
      

  5.   

    做了这么久的开发,我只是想发表一些人对Java基础打的不牢固的感慨,我想说的已经说了,我不会在围绕这个问题继续纠缠,如果你想继续跟我聊,那么有时间你加我QQ再说
      

  6.   

    我只想说,你对java的认识太浅薄
      

  7.   


    怕烦人上csdn发什么贴,好好做你的工作去
      

  8.   

    不懂装懂,还只认Java语言规范,不好意思我只看结果。你回去问问你项目经理再回来根我谈,别出来丢人
      

  9.   

    Java 面向对象(Object-oriented)的核心思想是由类和对象这2 个核心概念所组成。类是一种抽象的概念,可以理解为某一类事物,对象则是某类的具体实例。一个完整的类应该包含属性和方法,属性是对象的各种“器官“,方法则是对象的执行动作。
    Java 既然具备类和对象这2 个概念,那么也就拥有3 个特征:封装、继承和多态。7.1  类的封装性
    其实在第1章的学习中,我们就已经简要的介绍了Java面向对象(Object-oriented)的基本原理,本章我们深入的来学习Java的00思想。
    类在Java语言中体现的尤为重要,因为在任何面向对象的语言中,类是最基本的封装单元。封装(encapsulation)顾名思义就是隐藏对象的内部实现细节,仅对外提供接口来进行访问和操作。封装其实是一种抽象的概念,它将对象中的数据和行为组织结合起来,形成一个有机的整体,当然也就形成了类。
    在面向过程的程序设计中(procedure-oriented),我们首先需要分析出解决问题所需要的步骤,然后用函数把这些步骤一步步的编写实现。但是由于程序中拥有过多的通用步骤,从而导致需要花费更多的时间去编写重复的代码,并且降低了程序的可读性和维护性。
      

  10.   

    7.2  继承
    继承是面向对象(Object-oriented)的3大特征之一,它允许创建类的层次结构。在程序中使用继承,可以首先创建一个拥有共有特性的通用封装类,然后其他类去继承这个封装类,并且可以添加自己的独有特性。
    在面向对象的程序设计中,被继承的类我们称之为超类,继承类则称之为扩展类。扩展类不仅仅可以继承超类的所有非私有类成员,同时也可以扩展超类的一些特性,形成了自己的独有特性。
    在Java中采用extends关键字实现类的继承,基本格式如下:
    /**
     * 定义超类 
     */
    class Superclass
    {
    //...
    }/**
     * 扩展类Extendsclass继承了超类Superclass
     */
    public class Extendsclass extends Superclass
    {
    //...
    } 上述程序中我们需要明确的是,类之间的继承是采用extends关键字,那么接下来我们就演示一个完成的继承示例:
    /**
     * 定义超类 
     */
    class Superclass
    {
    public double width = 14.5D, height = 20.4D;

    public double add()
    {
    return width + height;
    }
    }/**
     * 扩展类Extendsclass继承了超类Superclass
     */
    public class Extendsclass extends Superclass
    {
    public double cut()
    {
    return height - width;
    }

    public double ride()
    {
    return height * width;
    }

    public double except()
    {
    return height / width;
    }
    }