构造函数

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

相关文章
|
自然语言处理 Java API
阿里云自然语言处理--文本相似度(电商)Java SDK 调用示例
自然语言处理(Natural Language Processing,简称NLP),是为各类企业及开发者提供的用于文本分析及挖掘的核心工具,旨在帮助用户高效的处理文本,已经广泛应用在电商、文娱、司法、公安、金融、医疗、电力等行业客户的多项业务中,取得了良好的效果。文本相似度可以提供不同文本之间相似度的计算,并输出一个介于0到1之间的分数,分数越大则文本之间的相似度越高。可广泛应用于信息检索,新闻推荐、智能客服等场景。使用该服务建议分数不要用于直接判断,可以作为特征,并按照范围进行分桶。本文将使用Java Common SDK 演示文本相似度(电商)服务的快速调用以供参考。
911 0
阿里云自然语言处理--文本相似度(电商)Java SDK 调用示例
|
安全 Linux 数据中心
CentOS Stream的阿里云镜像站下载地址
CentOS Stream的阿里云镜像站下载地址
3034 0
|
搜索推荐 Python Windows
|
存储 人工智能 搜索推荐
VR与AR:沉浸式与交互式体验的对比
当谈到VR(虚拟现实)和AR(增强现实)时,它们都是与计算机图形和感知技术相关的创新技术。
1259 0
|
云计算
知域互联科技有限公司和阿里云商标什么关系?
知域是不是第三方服务商?不是,知域互联科技有限公司是阿里云子公司,专门为商标服务成立的。阿里云商标注册是不是委托给第三方服务商了?阿里云的商标代理名称为:知域互联科技有限公司,知域的大股东是深圳阿里云计算技术有限公司,所以大家放心选择阿里云商标
2310 0
知域互联科技有限公司和阿里云商标什么关系?
|
SQL 缓存 Java
|
域名解析 存储 对象存储
静态网站不用购买云服务器或虚拟主机阿里云OSS对象存储即可搞定
静态网站不用购买云服务器/VPS/虚拟主机,静态网站可以直接使用阿里云OSS对象存储来托管,价格便宜而且可靠性高访问速度快,如果你不想要备案只需要将Bucket创建在香港地域即可,准备好域名和你的网站源码,不需要另外购买云服务器
5316 0
静态网站不用购买云服务器或虚拟主机阿里云OSS对象存储即可搞定
|
机器学习/深度学习 人工智能 算法
阿里端侧 AI 从探索尝试到逐步展开
端侧 AI 逐渐从尝试性应⽤变成驱动业务创新的核⼼推动⼒之⼀。
1689 0
阿里端侧 AI 从探索尝试到逐步展开
|
分布式计算 SQL 监控
MaxCompute(原ODPS)开发入门指南——数据上云篇
根据《MaxCompute(原ODPS)开发入门指南——计量计费篇》的了解,大家清楚了MaxCompute可以做什么,计费模式如何,想必大家也开通了MaxCompute想进行一次POC,但是大家遇到第一个问题一定是我的数据如何上云?
10771 0
|
存储 分布式计算 搜索推荐
阿里云OpenSearch开放搜索功能特性
阿里云OpenSearch开放搜索是什么?开放搜索(OpenSearch)是阿里巴巴自主研发的搜索引擎平台,用来为企业提供高搜索质量的一站式内容智能搜索服务。
2371 0