类的构造器[constructor]_C#
类的构造器(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#的更多相关文章
- C#.NET常见问题(FAQ)-构造器constructor有什么用
所谓的构造器constructor,就是声明类的时候定义一个public 类名的方法,这个方法不需要传递任何数据,这样的话在声明任何类的实例的时候都会无条件执行里面的方法 析构器只在程序销毁的时候 ...
- 【Java面试题】7 构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload. Constructor不能被继承,所以Constructor也就不能被override.每一个类必 ...
- 构造器Constructor
构造器Constructor是否可被override构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading 首先,构造器是不能被继承的,因为每个类 ...
- 构造器Constructor是否可被override?
构造器Constructor是否可被override? 构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading.
- Java8自定义函数式编程接口和便捷的引用类的构造器及方法
什么是函数编程接口? 约束:抽象方法有且只有一个,即不能有多个抽象方法,在接口中覆写Object类中的public方法(如equal),不算是函数式接口的方法. 被@FunctionalInterfa ...
- 类的构造器-init和new
提到构造器,大家都会想到 __init__,那么__new__是什么?也是构造器. init 构造器 都很熟悉了,直接上代码 class MyClass(object): def __init__(s ...
- Scala类的构造器与访问器
1.构造器 在Scala中,每个类都有一个主构造器.主构造器与类的定义交织在一起,如下: class Person ( private var _name: String, private var _ ...
- 方法引用_通过this引用本类的成员方法和方法引用_类的构造器(构造方法)引用和数组的构造器引用
package com.yang.Test.ThisMethodReference; /** * 通过this引用本类的成员方法 */ public class Husband { //定义一个买房子 ...
- jnhs-java实体类的有参构造器 无参构造器Could not instantiate bean class 实体类No default constructor found
new一个对象的时候要用到构造函数, 例如Hello hello = new Hello();这时调用的是Hello的无参数构造方法; Hello hello = new Hello("hi ...
随机推荐
- PROCESS_YIELD()宏和C语言的switch语句< contiki学习笔记之七>
写在前面: 按照main()函数的代码一行一行的分析,该是看到了 etimer_process 这个位置.但是etimer_process实现里的一个宏 PROCESS_YIELD()引出了很多故事 ...
- Hadoop on Mac with IntelliJ IDEA - 3 解决MRUnit - No applicable class implementing Serialization问题
本文讲述在IntelliJ IDEA中使用MRUnit 1.0.0测试Mapper派生类时因MapDriver.withInput(final K1 key, final V1 val)的key参数被 ...
- UVa657 The die is cast
// 题意:给一个图案,其中'.'表示背景,非'.'字符组成的连通块为筛子.每个筛子里又包含两种字符,其中'X'组成的连通块表示筛子上的点 // 统计每个筛子里有多少个"X"连通块 ...
- Win7 不能安装 msi 解决办法
Win7 不能安装Setup.msi解决办法 解决方案如下: 新建一个文本文件,输入msiexec /i d:\Setup.msi (假设文件名为Setup.msi ,放在d盘根目录下,即是安装程序的 ...
- 【智能家居篇】wifi在智能家居中的应用
转载请注明出处:http://blog.csdn.net/Righthek 谢谢! 在设计智能家居系统方案时,一个很关键的point就是组网方式.组网方式关系到整个智能家居系统的稳定性.可扩展性.实时 ...
- MySQL server version for the right syntax to use near ‘USING BTREE
转自:http://www.douban.com/note/157818842/ 有时导入mysql会提示如下错误: C:\Users\liqiang>mysql -uroot -paaaaaa ...
- 《赢在用户:Web人物角色创建和应用实践指南》阅读总结
本书针对创建人物角色的每一个步骤,包括进行定性.定量的用户研究,生成人物角色分类,使人物角色真实可信等进行了十分详细的介绍.而且,在人物角色如何指导总体商业策略.确定信息架构.内容和设计 ...
- 关于更改apache和mysql的路径的问题..
1.禁用selinux 系统管理->selinux管理->enforing模式..改为disable..然后重启 2.修改httpd.conf的各个路径 索引后发现指向欢迎页面则注释下面这 ...
- Python学习 之 函数
1.为什么要使用函数 (1)降低编程难度:将复杂的问题分解成简单的小问题 (2)代码重用 2.函数的定义 def 函数名(参数列表):#可以没有参数 函数体 3.函数缺省参数(默认参数):设置默认参数 ...
- C语言的ANSI/ISO标准
摘自:http://see.xidian.edu.cn/cpp/html/1658.html 从技术上讲有两种C语言标准,一种来自ANSI(American National Standard Ins ...