(三)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,做自我介绍。