调用超类的构造器
子类和普通的类一样,可以利用关键字new来创建它的实例。如果没有在子类中显示编写一个构造器,编译器就会隐式添加一个无参(no-arg)构造器
当通过调用子类的某个构造器来将它实例化时,构造器的第一个动作就是调用直接父类的无参构造器。在父类中,构造器也调用其直接父类的构造器。这个过程会不断重复,直到到达java.lang.Object类的构造器为止。换句话说,当创建一个子类时,他所有的父类也就实例化了。
下面以Base和Sub类为例演示了这个过程。
class Base { public Base() { System.out.println("Base"); } public Base(String s) { System.out.println("Base." + s); } } public class Sub extends Base { public Sub(String s) { System.out.println(s); } public static void main(String[] args) { Sub sub = new Sub("Start"); } }
如果运行Sub类,就会在控制台看到以下结果:
Base
Start
这表明,Sub类的构造器的第一个动作就是调用Base类的无参构造器。Java编译器已经悄悄地将Sub的构造器改成下面的样子,但是,这一修改并没有真正保存到源文件中。
public Sub(String s) { super(); System.out.println(s); }
关键字super表示当前对象的直接超类的一个实例。由于super是从Sub的一个实例中调用的,因此super表示其直接超类Base的一个实例。
通过使用关键字super,可以从子类的构造器显示调用父类的构造器,但super必须是构造器的第一条语句,如果你想调用超类中的另一个构造器的话,使用关键字super是很方便的。例如,可以将Sub中的构造器修改成下面这样:
public Sub(String s) { super(s); System.out.println(s); }
这个构造器利用super(s),调用父类的单参数构造器。结果,当运行这个类时,就会在控制台中看到以下内容:
Base.Start
Start
那么,如果超类没有无参构造器,并且也没有从子类显示调用另一个构造器,会怎么样呢?以下代码以Parent类和Child类为例做了展示。
class Parent { public Parent (String s) { System.out.println("Parent (String)"); } } public class Child extends Parent { public Child() { } }
这样将会产生一个编译错误,因为编译器添加了一个对Parent中无参构造器的隐式调用,而Parent类只有一个带有String的构造器。只要从Child类的构造器中显示调用父类的构造器,就可以纠正这种问题:
public Child() { super(null); }
提示:对于一个子类而言,能够从它自己的构造器调用其父类的构造器,这是很有意义的事情,因为子类的 实例必须始终配有其每个父类的实例。因此,对子类中未覆盖的方法的调用,将被传递给其父类,直到在该继承层次结构中找到第一个方法为止。
调用超类的隐藏成员
关键字super的存在还有另一个使命。它可以用来调用超类中隐藏的成员,或者覆盖的方法。由于super表示直接父类的一个实例,因此,super.memberName将返回父类中的指定成员。可以访问到超类中能通过子类看到的任何成员。例如,以下代码展示了两个具有父子关系的类:Tool和Pencil。
Class Tool { public String toString() { return "Generic tool"; } } public class Pencil extends Tools { public String toString() { return "I am a Pencil"; } public void write() { System.out.println(super.toString); System.out.println(toString()); } public static void main(String[] args) { Pencil pencil = new Pencil(); Pencil.write; } }
Pencil类覆盖Tool中的toString方法。如果运行Pencil类,就会在控制台中看到以下结果:
Generic tool
I am a pencil
与调用父类的构造器不同,调用父类的成员的语句不需要放在调用方法中的第一行。
相关推荐
14.java学习第十四章——super()关键字+实例变量(含引用数据类型做实例变量)和局部变量的个人总结+基本数据类型和引用数据类型的存放位置.pdf
static关键字,主要描述全局的概念,利用该属性可以定义属性和方法,但是90%情况下很少直接编写static。 现在假设定义一个只描述中国人的类,类中包含:姓名、年龄、国家,按之前的概念设计如下: protected void ...
面向对象编程的基础 要了解面向对象编程(OOP)的基本概念,需要理解 OOP 的三个主要概念,它们撑起 了整个 OOP 的框架。这三个概念是:封装、继承性和多态性。除此以外,还需了解对象、 类、消息、接口、及抽象等...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
3.4 小结:基本数据类型—— Java中一切数据和运算的基础 63 3.5 习题 65 第4章 Java中的程序执行流程 67 教学视频:1小时57分钟 4.1 顺序执行 67 4.2 使用if-else让程序懂得判断 68 4.2.1 if语句 68 4.2.2 ...
文章目录继承与多态继承单继承方法的重写super关键字调用父类的构造器super和this的区别简单类对象的实例化过程子类对象的实例化过程面向对象特征——多态虚拟方法调用(Virtual Method Invocation)小结[instanceof ...
│ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....
Jworld@TW技术论坛版主,Java权威技术顾问与专业讲师,Java畅销书作者——林信良全新力作。 国内第一本Java 7,前期版本累计销量5万册。 《Java JDK 7学习笔记》针对Java SE 7新功能全面改版,无论是章节架构或...
│ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....
案例 + 知识点:其中包括了方法,数组,继承多态封装,基本数据类型与引用数据类型;super关键字,方法的重载,构造方法的重载,排序(冒泡排序、选择排序、JDK排序案例)并对各个知识点进行了相应的案例进行分析。
第17章 Java Web应用——JSP 17.1 JSP技术概述 17.2 JSP运行环境搭建 17.2.1 Tomcat下载与安装 17.2.2 Tomcat的环境变量配置 17.3 基本语法 17.3.1 HTML注释 17.3.2 隐藏注释 17.3.3 声明 17.3.4 表达式 ...
│ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....
│ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....
│ │ 一些其它网站的java基础精华贴.txt │ │ 新建 文本文档.txt │ │ 经验总结.txt │ │ 资料目录.txt │ │ 题目.txt │ │ │ ├─HTML Pages │ │ │ Desktop_.ini │ │ │ Low Level Security in Java....
第1篇Java基础知识入门. 第1章Java的开发运行环境2 1.1Java的运行环境与虚拟机2 1.2Java的开发环境4 1.2.1JDK的安装4 1.2.2如何设置系统环境变量6 1.2.3编译命令的使用8 1.2.4解释执行命令的使用10 1.2.5...
—————————————————————————————————————— 题目1: 下面不属于基本类型的是:c (选择1项) A) boolean B) long C) String D) byte 题目2:d 如下程序中: (1)public class ...
如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。 (3)子类函数的访问修饰权限不能小于父类的; 多态性是面向对象编程的一种特性,和方法无关, 简单说,就是同样的一个方法...