扩展类采用extends关键字引用超类进行继承的时候,会动态加载超类的构造函数,那么请问这个时候是否创建了超类的实例?昨天在贴吧看到一个这个问题,大部分人认为会创建对象实例,但是并不是这样的,首先大家都知道如果构造函数被加载,那么必定会创建对象实例,这种理解确实是正确的,但是创建对象只有一种方式就是采用new关键字创建,采用new关键字创建以后,会返回对象引用,该引用所指向的就是存放于堆内存(heap)中的目标对象的地址,地址中所存放的就是目标对象的对象实例。扩展类采用extends关键字引用超类进行继承,并且可以加载父类的构造函数,以及可以调用超类的所有非私有类成员,这并不是说是将超类进行了创建,仅仅只是使用的super对超类的类成员进行了引用。堆内存中(heap)其实并无超类的对象实例。你们试想一下,内存不是无限的,如果随意调用一个扩展类,并且这个扩展类拥有过多且复杂的多重继承,那么这样是否会将所有扩展类的超类都按照派生顺序全部创建对象实例?这是不可能的。所以希望大家加强对Java基础的理解。
呵呵,我请问你什么叫做使用了所有的JDK?????
“扩展类采用extends关键字引用超类进行继承,并且可以加载父类的构造函数,以及可以调用超类的所有非私有类成员,这并不是说是将超类进行了创建,仅仅只是使用的super对超类的类成员进行了引用。堆内存中(heap)其实并无超类的对象实例。”
上面这一段的依据是什么?不能凭空想象或者狭隘经验吧“你们试想一下,内存不是无限的,如果随意调用一个扩展类,并且这个扩展类拥有过多且复杂的多重继承,那么这样是否会将所有扩展类的超类都按照派生顺序全部创建对象实例?这是不可能的。”这是狭隘推测?!
如果规范中没有说明的,各家jdk厂商可以自行决定怎么实现,比如java引用占的内存大小,可以是32位,可以是64位,没人管
怕烦人上csdn发什么贴,好好做你的工作去
Java 既然具备类和对象这2 个概念,那么也就拥有3 个特征:封装、继承和多态。7.1 类的封装性
其实在第1章的学习中,我们就已经简要的介绍了Java面向对象(Object-oriented)的基本原理,本章我们深入的来学习Java的00思想。
类在Java语言中体现的尤为重要,因为在任何面向对象的语言中,类是最基本的封装单元。封装(encapsulation)顾名思义就是隐藏对象的内部实现细节,仅对外提供接口来进行访问和操作。封装其实是一种抽象的概念,它将对象中的数据和行为组织结合起来,形成一个有机的整体,当然也就形成了类。
在面向过程的程序设计中(procedure-oriented),我们首先需要分析出解决问题所需要的步骤,然后用函数把这些步骤一步步的编写实现。但是由于程序中拥有过多的通用步骤,从而导致需要花费更多的时间去编写重复的代码,并且降低了程序的可读性和维护性。
继承是面向对象(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;
}
}