构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与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. [批处理]批量提取MKV资源

    最初是下了部没字幕的动漫,是720P MKV格式的,当时没注意,下完了以后才发现是没字幕的 后来去射手上找没有,百度了半天也没有 最后只能求救与已经下了这部动漫是MKV格式且是内挂字幕的人来帮忙 最后 ...

  2. 模板方法模式templeteMethod

    引出模板模式: 考试试卷问题,提炼后的代码: package com.disign.templetemethod; import org.junit.Test; /** * Created by zh ...

  3. php session目录找不到的错误 Error session_start(): open(/var/lib/php/session error

    问题来源 今天安装一个应用,发现提示 Error session_start(): open(/var/lib/php/session error,估计是找不到写不了啥啥啥. 于是我就去该路径下去看看 ...

  4. Windows下Java JDK8配置环境变量

    JDK最新版已经出到了jdk8u60,下载安装完成后,还需要配置环境变量,下面小编就给大家分享下jdk 8.0的环境变量配置教程,希望大家喜欢. jdk8.0环境变量配置教程 右键选择 计算机→属性→ ...

  5. WinSCP一个好用的连接linux服务器的

    用虚拟机ssh登陆远程服务器,终端命令copy本地文件到服务器简直弱爆了. 不然用win下的WinSCP,牛逼到爆了.操作跟FTP软件差不多

  6. oracle 之 安装10.2.0.1 且 升级到 10.2.0.4

    一. centos 6.5 安装 oracle 10.2.0.1 1.安装操作系统,选择桌面环境 2.配置本地yum源 , 可参考 http://blog.csdn.net/zhang12345645 ...

  7. NOIP 2005 校门外的树

    #include<iostream> #include<cstring> using namespace std; int a[10005]; int main() { mem ...

  8. virtualenv基本使用

    win 安装 virtualenv pip3 install virtualenv 创建虚拟环境 virtualenv env1 进入虚拟环境 env1/Scripts/activate 退出虚拟环境 ...

  9. TF54000: 由于服务器时钟设置可能不正确,无法更新数据解决方案(补充)

    此问题出现的原因: 服务器时间比本地时间大.由于TFS源代码的Source Control会根据签入时间做判断.如果后续签入的时间小于变更集的最新版本的时间,就会报错误“TF54000”,并拒绝签入. ...

  10. C++ is-a关系

    首先举一个例子: 在日常生活中,我们所说的眼镜大都是带框的眼镜,但是当提起隐形眼镜时,我们想一下它属不属于眼镜呢?答案肯定是属于的.这里的隐形眼镜和眼镜就是属于 is-a 的关系. 在面向对象编程过程 ...