默认构造函数的作用(“A”方法没有采用“0”个参数的重载

构造函数主要用来初始化对象。它又分为静态(static)和实例(instance)构造函数两种类别。大家应该都了解如何来写类的构造函数,这里只说下默认构造函数的作用,以及在类中保留默认构造函数的重要性。实际上,我说错了。正确的说法是:以及在类中保留空参数构造函数的重要性。

我们来写一个类A,代码如下:

public class A

{

   public int Number;       //数字

   public string Word;       //文本

}

//在Test类中实例化

public class Test

{

    static void Main()

{

       A a = new A(); //实例化,A()即为类A的默认构造函数

     Console.WriteLine(“Number = {0}"nWord = {1}”,a.Number,a.Word);

       Console.read();

}

}

输出的结果是:

Number = 0

Word =

在上列示例中,我们并没有在A类中明确的写出构造函数,当我们没有提供任何构造函数时,C#自动为类提供了一个默认构造函数,其格式为:

public A()

{

   //空白的方法体

}

这个默认构造函数看起来似乎根本没什么作用,没有接收任何输入参数,方法体也是个空的。那么它真的是无所事事,可有可无的一个东西吗?我们回想下前面所讲的构造函数的主要作用,对,它主要用来初始化对象。看下输出结果,int类型的Number被初始化为默认值0,string类型的Word被初始化为默认值空白字符,这些工作都是由看似没起作用的默认构造函数所完成的。

很快,A类的设计让我们并不满意,我们加强了它的能力,自己提供了构造函数:

public class A

{

    public int Number;     

    public string Word;     

    public A(int number,string word)

{

   Number=number;    //标记1

   Word=word;       //标记2

}

}

//Test类也重新设计

public class Test

{

static void Main()

{

        A a = new A(100,”一百”); //调用了新的带参数构造函数

      Console.WriteLine(“Number = {0}"nWord = {1}”,a.Number,a.Word);

        Console.read();

}

}

输出结果:

Number = 100

Word = 一百

运行很顺利,结果正确。当我们提供了构造函数时,C#认为我们应该是意识到、并且有能力来做好类的初始化工作,于是它将默认的构造函数撤销,将控制权交到了我们手里。我们自己的构造函数能胜任默认构造函数的工作吗?带着怀疑,我们做个尝试,将类A构造函数的方法体清除,即注释掉标记1和2行,重新运行,输出的结果是:

Number =0

Word =

这个结果和调用默认构造函数的结果是一样的,这证明我们自己提供的构造函数能担当默认构造函数的工作。

不久以后,业务进一步扩展,我们要新构一个类,这个类继承自类A,我们把它称为类B:

public class A

{

    public int Number;     

    public string Word;     

    public A(int number,string word)

{

   Number=number;  

   Word=word;    

}

}

public class B:A

{

    public string Name;   //增加一个成员

    public B(int number,string word)

{

   Number = number;

   Word = word;

}

}

//修改Test类

public class Test

{

   static void Main()

{

       B b = new B(100,”一百”);

       Console.WriteLine(“Number = {0}"nWord = {1}”,b.Number,b.Word);

       Console.Read();

    }

}

运行后出错,错误信息是:“A”方法没有采用“0”个参数的重载。为什么会这样呢?看起来我们并没有什么错误呀。A类提供了构造函数,B类也提供了构造函数。你满腹委屈,含泪望着比尔盖茨。老比怒目圆睁,啪的给你一巴掌:“A类还没构造好,你让我怎么给你构造B类!”。A类?构造?A类还要构造吗?你莫名奇妙了。

事实上,B类要完成构造,必须先完成A类的构造。当我们采用:

public B(int number,string word)

来构造B类时,由于没有明确指明继承的构造方法,C#默认我们继承默认构造函数。

public B(int number,string word):base()

采用这条构造函数时,C# 先调用类A的默认构造函数base()完成基类的构造,然后调用B类的构造函数完成针对B类构造的剩余工作。尝试修改上面的相应代码段为:

//在类A中添加一个空参构造函数

public class A

{

     ……

     public A()

     {

         Number =1;

         Word=”空参构造”;

     }

     …….

}

//将类B构造函数改为继承A类空参构造

public B(int number,string word):base()

实际上,我是多此一举了,public B(……):base()与public B(……)是一样的,未显式指明构造函数的继承体时,C#就默认为base()。

输出结果

Number=100

Word = 一百

注意看我们给A类添加的空参构造函数,我们在方法体内给Number赋值1,给Word赋值“空参构造”。然而从输出结果看,这些赋值都被覆盖了。这就说明,base()在前,而后才是public B(…..)。

回头来看我们那个错误的例子。遗憾的是,我们在类A中自己提供了构造函数,这导致A类的默认构造函数消失了,当B类从A类继承默认构造函数时,找不到入口了,这就导致了如上的错误。如果要避免错误,有两种方法:1、在A类中添加一个无参数的构造函数。2、B类构造函数显式继承A类的构造函数。

事情已经解释的很清楚了,不过也许还有个小问题,就是:在B类中,我们提供了一个和A类构造函数结构相同的构造函数,为什么C#不能自动识别,自动继承呢?

道理很简单,C#不能靠猜测来判断我们提供的参数究竟是要用作初始化基类还是继承类。还是来看一个例子:

public class A

{

   public int Number;

   public string Word;

    public A(int number,string word)

    {

        Number = number;

        Word = word;

    }

}

public class B:A

{

    public string Name;

    public B(int number,string word,string name):base(number,word)

    {

        Number = number;

        Word = word;

        Name = name;

    }

}

public class Test

{

    static void Main()

    {

        B b = new B(100,”一百”,”初始化B的参数”);

        Console.WriteLine(“Number = {0}"nWord = {1}"nName = {2}”,

              b.Number,b.Word,b.Name);

        Console.Read();

}

}

输出结果是:

Number = 100

Word = 一百

Name = 初始化B的参数

注意在B类的构造函数中,我们提供了三个参数,其中前两个用于初始化A类中的成员,第三个用于初始化B类的成员。虽然父类构造函数与子类构造函数的参数数量不一样,然而由于我们明确的指定了继承的关系,它们很好的完成了工作。

转载于:https://www.cnblogs.com/tanding/archive/2012/06/27/2564967.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434447.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SourceInsight 设置点滴

SourceInsight是个强大的代码阅读工具, 价格不菲, 目前除了SlickEdit几乎没有可以与之抗衡的, 可能感觉没什么竞争对手的缘故,SI很少更新。SI的设置选项比较多, 这里说几个比较隐蔽的设置: 1. 改变SI的一些…

asp.net 根据当前时间计算是否股票、期货、黄金交易日期

很简单的一个方法: 股票:每周1到周五,上午9:30到11:30 下午13:00 到15:00 期货:每周1到周五,上午9:00到11:30 下午13:30到15:00 黄金:每周1到周五,上午9:00到11:30 下午13:30到15:…

android mac 照片恢复,如何找回Android手机删除的照片?这方法你肯定不知道

安卓手机怎么恢复误删的照片?如何找回Android手机照片?现在大多数人都喜欢用手机拍照存照片,慢慢的,手机中的照片自然而然就会变多,而照片是最占内存的。当你照片达到一定数量,内存快满的时候,连照片都拍不了。所以就…

Asterisk配置文件说明

Asterisk配置文件说明列表 名称 描述 asterisk.conf 主配置文件,通知Asterisk环境目录位置,包含其他所有配置文件所包含的目录,缺省Asterisk会在/etc/asterisk/目录下找到,也可以通过命令参数使用不同的asterisk.conf zaptel.…

apple watch3连android,Apple watch 可以连android手机吗?

在iOS 8.2正式版更新以后,在手机界面上就多出了一个“Apple Watch”的新图标,这是专门针对苹果新产品Apple Watch的应用,主要作用就是连接iPhone和Apple Watch,并未Apple Watch下载应用。打开“Apple Watch”首先进入的是“我的手…

关闭弹出窗体,刷新父页面

parent.location.reload(); window.opener.location.hrefwindow.opener.location.href; 转载于:https://www.cnblogs.com/xbding/archive/2012/07/03/2574660.html

nubia android root权限,获取中兴NX403a (Nubia Z5S Mini Android 4.2)ROOT权限教程,新手必看...

中兴NX403a (Nubia Z5S Mini Android 4.2)如何获取ROOT权限?用什么ROOT工具最简单?请跟着小编一起来看看如何用奇兔刷机对中兴NX403a (Nubia Z5S Mini Android 4.2)进行一键ROOT,小编特别亲手制作了详细的中兴NX403a (Nubia Z5S Mini Android 4.2) ROOT教程图解&a…

A20 编译

android 源码编译分为 2 个部分,一部分是 linux 内核编译,这部分包括 uboot,另一部分是 android 源码编译。所以编译时各自单独编译,编译成功能,最近单独打包成最终烧录的镜像文件。2.1 源码结构说明首先把源码包 A20-…

apache OFBiz的安装

去官网下载OFBiz的代码包。解压这个代码包进入到命令行,输入以下命令 ant build-all 这时候会自动进行安装。这个过程大概有10多分钟。 运行startofbiz脚本。由于我是windows,所以运行startofbiz.bat。在网址输入http://localhost:8080/ecommerce/可以…

android 沉浸栏灰色,Android 沉浸栏实践——踩坑

当前开发环境:Android Studio 2.1.3,compileSdkVersion 24,buildToolsVersion "24.0.2",support:appcompat-v7:24.2.0首先放个图,这就是我要做成的效果,Toolbar 和 Status Bar 一体共用背景图&am…

PHP 免费视频教程

http://php.itcast.cn/php/video.shtml?rm转载于:https://www.cnblogs.com/suneryong/archive/2012/07/12/2588325.html

tcp长连接和保活时间

tcp长连接和保活时间TCP协议中有长连接和短连接之分。短连接在数据包发送完成后就会自己断开,长连接在发包完毕后,会在一定的时间内保持连接,即我们通常所说的Keepalive(存活定时器)功能。 www.2cto.com 默认的Keepa…

android实现文本输入,Android实现智能提示的文本输入框AutoCompleteTextView

今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个。这里我用两种不同的写法来处理。当然,无论用哪一种写法,效果都是一样的。我们先来看效果图。要实现这种效果十分简单。需要一个…

【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式

有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化。在这些情况下,只能缓存页的一部分。顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态内容。页面部分缓…

TCP心跳机制

所谓的心跳包就是客户端定时放送简单的信息给服务器端,告诉它我还在而已。代码就是每隔几分钟发送一个固定信息给服务器端,服务器端回复一个固定信息。如果服务器端几分钟后没有收到客户端信息则视客户端断开。比如有些通信软件长时间不适用,…

A20成功驱动FT5206触摸屏

经过三个晚上的奋斗,终于在A20上驱动了FT5206触摸屏。实现过程有限蹊跷,现在暂时将实现过程记录下来以免遗忘。 FT5206的驱动在bsp里已经以ko文件的形式提供了,只要在sun7i.init.rc这个系统初始化脚本里加上insmod ft5x_ts.ko即可在系统启动时…

ibatis的简介与初步搭建应用

一、ibatis的简介 ibatis是什么东西就不介绍了,自己去找谷老师。 这里讲下自己的使用体会。之前自己学过Hibernate,是看尚学堂的视频教学的,看完以后发现Hibernate体系中的内容真的很多,什么N-N关联、HSQL、缓存管理等等&#xff…

html中页面按钮隐藏div,html 点击一个按钮 显示另一个div 隐藏之前呢个div(display属性,怎么用js控制)...

用户提问隐藏这个显示这个烦烦烦&#xff1a;嘎嘎嘎 推荐答案function tab(name,cursel,n){for(i1;i<n;i){var condocument.getElementById(name"_"i);var con1document.getElementById(name"_"i"_"i);con.style.blockicursel?"display…

You must install 'makeinfo' on your build machine

ubuntu&#xff1a;sudo apt-get install texinfo 就OK 今天在打包的时候有个包需要 makeinfo 当时就各种搜结果就没有 makeinfo 这个软件包&#xff0c;最后看到有人说其实就是 texinfo 这个包&#xff0c;经过测试&#xff0c;不管是ubuntu 还是qomo &#xff08;yum 源&a…

[0716] Jsoi B Rsss

rsss 时间限制:1秒 内存限制: 128 MB 试题描述 在质数的大家庭中&#xff0c;大小之差不超过2的两个质数称它俩为一对孪生素数&#xff0c;如2和3、3和5、17和19等等。请你统计一下&#xff0c;在不大于自然数N的质数中&#xff0c;孪生素数的对数。 输入要求 输入文件rsss.in…