`
lpm528
  • 浏览: 84687 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

构造函数

    博客分类:
  • java
 
阅读更多

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

然后再产生子类的实例。如下:

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

 

下面我自己显式地加上了缺省构造函数:

class base{
base(){
System.out.println("baseconstructor");
}
}
class derived extends base{
derived(){
System.out.println("derivedconstructor");
}
public static void main(String[]args){
derivedd=new derived();
}
}

 

执行结果如下:说明了先产生baseclass然后是derivedclass。

baseconstructor
derivedconstructor

 

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

class base{
base(){
System.out.println("baseconstructor");
}
base(int i){
System.out.println("baseconstructorinti");
}
}
class derived extends base{
derived(){
System.out.println("derivedconstructor");
}
derived(int i){
System.out.println("derivedconstructorinti");
}
public static void main(String[] args){
derivedd=newderived();
derivedt=newderived(9);
}
}
D:\java\thinking\think6>javaderived
baseconstructor
derivedconstructor
baseconstructor
derivedconstructorinti

 

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

class base{
//base(){
//System.out.println("baseconstructor");
//}
base(int i){
System.out.println("baseconstructorinti");
}
}
class derived extends base{
derived(){
System.out.println("derivedconstructor");
}
derived(int i){
System.out.println("derivedconstructorinti");
}
public static void main(String[]args){
derivedd=newderived();
derivedt=newderived(9);
}
}
D:\java\thinking\think6>javacderived.java
derived.java:10:cannotresolvesymbol
symbol:constructorbase()
location:classbase
derived(){
derived.java:13:cannotresolvesymbol
symbol:constructorbase()
location:classbase
derived(inti){
2errors

 

说明子类中的构造函数找不到显式写出的父类中的缺省构造函数,所以出错。那么如果你不想子类的构造函数调用你显式写出的父类中的缺省构造函数怎么办呢?

如下例:

classbase{
//base(){
//System.out.println("baseconstructor");
//}
base(int i){
System.out.println("baseconstructorinti");
}
}
class derived extends base{
derived(){
super(8);
System.out.println("derivedconstructor");
}
derived(int i){
super(i);
System.out.println("derivedconstructorinti");
}
public static void main(String[]args){
derivedd=newderived();
derivedt=newderived(9);
}
}
D:\java\thinking\think6>javaderived
baseconstructorinti
derivedconstructor
baseconstructorinti
derivedconstructorinti

 

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

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

分享到:
评论

相关推荐

    构造函数和复制构造函数

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

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

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

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

    在C++编程中,"没有可用的复制构造函数或复制构造函数声明"是一个常见的错误,通常出现在尝试复制一个对象,而该对象的类没有定义复制构造函数时。在这个特定的情境中,问题出在一个名为`CArray, int>`的自定义数组...

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

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

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

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

    构造函数与析构函数

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

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

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

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

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

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

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

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

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

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

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

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

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

    Python 含参构造函数实例详解

    ### Python含参构造函数实例详解 #### 概述 在Python编程语言中,类的实例化过程往往伴随着初始化操作,这一过程通常通过构造函数来实现。构造函数是一种特殊的方法,用于初始化新创建的对象。在Python中,构造...

    继承类的构造函数

    继承类的构造函数 继承类的构造函数是 C++ 编程语言中的一种特殊的函数,它们用于初始化继承类的数据成员。基类的构造函数是不能继承的,在声明派生类时,派生类并没有把基类的构造函数继承过来,因此,对继承过来...

    构造函数的继承问题 笔记

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

    构造函数实例(源码)

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

    c#构造函数的调用过程

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

    重写重载构造函数

    重写重载构造函数 重写是子类的方法覆盖父类的方法,要求方法名和参数都相同。重载是在同一个类中的两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同。 构造函数是在创建给定类型的对象...

    构造函数与默认构造函数

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

    析构或构造函数声明为保护或私有成员

    析构或构造函数声明为保护或私有成员 标题“析构或构造函数声明为保护或私有成员”所对应的知识点主要是关于C++语言中构造函数和析构函数的访问控制。 在C++语言中,构造函数和析构函数可以被声明为私有或保护成员...

Global site tag (gtag.js) - Google Analytics