类的构造器(constructor):

1.       先看两个类定义:

class A{ }

相当于:

class A: object

{

Public A ( ) : base( )

{   }

}

2.       在类定义中定义自定义构造函数,默认构造函数会被默默地删除; 所以必须为类显式重定义默认构造函数,否则不能使用默认构造函数创建类类型的实例.

3.       看一个代码:

using System ;

class A

{

public A()

{

Console .WriteLine ("我来了");

}

}

class Test

{

static void Main()

{

A a = new A ();

}

}

输出: 我来了 .

->构造器在类实例化的过程中执行.

->构造器没有返回值.

4. 类在实例化的时候会对它的成员变量进行初始化; 但在使用局部变量之前必须要赋值.

using System ;

class A

{

public int i;

public string s;

}

class Test

{

static void Main()

{

A a = new A ();

Console .WriteLine ("i="+a.i);

Console .WriteLine ("s="+a.s);

}

}

输出: i=0

S=

5. 构造器重载:

using System ;

class A

{

public int i;

public string s;

public A()

{

}

public A(int i)

{

this.i=i;

}

public A(string s)

{

this.s=s;

}

public A(int i , string s)

{

this.i=i;

this.s=s;

}

}

class Test

{

static void Main()

{

A a = new A ();

Console.WriteLine ("第一个构造器");

Console .WriteLine (a.i);

Console .WriteLine (a.s);

A a1 = new A (1);

Console.WriteLine ("第二个构造器");

Console .WriteLine (a1.i);

Console .WriteLine (a1.s);

A a2 = new A ("我是第三个");

Console.WriteLine ("第三个构造器");

Console .WriteLine (a2.i);

Console .WriteLine (a2.s);

A a3 = new A (3,"我是第四个");

Console.WriteLine ("第四个构造器");

Console .WriteLine (a3.i);

Console .WriteLine (a3.s);

}

}

6. 成员变量初始化: C#允许在声明成员变量时对其进行初始化,但这样会产生代码冗余.

using System ;

class A

{

public int i=100;

public string s="森林";

public A()

{

}

public A(int i)

{

this.i=i;

}

public A(string s)

{

this.s=s;

}

public A(int i , string s)

{

this.i=i;

this.s=s;

}

}

可改成:

using System ;

class A

{

public int i;

public string s;

public A()

{

i=100;

s="森林";

}

public A(int i):this()     //注意this的使用

{

this.i=i;

}

public A(string s):this()

{

this.s=s;

}

public A(int i , string s):this()

{

this.i=i;

this.s=s;

}

}

7. 看一段代码:

using System ;

class A

{

public A()

{

Console .WriteLine ("我是类A的无参构造器");

}

public A(int i)

{

Console .WriteLine ("我是类A的带有一个参数的构造器");

}

}

class B:A

{

public B()

{

Console .WriteLine ("我是类B的无参构造器");

}

public B(int i)

{

Console .WriteLine ("我是类B的带有一个参数的构造器");

}

}

class Test

{

static void Main()

{

B b=new B (100);

}

}

输出: 我是类A的无参构造器

我是类B的带有一个参数的构造器

è     继承类在实例化的时候会自动调用父类的无参构造器,如果找不到, 会报错. 除非继承类有另外指定.

è     在C#中,除非另外指定,基类的默认构造函数是在执行自定义的子类构造函数逻辑之前自动调用的;

è     为优化派生类的创建,应该显式调用一个合适的自定义基类构造函数而不是默认(基类)构造函数来实现子类构造函数;

.作为一般规则, 所有的子类应该显式调用一个合适的基类构造函数;

8. base和this关键字的使用:

->this关键字作用:   (1) 进行自引用; (2) 转发构造函数调用 .

->this是个隐含指针, 指向类实例化后的对象本身.

->在任何子类想访问由父类定义的公共或受保护成员时,都可以使用base关键字, 并不限制在构造函数逻辑中;

using System ;

class A

{

public A()

{

Console .WriteLine ("我是类A的无参构造器");

}

public A(int i)

{

Console .WriteLine ("我是类A的带有一个参数的构造器");

}

}

class B:A

{

public B()

{

Console .WriteLine ("我是类B的无参构造器");

}

public B(int i):base(i) //注意base的使用

{

Console .WriteLine ("我是类B的带有一个参数的构造器");

}

// public B(int i ,int j)

// {

//     Console.WriteLine ("我是类B的带有两个参数的构造器");

// }

}

class Test

{

static void Main()

{

B b=new B (100);

}

}

输出: 我是类A的带有一个参数的构造器

我是类B的带有一个参数的构造器

9. 静态构造器(static constructor)

->静态构造函数是实现对一个类进行初始化的方法成员. 它一般用于对静态数据的初始化. 静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数自动被调用.

->在一个程序的执行过程中,静态构造器最多只执行一次.

