构造函数

简介:
构造函数是一种特殊的函数,该函数没有返回值,且名称必须和类的名称一致。更重要的是构造函数不可以被继承。
当一个类没有定义任何的构造函数时,编译器会给这个类一个默认的构造函数。
默认的构造函数没有参数,且是public访问修饰。

构造函数是类最先调用的函数。又被分为实例构造函数和静态构造函数。

静态构造函数(也叫类型构造函数):一个类只能有一个静态构造函数。该构造函数没有访问修饰,没有参数。
静态构造函数在整个运行中,只被访问一次,那是在对该类第一次实例化或第一次调用该类的静态成员是访问静态构造函数。
所以说静态构造函数比实例构造函数(如果存在实例构造函数)调用得更早。

实例构造函数可以有多种访问修饰,可以有参数(也就是说可以有多个实例构造函数),实例构造函数是当用户实例化类的时候,也就是在用new构造类的时候调用。

1   public   class  Space
2   {
3
4 public static void Main(string[] args)
5 {
6 Order order1 = new Order();
7 System.Threading.Thread.Sleep(500);
8 Order order2 = new Order();
9 System.Threading.Thread.Sleep(500);
10 Order order3 = new Order();
11 }

12
13 }

14
15   public   class  Order
16   {
17
18 static Order()
19 {
20 System.Console.WriteLine("Static Order()");
21 }

22 public Order()
23 {
24 System.Console.WriteLine("Order()");
25 }

26 }


运行上面的代码,你可以发现,System.Console.WriteLine("Static Order()");只被调用了一次。而System.Console.WriteLine("Order()");在每次new的时候都被调用。

构造函数虽然不能被继承,也不能在非New的时候被调用,但是构造函数却可以调用基类的构造函数和当前类的其他构造函数(当然是指实例构造函数了,因为静态构造函数当前类只有一个,静态构造函数也不能访问基类的构造函数)
基类的构造函数通过base关键字访问。当前实例的其他构造函数通过this访问。且base和this都比当前构造函数优先。

请运行和分析一下下面的代码
1   public   class  Space
2   {
3
4 public static void Main(string[] args)
5 {
6 ShipOrder ShipOrder1 = new ShipOrder();
7 System.Console.WriteLine("----------------");
8 System.Threading.Thread.Sleep(500);
9 ShipOrder ShipOrder2 = new ShipOrder();
10 System.Console.WriteLine("----------------");
11 System.Threading.Thread.Sleep(500);
12 ShipOrder ShipOrder3 = new ShipOrder();
13 }

14
15 }

16
17   public   class  Order
18   {
19
20 static Order()
21 {
22 System.Console.WriteLine("Static Order()");
23 }

24 public Order()
25 {
26 System.Console.WriteLine("Order()");
27 }

28
29 public string Number;
30 }

31
32   public   class  ShipOrder : Order
33   {
34
35 public ShipOrder(string number)
36 : base()
37 {
38 System.Console.WriteLine("ShipOrder(string)");
39 }

40
41 public ShipOrder()
42 : this("12-123")
43 {
44 System.Console.WriteLine("ShipOrder()");
45 }

46
47
48 }
我们实例化ShipOrder(无参构造函数)时,该构造函数要求先调用一个含string的有参构造函数(第42行)。而有参构造函数却要先调用基类Order的构造函数(第36行)。而基类Order有静态构造函数,静态构造函数优先,所以

运行的结果是
Static Order()
Order()
ShipOrder(string)
ShipOrder()
----------------
Order()
ShipOrder(string)
ShipOrder()
----------------
Order()
ShipOrder(string)
ShipOrder()


有意思的是我们修改一下代码
1   public   class  Space
2   {
3
4 public static void Main(string[] args)
5 {
6 ShipOrder ShipOrder1 = new ShipOrder();
7 System.Console.WriteLine("----------------");
8 System.Threading.Thread.Sleep(500);
9 ShipOrder ShipOrder2 = new ShipOrder();
10 System.Console.WriteLine("----------------");
11 System.Threading.Thread.Sleep(500);
12 ShipOrder ShipOrder3 = new ShipOrder();
13 }

14
15 }

16
17   public   class  Order
18   {
19
20 static Order()
21 {
22 System.Console.WriteLine("Static Order()");
23 }

24 public Order()
25 {
26 System.Console.WriteLine("Order()");
27 }

28
29 public string Number;
30 }

31
32   public   class  ShipOrder : Order
33   {
34
35 public ShipOrder(string number)
36 //: base()
37 {
38 System.Console.WriteLine("ShipOrder(string)");
39 }

40
41 public ShipOrder()
42 : this("12-123")
43 {
44 System.Console.WriteLine("ShipOrder()");
45 }

46
47 }

注意第36行,现在的运行结果是什么样的呢?
结果和刚才一样,因此我们证明,无论怎么样,在构造子类前,编译器会先构造基类。

ok,最后我们看一下,下面的运行结果你认为是什么呢?
1 public   class  Hello
2 {
3 private static int n=20;
4 public int m=10;
5 static Hello()
6 { System.Console.WriteLine(n); }
7 public Hello():this(15)
8 { System.Console.WriteLine(this.m);
9 System.Console.WriteLine(n);
10 System.Console.ReadLine(); }

11 public Hello(int i ):base()
12 { System.Console.WriteLine(i); }
13 public static void Main(string[] args)
14 new Hello(); }
15}

16

 


本文转自shyleoking 51CTO博客,原文链接:http://blog.51cto.com/shyleoking/806290

相关文章
|
IDE 搜索推荐 编译器
使用esp8266使用小爱同学实现开灯与关灯操作
使用esp8266使用小爱同学实现开灯与关灯操作
500 0
|
10月前
|
JSON 数据挖掘 API
京东店铺所有商品 API 接口系列(京东 API)
京东店铺所有商品API接口用于获取指定店铺的全面商品信息,包括基本属性、价格、库存、销售数据等。前期需仔细研读接口文档,掌握请求地址、参数格式及频率限制。接口支持分页和筛选参数,返回JSON格式数据。Python示例中使用`requests`库发送HTTP请求并处理返回数据。该API适用于竞品分析、商品管理工具开发、市场调研及价格监测等场景,助力电商从业者优化运营策略。
|
算法 C++
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
2022年第十三届蓝桥杯大赛C/C++语言B组省赛题解
286 5
|
大数据 Linux 虚拟化
大数据软件基础(3) —— 在VMware上安装Linux集群
大数据软件基础(3) —— 在VMware上安装Linux集群
268 0
|
弹性计算 Kubernetes 安全
阿里云原生容器服务产品体系- ACK 集群
阿里云原生容器服务产品体系- ACK 集群
阿里云原生容器服务产品体系- ACK 集群
|
分布式计算 Unix MaxCompute
在MaxCompute中,时间的计算是基于秒的
在MaxCompute中,时间的计算是基于秒的
269 1
|
弹性计算 对象存储
阿里云新老用户、同一用户、同人账号的区别和解释
阿里云新老用户、同一用户、同人账号的区别和解释
434 0
|
人工智能 Linux 算法框架/工具
便捷、快速、稳定、高性能,以 GPU 实例演示 Alibaba Cloud Linux 3 对 AI 生态的支持龙蜥技术
在多维度的优化加持下,Alibaba Cloud Linux 3 解决了 AI 开发人员的痛点问题,让 AI 开发体验更容易更高效。
|
弹性计算 负载均衡 对象存储
阿里云免费云服务器:个人用户每月750小时免费,企业用户
阿里云免费云服务器:个人用户每月750小时免费,企业用户u1服务器2核8GB免费使用3个月
638 0