构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们即构造函数的重载。写一个类,如果没有写任何的构造函数,那么这个类有一个默认的无参数的构造函数。如果写了构造函数,那么在这个类中就有两个构造函数,一个默认的,一个是自己写的,不过,自己写了构造函数,之前默认的那个构造函数就不能用了,如果还想用之前的那个默认的构造函数,就必须再重新写一个无参数的构造函数。

  构造函数的命名与类名相同,没有返回值,也不能用void修饰,只有访问修饰符public等。

    class Program
{
static void Main(string[] args)
{
Pet p1 = new Pet();//此处执行构造函数Pet()
Pet p2 = new Pet();//此处执行构造函数Pet(int)
Console.WriteLine(p1.Health);
Console.WriteLine(p2.Health);
Console.ReadKey();
}
}
class Pet
{
private int health;
private int fulllevel;
//构造函数没有返回值,名字和类名相同
//构造函数在对象被new的时候调用
//如果不指定构造函数,即注释掉下面的Pet()函数,类中会默认创建一个无参的构造函数
//当制定了一个构造函数,就不会有默认的无参构造函数,若需要无参构造函数则需要自己写
public Pet()
{
this.health = ;
this.fulllevel = ;
}
public Pet(int health)
{
this.health = health;//后一个health是形参的health
}
public int Health
{
get
{
return health;
}
}
}

一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同来区分它们 即构造函数的重载。构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的;每次实例化(既上面的new A())一个类时,就会调用构造函数。

  继承是根据一个类来定义另一个类,子类包含父类中所有字段,例如,哺乳动物为一个类,人为哺乳动物的一个派生类。

    class Person//父类
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public Person()
{
Console.WriteLine("A构造");
}
}
class Chinese:Person//派生类,包含有Person类中的Name,Age字段和自生的gender字段
{
public string gender
{
get;
set;
}
public Chinese()
{
Console.WriteLine("B构造");
}
}

  子类对象可以指向父类中的变量,显式转换转换失败会报错,而as转换失败不会报错,会使结果为null。还有个类型的判断符为is,用于判断一个类型是否为指定类型,返回值为true或者false。

    class Program
{
static void Main(string[] args)
{
Chinese chi=new Chinese();//一个new就是一个对象
//chi.gender="man";
//chi.Age = 15;
//Console.WriteLine(chi.Age);
Person people = chi;//父类变量可以指向子类的变量
chi.gender="man";
//Chinese ch = people;//无法把子类变量指向父类的变量
Chinese ch = (Chinese)people;//通过显式转换可以使子类变量指向父类的变量,如果转换失败就抛异常
Chinese ch1 = people as Chinese;//如果转换失败不报错,结果为null
if (ch1 is Chinese)
{
Console.WriteLine(ch1.Name);
}
Console.ReadKey();
}
}

 父类和子类中,你声明的是哪一个,调用时就调用哪一个,如下面的例子

        static void Main(string[] args)
{
//子类和父类的调用时,前面声明的是子类就调用子类,声明的是父类就调用父类
//因为声明了哪一个,类型指针就是哪一个
Human xiaoming=new Human();
xiaoming.Age=;
xiaoming.Gender=true;
xiaoming.Name="小明";
xiaoming.SayHi();
Console.WriteLine(); Person xiaohong=new Human();
xiaohong.Age = ;
xiaohong.Gender = false;
xiaohong.Name = "小红";
xiaohong.SayHi(); Console.ReadKey();
}
} class Person
{
#region 姓名
/// <summary>
/// 姓名
/// </summary>
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
#endregion
#region 年龄
/// <summary>
/// 年龄
/// </summary>
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
#endregion
#region 性别
/// <summary>
/// 性别
/// </summary>
private bool gender;
public bool Gender
{
get { return gender; }
set { gender = value; }
}
#endregion public virtual void SayHi()//虚方法,用于重写
{
Console.WriteLine("父类");
}
} class Human:Person
{
public void SayHi()
{
Console.WriteLine("子类");
}
}
}

最后执行代码的结果为

这是因为你声明了哪个类型,类型指针就确定了是哪一个,声明了Person父类,就算实例化new为子类Human,类型指针还是父类。

  多重继承C#中不支持,只能使用接口才能实现,现在还没学会,留待以后补全。

执行子类的构造函数时,会自动先执行父类的构造函数,当父类中的构造函数为无参时,子类也为无参,当父类中构造函数为有参构造函数时,子类需要添加如下所示

        //父类中
public Person(int b)
{
Console.WriteLine("A构造");
}
//子类中
public Chinese():base()
{
Console.WriteLine("B构造");
}