->静态构造器在类的静态成员初始化之后执行.或者说编译器会将静态成员初始化语句转换成赋值语句放在静态构造器执行的最开始.

->静态构造器在任何类的静态成员被引用之前执行.

->静态构造器在任何类的实例变量被分配之前执行.

下面这个代码,编译器会自动创建一个静态构造器:

using System ;

class A

{

public static int i=100;

public A()

{

Console .WriteLine ("我是类A的无参构造器");

}

}

再看一段代码:

using System ;

class A

{

public static int i=100;

static A()

{

Console .WriteLine ("我是类A的静态构造器");

}

public A()

{

Console .WriteLine ("我是类A的无参构造器");

}

}

class Test

{

static void Main()

{

A a = new A ();

A a1 = new A ();

}

}

输出: 我是类A的静态构造器

我是类A的无参构造器

我是类A的无参构造器

è     静态构造器只执行一次.

类的构造器[constructor]_C#的更多相关文章

  1. C#.NET常见问题(FAQ)-构造器constructor有什么用

    所谓的构造器constructor,就是声明类的时候定义一个public 类名的方法,这个方法不需要传递任何数据,这样的话在声明任何类的实例的时候都会无条件执行里面的方法   析构器只在程序销毁的时候 ...

  2. 【Java面试题】7 构造器Constructor是否可被override?

    构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload. Constructor不能被继承,所以Constructor也就不能被override.每一个类必 ...

  3. 构造器Constructor

    构造器Constructor是否可被override构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading 首先,构造器是不能被继承的,因为每个类 ...

  4. 构造器Constructor是否可被override?

    构造器Constructor是否可被override? 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading.

  5. Java8自定义函数式编程接口和便捷的引用类的构造器及方法

    什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...

  6. 类的构造器-init和new

    提到构造器,大家都会想到 __init__,那么__new__是什么?也是构造器. init 构造器 都很熟悉了,直接上代码 class MyClass(object): def __init__(s ...

  7. Scala类的构造器与访问器

    1.构造器 在Scala中,每个类都有一个主构造器.主构造器与类的定义交织在一起,如下: class Person ( private var _name: String, private var _ ...

  8. 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用

    package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...

  9. jnhs-java实体类的有参构造器 无参构造器Could not instantiate bean class 实体类No default constructor found

    new一个对象的时候要用到构造函数, 例如Hello hello = new Hello();这时调用的是Hello的无参数构造方法; Hello hello = new Hello("hi ...

随机推荐

  1. Java中throws和throw的区别讲解

    当然,你需要明白异常在Java中式以一个对象来看待.并且所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,但是一般情况下Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示, ...

  2. 自己写一个jQuery垂直滚动栏插件(panel)

    html中原生的滚动栏比較难看,所以有些站点,会自己实现滚动栏,导航站点hao123在一个側栏中,就自己定义了垂直滚动栏,效果比較好看,截图例如以下: watermark/2/text/aHR0cDo ...

  3. python的一些总结4

    这篇继续水 但是在水的的基础上 让搭建能正常使用flask 搭建一个站 上篇讲到在 模板view中 输入{{xx }} 可以打印 后台传的值. 这篇讲一下 循环控制 条件控制等 修改后台代码: @ap ...

  4. delphi TPopupMenu.Popup

      procedure TPopupMenu.Popup(X, Y: Integer);     这个点是相对桌面的而不是窗体的   GetCursorPos是鼠标的位置 鼠标动这个点就不一样   v ...

  5. makefile中的patsubst

    函数名称:加前缀函数—addprefix. 函数功能:为“NAMES…”中的每个文件名称加入前缀“PREFIX”.參数“NAMES…”是空格切割的文件名称序列,将“SUFFIX”加入到此序列的每个文件 ...

  6. linux 下网站压力测试工具webbench

    一直在用webbench ,这个linux下的网站压力测试工具.整理下. 笔记本装的ubuntu,其他linux系统也差不多. webbench 需要先安装 ctags,一个vim的阅读插件,可以直接 ...

  7. python selenium自动化(二)自动化注册流程

    需求:使用python selenium来自动测试一个网站注册的流程. 假设这个网站的注册流程分为三步,需要提供比较多的信息: 在这个流程里面,需要用户填入信息.在下拉菜单中选择.选择单选的radio ...

  8. MYSQL分页limit速度太慢优化方法

    http://www.fienda.com/archives/110 在mysql中limit可以实现快速分页,但是如果数据到了几百万时我们的limit必须优化才能有效的合理的实现分页了,否则可能卡死 ...

  9. C#多线程的介绍(园子里比较全的一篇)

    一.多线程的概念  Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一 ...

  10. cocos2d-x使用tinyxml2存储解析xml

    我用的是2.1.4的cocos2d-x,里面自带有tinyxml2库. 导入头文件:#include "support/tinyxml2/tinyxml2.h" using nam ...