构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与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. windows下搭建svn服务器及权限配置

    服务器端VISUALSVN SERVER 3.3.1 下载地址 https://www.visualsvn.com/server/download/ 客户端TortoiseSVN 1.8.13下载地址 ...

  2. SpringMvc中的Interceptor拦截器的学习

    拦截器是SpringMvc框架中常用的一个东东,它跟Filter相似,但是也有区别,以前也没用过,今天看到就顺便学习了一下. SpirngMvc中的Interceptor主要是通过HandlerInt ...

  3. Mysql的日期转换成星期[某天对应周几]

    |—— 应用中会有各种不同的需求,要灵活应对:比如拿到某一日期要知道是周几 |——DAYOFWEEK(date) [返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六).这些索引值对 ...

  4. 【maven】Maven打包后为何文件大小改变了

    项目中使用了X.509证书,用Maven打包后,测试时报错: java.security.cert.CertificateException: Could not parse certificate: ...

  5. python轻量级ORM---peewee

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/q454684431/article/details/31742367 peewee是一个轻量级的OR ...

  6. 微信跳一跳,Python辅助自动跳程序

    一.说明 此代码借鉴一位大神提供在gitHub上的源码,已经做了简化合并处理,成功连上手机并运行后,可实现自动玩微信跳一跳游戏,刷个1000+的分数轻轻松松 github源码地址 https://gi ...

  7. return 0;和exit(0);的区别

    首先说一下fork和vfork的差别: fork 是 创建一个子进程,并把父进程的内存数据copy到子进程中. vfork是 创建一个子进程,并和父进程的内存数据share一起用. 这两个的差别是,一 ...

  8. python zfill方法给字符串前面补0

    正数补前面补0 n = " s = n.zfill(5) " zfill()也可以给负数补0 n = "-123" s = n.zfill(5) assert ...

  9. H3C 交换机基本设置(telnet、SSH、链路聚合)

    http://www.h3c.com/cn/d_201710/1038172_30005_0.htm#_Toc493869056 H3C S5560S-SI&S5130S-SI[LI]& ...

  10. hadoop深入研究:(十三)——序列化框架

    hadoop深入研究:(十三)--序列化框架 Mapreduce之序列化框架(转自http://blog.csdn.net/lastsweetop/article/details/9376495) 框 ...