`

java构造方法的继承

阅读更多

java 构造方法的继承

这是摘抄别人的读书笔记,希望能够对大家学习java有所帮助。
所有代码都经过测试,测试环境:
java version "1.4.0-rc"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-rc-b91)
Java HotSpot(TM) Client VM (build 1.4.0-rc-b91, mixed mode)
如大家发现任何错误,或有任何意见请不吝赐教。

缺省构造函数的问题:base类是父类,derived类是子类,首先要
说明的是由于先有父类后有子类,所以生成子类之前要首先有父类。
class是由class的构造函数constructor产生的,每一个class都有
构造函数,如果你在编写自己的class时没有编写任何构造函数,那么
编译器为你自动产生一个缺省default构造函数。这个default构造函数
实质是空的,其中不包含任何代码。但是一牵扯到继承,它的问题就出现
了。

如果父类base class只有缺省构造函数,也就是编译器自动为你产生的。
而子类中也只有缺省构造函数,那么不会产生任何问题,因为当你试图产生
一个子类的实例时,首先要执行子类的构造函数,但是由于子类继承父类,
所以子类的缺省构造函数自动调用父类的缺省构造函数。先产生父类的实例,
然后再产生子类的实例。如下:

class base{
}
class derived extends base{
public static void main(String[] args){
derived d=new derived();
}
}

下面我自己显式地加上了缺省构造函数:
class base{
base(){
System.out.println("base constructor");
}
}
class derived extends base{
derived(){
System.out.println("derived constructor");
}
public static void main(String[] args){
derived d=new derived();
}
}

执行结果如下:说明了先产生base class然后是derived class。
base constructor
derived constructor

我要说明的问题出在如果base class有多个constructor
而derived class也有多个constructor,这时子类中的构造函数缺省
调用那个父类的构造函数呢?答案是调用父类的缺省构造函数。
但是不是编译器自动为你生成的那个缺省构造函数而是你自己显式地
写出来的缺省构造函数。

class base{
base(){
System.out.println("base constructor");
}
base(int i){
System.out.println("base constructor int i");
}
}
class derived extends base{
derived(){
System.out.println("derived constructor");
}
derived(int i){
System.out.println("derived constructor int i");
}
public static void main(String[] args){
derived d=new derived();
derived t=new derived(9);
}
}

D:\java\thinking\think6>java derived
base constructor
derived constructor
base constructor
derived constructor int i

如果将base 类的构造函数注释掉,则出错。

class base{
// base(){
// System.out.println("base constructor");
// }
base(int i){
System.out.println("base constructor int i");
}
}
class derived extends base{
derived(){
System.out.println("derived constructor");
}
derived(int i){
System.out.println("derived constructor int i");
}
public static void main(String[] args){
derived d=new derived();
derived t=new derived(9);
}
}


D:\java\thinking\think6>javac derived.java
derived.java:10: cannot resolve symbol
symbol : constructor base ()
location: class base
derived(){
^
derived.java:13: cannot resolve symbol
symbol : constructor base ()
location: class base
derived(int i){
2 errors

说明子类中的构造函数找不到显式写出的父类中的缺省
构造函数,所以出错。

那么如果你不想子类的构造函数调用你显式写出的父类中的缺省
构造函数怎么办呢?
如下例:

class base{
// base(){
// System.out.println("base constructor");
// }
base(int i){
System.out.println("base constructor int i");
}
}
class derived extends base{
derived(){
super(8);
System.out.println("derived constructor");
}
derived(int i){
super(i);
System.out.println("derived constructor int i");
}
public static void main(String[] args){
derived d=new derived();
derived t=new derived(9);
}
}


D:\java\thinking\think6>java derived
base constructor int i
derived constructor
base constructor int i
derived constructor int i

super(i)表示父类的构造函数base(i)请大家注意
一个是super(i)一个是super(8)。
大家想想是为什么??

结论:子类如果有多个构造函数的时候,父类要么没有构造函数,
让编译器自动产生,那么在执行子类构造函数之前先执行编
译器自动产生的父类的缺省构造函数;要么至少要有一个显
式的缺省构造函数可以让子类的构造函数调用。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zgzhjj001/archive/2008/04/03/2247983.aspx

分享到:
评论

相关推荐

    java中的继承(子类调用父类构造方法还不懂).doc

    java中的继承(子类调用父类构造方法还不懂).doc

    java面试题静态加载顺序构造方法

    java面试题静态加载顺序构造方法 继承与static 面试题目如下:请写出程序执行完成之后的结果。 package extend; public class X { Y y=new Y(); static{ System.out.println("tttt"); } X(){ System....

    java学习笔记(构造方法及继承)

    内容为本人在学习java构造方法及继承部分时整理的笔记,内容为构造方法及继承基础知识

    JAVA语言中构造方法的继承与重载探讨.pdf

    JAVA语言中构造方法的继承与重载探讨

    Java继承时构造函数的调用

    Java继承时构造函数的调用, java面向对象特征: 1.抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用...

    java继承类实例

    自己设计的一个程序,展现有继承结构的子类对象的初始化过程(包含构造方法、初始化值、父类构造方法、父类的初始化值的环节)

    java中继承的使用案例

    (2)学生类Student继承Person,增加了学号信息,有两个构造方法Student()和Student(姓名,性别,年龄,学号),调用父类Person的构造方法对父类部分进行构造,在Student()中,默认学号为空字符串,在Student...

    Java提升学习(二):构造方法,类的继承,封装

    Java提升学习(二):构造方法,类的继承,封装 一、构造方法 类有一种特殊的成员方法叫做构造方法,构造方法与类同名,在创建对象时,会自动调用类的构造方法。 构造方法没有返回类型,更不能定义为void,不可加...

    详解 Java继承关系下的构造方法调用

    主要介绍了详解 Java继承关系下的构造方法调用的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下

    Java继承习题

    java继承习题精选 包含可很多习题 同时也副有正确答案

    JAVA类的定义及继承演示

    一个构造方法,无参数,在此构造方法中初始化dogName,dogAge 说明二:关于SmallDog 继承Dog,不添加任何属性和方法 最后,在测试类中的main方法中生成SmallDog类的对象,访问属性dogName和dogAge,并打印出他们的值...

    优质java课件 java程序设计教程(第6版)08.继承(共14页).ppt

    中期回顾 类、构造方法(共18页).ppt 优质java课件 java程序设计教程(第6版)05.深入的条件判断和循环(共28页).ppt 优质java课件 java程序设计教程(第6版)05.条件和循环语句(共58页).ppt 优质java课件 java...

    《java面向对象程序设计-继承和多态》教案.doc

    继承 继承的特点 继承的优点 继承的JAVA实现 子类构造方法 2-1 子类构造方法 2-2 调用父类构造方法的语法为: super() 或 super(参数列表) ; super () 方法始终指向调用类的父类 调用父类构造方法 演示:示例 3 多态...

    AbstractTest.java帮助理解多重继承、抽象方法重写调用、super、this关键字、构造方法、重载知识点

    定义抽象类以及抽象方法,构造方法,将子类1定义为抽象类,子类2继承子类1,子类2重写抽象方法。用以帮助理解多重继承、抽象方法重写调用、super、this关键字使用、构造方法、重载这几个的知识点

    JAVA经典继承与父类调用 geter、seter访问器 构造器

    代码中设计了各个类的基类,设置私有成员变量,利用构造器对成员变量初始化,用geter、seter访问器设置、获取成员变量的值。继承基类并创建对象,在子类中调用父类方法。

    动力节点_Java基础视频教程37_构造方法不继承

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    java继承与多态教学及练习

    1继承的概念 2继承的实现 3变量隐藏与方法覆盖 4super关键字 5 子类的构造顺序 6Object类 7 final关键字

    Java面向对象总结

    父类的构造方法子类不能继承 2.在JAVA中使用关键字extends 3.调用子类的构造方法时,会先调用父类的构造方法。默认隐式调用父类无参数的构造方法 4.如果要在子类的构造方法中显式调用父类的构造方法。使用super...

    java继承中的构造方法实例解析

    主要介绍了java继承中的构造方法实例解析,针对继承中的构造方法的特点进行了实例分析,需要的朋友可以参考下

    java三大特性之继承

    子类可以继承父类中所有的属性和方法(除了构造方法) 一个父类可以有多个子类 一个子类只能有一个直接的父类-单继承(一个儿子只能有一个亲爹) java中支持多层继承(儿子-爹-爷爷。。。) ...

Global site tag (gtag.js) - Google Analytics