- 1、本文档共64页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
或者父类
Java软件设计基础 5. 继承与多态 构造方法也可以限定为private,如果一个类的构造方法被声明为私有,则其他类不能生成该类的一个对象。 protected 类中限定为protected的成员可以被这个类本身引用,被它的子类以及同一个包中所有其他的类访问。 5.2 类的继承 继承机制 继承是面向对象编程技术的一块基石。 继承能够创建一个通用类,并定义一系列相关项目的一般特性。该类可以被更具体的类继承。 每个具体的类都增加一些自己特有的东西。 继承是一个对象获得另一个对象的属性的过程。 由继承得到的类为子类(subclass或childclass),也被称为派生类(derived class)、扩展类(extended class)。 被继承的类为超类(superclass),也被称为基类(base class)或者父类(parent class),包括所有直接或间接被继承的类; 类可以从另一个类的子类的子类的子类……继承而来,最终都是继承自最顶级的类Object。 定义在Object中的方法可被所有子类使用。 Java平台类层次结构:所有类都是Object类的后裔 继承支持按层次分类的概念。 简单的说,类的继承性就是新的子类可以从另一个父类派生出来,并自动拥有父类的全部属性和方法。 子类继承父类的成员变量与方法,就如同在子类中直接声明的一样,可以被子类中自己声明的任何实例方法所调用。 子类继承父类的状态和行为,同时也可以修改继承自父类的状态和行为,并添加新的状态和行为。通俗的说法:子类更具有特殊性。 单继承 使得代码更加可靠,不会出现因多个父类有相同的方法或属性所带来的麻烦。 创建子类 格式 说明 子类能够继承父类中public和protected成员变量和方法; 如果子类和父类在同一个包内,子类能继承父类中用默认修饰符修饰的成员变量和方法; 一般情况下,子类不能继承父类中的private成员变量和方法; 这里要特别说明的是,因为嵌套类可以访问其外部类的所有私有成员,所以,若子类是继承自某公共或者受保护嵌套类,则可以间接访问(关于嵌套类,我们将在下节课中讲解)。 若缺省extends子句,则该类为java.lang.Object的子类。 如果子类声明了一个与父类中的成员同名的成员,则子类不继承父类中的同名成员; 以上程序将打印“5”,表明子类Sub中并未继承父类的a。 构造方法 与属性和方法不同,父类的构造方法并不传给子类,它们只能从子类的构造方法中通过关键字super调用。 构造方法链 在任何情况下,构造一个类的实例时,将会沿着继承链调用所有父类的构造方法,父类的构造方法在子类的构造方法之前调用。 关键字super Java中通过super来实现对父类成员的访问,super用来引用父类中的方法和变量,主要是用于继承被隐藏(hiding)的成员变量或者被覆盖的方法。 使用情况 访问父类被隐藏的成员变量,其引用格式为: 调用父类被覆盖的方法,其引用格式为: 调用父类的构造方法,其引用格式为: 例程:自行车类 自行车类作为父类 自行车下面还有许多子类,如山地车、公路自行车等。 以山地车为例 构造方法也可以利用super关键字,改为: this与super的总结 this用来引用当前对象,super用来引用当前父类对象。用this和super区别分别出现在父类、子类中的同名成员变量和类中方法使用的同名局部变量。 this的使用 可以出现在实例方法和构造方法中,但不可以出现在类方法中。因为类方法可以直接通过类名直接调用,这时可能还没有任何对象诞生。 this可以出现在类的构造方法中,代表使用该构造方法创建的对象。 this可以出现在类的实例方法中,代表使用该方法的当前对象。类的实例方法可以通过this调用该类的其他方法,或者成员变量。 super的使用 用来访问父类被隐藏的成员变量,或调用父类被覆盖的方法和构造函数。 例程:成员变量的隐藏和方法的覆盖 分析: 根据构造方法链的原理,子类在实例化时,首先调用父类构造函数,实例化父类。之后才是子类自身实例化。 这就是为什么上例中会首先打印“in SuperClass:x=3”的原因。 将程序片段略作修改: 当运行主程序的“SubClass sub=new SubClass();”语句时,上述程序会报错,原因在于子类实例化之前要实例化父类,调用父类中的无参数构造方法,而父类中不存在无参数构造方法。 那么,父类中为什么会不存在无参数的构造方法呢? 当构造一个类的对象时,编译器首先判断类是否有构造方法,如果没有,则自动加上一个默认构造方法;而一旦发现有构造方法后,则不再自动加上构造方
文档评论(0)