(三)C#基础加强系列之“ 继承之构造方法 ”篇

 

   在上一篇中已经为大家讲解了“构造方法” ,也应该对构造方法有了些了解,接下来呢,为大家讲解一下关于面向对象中的继承的构造方法。

   首先,我们知道了构造方法最主要的作用就是初始化数据,先来看下面的一段代码,顺便回想一下:

类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01关于继承的构造方法
{
    class Person
    {
        public int num1;
        public int num2;
    }
}

主方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _01关于继承的构造方法
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            Console.WriteLine("num1的值为:{0}",p.num1);//没有为类中的 nmu1 赋值

            p.num2 = 100;
            Console.WriteLine("num2的值为:{0}",p.num2);//为类中的 num2 赋值100
            Console.ReadKey();
        }
    }
}

得到的结果为:

   num1 的值我们并没有为其赋值,但是我们照样能打印出 num1 的值,并且 num1 的值为0,为什么呢?这就是构造方法为我们做的的事情,构造方法会内部初始化数据,并且初始值为0。

 列举一下常用类型的初始值:

数据类型:   0

字符类型:  \0 空

bool类型:  false

string类型:  " "

 

  那么,我们就进入 关于继承中的构造方法:

  首先呢?先问问大家

(1)子类继承父类,那么子类对象会调用父类中的构造方法吗?如果会,那么类中的构造方法的调用顺序又是什么呢?先子类? 还是先父类?

(2)如果父类中的构造方法有重载,调用构造方法又是怎么执行的呢?

(3)另外,父类中的字段、构造方法等,哪些会被子类继承下来,哪些不会被继承下来呢?

  父类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _02关于继承的构造方法
{
    class BaseClass  //父类
    {
        public BaseClass()  //BaseClass的构造方法
        { 
        }
    }
}

子类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _02关于继承的构造方法
{
    class Class : BaseClass  //Class类继承于BaseClass类   子类
    {
        public Class()  //Class类的构造方法
        { 
        }
    }
}

主方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _02关于继承的构造方法
{
    class Program
    {
        static void Main(string[] args)
        {           
            Class b1 = new Class(); //实例化子类 Class
        }
    }
}

内部执行顺序:

第一步:跳到  Class b1 = new Class();

第二步:跳到  public Class();

第三步:跳到  public BaseClass();

第四步:开始执行 public BaseClass();

第五步:开始执行 public Class();

最后:实例化 Class b1 = new Class(); 

完成

第一个问题答案:

通过调试发现:调用的顺序是先调用父类中的构造方法,在调用子类的构造方法。所以说,子类会调用父类中的构造方法。

 

第三个问题答案:

关于哪些被继承,哪些没有被继承:

1、所有的非私有成员都会被继承。

2、构造方法与私有成员都没有被继承。

不用深究。

 

 

第一篇的方法篇已经为大家讲解了 方法, 下面就将讲解一下 方法的重载以便更方便的回答出上面的问题:

 

判断方法的是否重载:

第一:去掉方法名前面的东西。

第二:去掉括号中的参数名与花括号。

第三:比较不重合的就构成了重载。

 

看下面的图,来说明情况:

 

两个完全相同的方法是不能构成重载的:

报错结果:

 

两个方法,方法名一致,类型相同,参数类型相同,参数名不相同,同样是不能构成方法的重载的:

报错结果:

 

两个方法,方法名一致,参数不一致,构成了方法的重载:

 

两个方法,方法名一致,参数名一致,但是参数类型不一致:构成了方法额重载:

总接一下:我们自己写构造方法和看几个方法是否是构造方法时

(1)与函数类型无关,函数名必须一致。

(2)与参数名称无关,与参数类型有关。

 

方法的重载非常容易的实现,那么方法的重载有什么好处呢?

答:当我们考虑要执行某个方法时为了达到同一目的但是是不同情况,不同的要求,比如有时我们不需要参数,有时需要少量的参数,有事又需要多量的参数,根据情况而定,另外,方法的功能可以通过不同的参数结合做到我们索期望的功能,不用为了每一个方法的不同情况而各写一个方法。使得对象的结构更加的清晰。

上面带着大家学习了一下方法的重载,接下来就来回答  “如果父类中的构造方法有重载,调用构造方法又是怎么执行的呢?看下面的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace _04构造方法的重载_继承_内部调用顺序
{
    class Program
    {
        static void Main(string[] args)
        {
            Student st = new Student("Mr Lucky"); //实例化Student类
            Console.ReadKey();
            
        }
    }

    class Person //定义一个Person类  父类
    {
        public Person() //第一个构造方法
        {
            Console.WriteLine("我是无参的方法哦,亲~");
        }

        public Person(string name)  //第一个构造方法  有参数
        {
            Console.WriteLine("我是有参数的方法哦,亲~,我的参数是:{0}",name);
        }
    }

    class Student : Person //定义一个Student类 继承自Person类
    {
        public Student(string name) //Student类的构造方法  带一个参数
        {

        }
 
    }
}

得到的结果:

大家有可能会觉得奇怪,我定义的 Student类中写了一个带参数的构造函数,父类中也有一个带有参数的构造函数,应该会对应的执行带了一个参数的构造函数呀!

在这里,大家要记住:

默认情况下,都是调用父类中的无参构造方法。

 

如果我将没有参数的构造方法注释掉,再重新执行一遍代码:

得到的结果将会报错:

如果父类中没有提供无参的构造方法,但是提供了有参的构造方法,那么无参的构造方法就不会自动生成,那么,在没有手写无参构造方法的时候,在创建子类对象的时候,没有指定父类中的构造方法就会报错。

怎么指定父类中的构造方法呢?

我只需要把 Student 的构造方法这样写即可:

得到的结果:

 

前面说的默认情况的完整写法:

好了,今天就为大家讲解了继承中的构造方法,写这个就是为了帮大家理清理清思路,后面还有很多要学习的,大家一定要坚持,和博主一起加油!加油!!加油!!!不放弃!!!

 

 

 

练习:

写一个Person类和Student类,姓名(name),性别(gender),年龄(age),必须由构造方法初始化。

年龄默认为0,性别随机,姓名由子类知道调用。

创建一个Student,做自我介绍。

转载于:https://www.cnblogs.com/MrLucky/archive/2012/10/21/2732835.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值