子类中的构造函数既可以有参也可以无参。而如果Person还有父类,则会先调用Person的父类的构造函数。构造函数调用总是从最年长的开始调用,即最老的父类。protected的函数只能在子类及自己中调用,主函数中不可调用。

  类的组合:当你需要用到某一个类中的部分对象,只需要把需要的对象加入到你的类中即可。

        static void Main(string[] args)
{
Monkey houzi=new Monkey();
houzi.PS=new Person();
houzi.吃香蕉();
Console.ReadKey();
}
} class Person//父类
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
public void 吃饭()
{
Console.WriteLine("饭好吃");
}
} class Monkey//组合,若只想使用一个类中的部分动作,不用继承,而用组合,是让另外一个类帮助你完成这个动作
{
public Person PS//定义一个PS为Person类
{ get; set; }
public void 吃香蕉()//吃香蕉这个动作由Person类中的吃饭完成
{
PS.吃饭();
}
}

2018.08.06/07

新手C#构造函数、继承、组合的学习2018.08.06/07的更多相关文章

  1. 新手C#面向对象的学习2018.08.06

    class Person//声明一个Person类 { //类中的声明与Main中不同,类中声明的是字段而不是函数. public string gender; public string name= ...

  2. 新手C#重载、重写的学习2018.08.04

    重载:在同一类(class)中,使用相同的方法名称,不同的参数和(不一定)不同的返回值类型构造成的方法. 举例: class OverLoadTest { public void Hello() { ...

  3. 新手C#属性set,get的学习(部分转)2018.08.06

    public class person { public string name; } public class person { public string Name { set; get; } } ...

  4. 强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning)

    强化学习读书笔记 - 06~07 - 时序差分学习(Temporal-Difference Learning) 学习笔记: Reinforcement Learning: An Introductio ...

  5. JS高阶---继承模式(借用构造函数继承+组合继承)

    (1)借用构造函数继承 案例如下: 验证: (2)组合继承 案例如下: 验证如下: 结果如右图所示 . .

  6. 新手C#参数类型ref、out、params的学习2018.08.04

    ref用于传递参数时,将实参传递到函数中,是引用参数,在使用前必须被赋值.string类型也同样适用. static void Main(string[] args) { string a1,a2; ...

  7. (转)新手C#SQL语句的学习2018.08.13

    1.创建数据库(create) CREATE DATABASE database-name 2.删除数据库(drop) drop database dbname 3.备份数据库 --- 创建 备份数据 ...

  8. 新手C#SQLServer在程序里实现语句的学习2018.08.12

    从C#中连接到SQL Server数据库,再通过C#编程实现SQL数据库的增删改查. ado.net提供了丰富的数据库操作,这些操作可以分为三个步骤: 第一,使用SqlConnection对象连接数据 ...

  9. 新手C#异常的学习2018.08.07

    异常是在程序执行期间出现的问题.C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零. class Program { static void Main(string[] args) ...

随机推荐

  1. Python IDE集成开发工具

    Python IDE集成开发工具 Python IDE 本文为大家推荐几款款不错的 Python IDE(集成开发环境),比较推荐 PyCharm,当然你可以根据自己的喜好来选择适合自己的 Pytho ...

  2. Ctrl+K,Ctrl+D

    先按下Ctrl+K,然后按下Ctrl+D可以自动调整代码.

  3. jQuery 参数详解

    url: 要求为String类型的参数,发送请求的地址.如果没有填写, 默认发送当前页的url type: 要求为String类型的参数,请求方式(post或get)默认为get. 注意其他http请 ...

  4. 判断一棵树是否为二叉搜索树(二叉排序树) python

    输入一棵树,判断这棵树是否为二叉搜索树.首先要知道什么是排序二叉树,二叉排序树是这样定义的,二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的 ...

  5. tf.cast()数据类型转换

    tf.cast()函数的作用是执行 tensorflow 中张量数据类型转换,比如读入的图片如果是int8类型的,一般在要在训练前把图像的数据格式转换为float32. cast定义: cast(x, ...

  6. vue+webpack多个项目共用组件动态打包单个项目

    原文复制:https://www.jianshu.com/p/fa19a07b1496 修改了一些东西,因为sh脚本不能再window电脑执行,所以改成了node脚本.这是基于vue-cli2.0配置 ...

  7. hasura graphql 引擎基本试用

    hasura 使用一个基于pg数据库的graphql引擎,他的设计比postgrpahql 有好多方便的地方,同时使用也比较简单 安装 docker && docker-compose ...

  8. 随笔教程:FastAdmin 如何打开新的标签页

    随笔教程:FastAdmin 如何打开新的标签页 FastAdmin 有弹窗功能有时候不能胜任所有情况,有一定局限性. 那这时候就需要在新的标签页打开页面. 在 FastAdmin 中打新的标签页很简 ...

  9. centos下memcached安装

    memcached是一款高速.分布式的内存缓存系统.其官方主页在http://www.danga.com/memcached/ 1.安装前的准备 要安装memcached,需要有libevent的支持 ...

  10. 根据给定文件编写Makefile文件 两种方法编译

    实例一 1.分析源文件代码依赖关系 mian.c #include "test1.h" #include "test2.h" #include <stdi ...