`
zhengalways
  • 浏览: 15147 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

构造函数的问题

 
阅读更多
缺省构造函数的问题: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)。
大家想想是为什么??

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

分享到:
评论

相关推荐

    导数中的构造函数问题.pdf

    构造函数问题通常指如何根据特定条件或性质来构造一个函数,这在数学问题解决中是一个常见且重要的技能。 知识点7:分段函数 文档内容暗示了分段函数的概念,可能与函数在不同区间内具有不同表达式有关。例如,文档...

    构造函数和复制构造函数

    构造函数和复制构造函数的详细介绍 构造函数是C++中的一种特殊函数,它们的主要作用是初始化对象的状态,并将对象的成员变量初始化为合适的值。构造函数的名称与类名相同,没有返回值(包括void),且只能被调用一...

    没有可用的复制构造函数或复制构造函数声明

    最后,虽然这个问题是关于复制构造函数和赋值运算符的,但这也提醒我们,当使用自定义类型与标准库容器结合时,需要确保我们的类型符合STL的要求,以便它们可以无缝地工作。这包括提供正确的构造函数、赋值运算符,...

    详解C++中构造函数,拷贝构造函数和赋值函数的区别和实现

    C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它...

    包含构造函数和析构函数的C++程序

    ### 构造函数和析构函数在C++中的应用 #### 概述 构造函数与析构函数是C++编程语言中非常重要的概念,它们在类的实例化和销毁过程中扮演着关键角色。通过理解这些函数的工作原理及其作用,我们可以更好地控制对象...

    构造函数的继承问题 笔记

    ### 构造函数的继承问题 #### 背景与概念理解 在面向对象编程语言如Java中,构造函数(Constructor)是一种特殊的方法,用于初始化新创建的对象。它与类同名,没有返回类型,并在创建对象时自动调用。 在Java中,...

    C++\测试 对象成员构造函数、基类构造函数、派生类本身的构造函数 的先后顺序.rar

    在C++编程中,对象的构造过程涉及到多个层面,包括对象成员构造函数、基类构造函数以及派生类本身的构造函数。理解它们的执行顺序对于编写健壮的代码至关重要。以下将详细阐述这三个构造函数的调用时机和逻辑。 1. ...

    构造函数与析构函数

    每个类都具有构造函数和析构函数。其中,构造函数在定义对象时被调用,析构函数在对象释放时被调用。如果用户没有提供构造函数和析构函数,系统将提供默认的构造函数和析构函数。 1.构造函数 构造函数是一个与类同名...

    构造函数不能声明为虚函数的原因及分析

    问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找vtable呢?所以构造函数不能是虚函数。 2. 从使用角度,虚函数主要用于在信息不全的情况下,能使...

    在派生类的构造函数中调用基类的构造函数

    这就涉及到了在派生类的构造函数中调用基类构造函数的知识点。 首先,每个类都有一个构造函数,它在对象创建时自动执行,用于初始化类的数据成员。当派生类创建时,它的构造函数会先于派生类的任何其他操作调用基类...

    继承类的构造函数

    解决这个问题的思路是,在执行派生类的构造函数时,调用基类的构造函数。 在简单的派生类中,定义构造函数时需要考虑基类的构造函数。例如,在上面的例子中, Student1 是 Student 的派生类,它的构造函数需要调用...

    构造函数和析构函数PPT课件.pptx

    构造函数和析构函数PPT课件.pptx 构造函数是C++编程语言中的一种特殊的成员函数,它是在创建对象时由系统自动执行的函数。构造函数的主要功能是将对象初始化,并执行一些必要的操作,以便对象能够正确地工作。构造...

    构造函数实例(源码)

    在本实例中,我们将深入探讨四种主要类型的构造函数:默认构造函数、初始化构造函数、复制构造函数和转换构造函数。 首先,我们来讨论默认构造函数。默认构造函数是没有任何参数的构造函数,它通常用来创建一个不带...

    构造函数与默认构造函数

    构造函数与默认构造函数的声明、定义、应用、比较

    构造函数与静态块的执行顺序

    在探讨继承中子类与父类构造函数及静态块的执行顺序时,我们首先需要理解构造函数和静态块的基本概念及其在Java中的作用。构造函数主要用于初始化对象的状态,而静态块则是在类加载到内存中时执行的一段代码,通常...

    构建一个类Point,它提供两个公有的构造函数,一个没有参数的Point构造函数和一个有两个double参数的构造函数。

    构建一个类Point,它提供两个公有的构造函数,一个没有参数的Point构造函数和一个有两个double参数的构造函数。另外在该类中提供一个静态方法计算两个点的直线距离,传入参数为两个Point类实例。然后设计一个测试类...

    c#构造函数的调用过程

    ### C#构造函数的调用过程 在C#编程语言中,构造函数是一种特殊类型的方法,主要用于初始化对象的状态。构造函数的名字与类名相同,并且没有返回类型。当创建一个新对象时,构造函数会自动被调用。本文将通过一个...

    构造函数不能为虚函数的理由

    问题出来了,如果构造函数是虚的,就需要通过 vtable 来调用,可是对象还没有实例化,也就是内存空间还没有,怎么找 vtable 呢?因此,构造函数不能是虚函数。 从使用角度,虚函数主要用于在信息不全的情况下,能使...

    C++简单类(构造函数,析构函数以及拷贝构造函数)的实现

    本文将详细解析一个简单的C++类`cPerson`的实现,重点关注其构造函数、析构函数以及拷贝构造函数。 ### 构造函数 构造函数是在创建类的对象时自动调用的一种特殊成员函数,主要用于初始化对象的数据成员。`cPerson...

    C#构造函数的理解

    ### C#构造函数的理解 #### 一、构造函数的基本概念 构造函数是一种特殊的方法,用于初始化新创建的对象。在C#中,构造函数的名字与类名相同,这有助于明确指出其用途。当创建一个类的新实例时,系统会自动调用...

Global site tag (gtag.js) - Google Analytics