C#--构造函数的理解
说白了构造函数就是用来初始化类的数据成员{因为C#语言具有类型安全的特质-->不能使用没有初始化的变量)}
在这里引用一下别人的总结,我觉得挺好的:
构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.
构造函数具有一些特质:
(1).构造函数必须与类同名;
(2).构造函数没有返回类型,它可以带参数,也可以不带参数;
(3).一个类中可以有一个或多个构造函数,也就是说构造函数可以重载,从而提供初始化类对象的不同方法;
(4).声明类对象时,系统自动调用构造函数,构造函数不能被显式调用;
(5).若在声明时未定义构造函数,系统会自动生成默认的构造函数,此时构造函数的函数体为空.
(6).静态构造函数,用static修饰,用于初始化静态变量,一个类只允许有一个静态构造函数,在类实例化时加载,这时修饰符public、private失去作用.
{
静态构造函数既没有访问修饰符,也没有参数。
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
无法直接调用静态构造函数。在程序中,用户无法控制何时执行静态构造函数。
静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化}
(7)可以使用public、protected、private修饰符;
(8)引用父类构造时用():base()方法,引用自身重载的构造使用():this(int para);
这里代码举例就只列举 base和this的用法,也是别人的列子,拿来用的,我觉得说得挺通俗易懂的
public class ConstructorProgram
{
private string name;
private int age;
public ConstructorProgram():this("bell")
{
//Console.WriteLine("No Info Left.");
}
public ConstructorProgram(string name)
:this("Simple Programmer",20)
{
this.name = name;
Console.WriteLine("name=" + this.name);
}
public ConstructorProgram(string name, int age)
{
this.name = name;
this.age = age;
Console.WriteLine("name=" + this.name);
Console.WriteLine("age=" + this.age);
}
在上面的代码当中,可以看出来这里红色字体的this用来调用ConstructorProgram类的自身的构造函数。明白这句话的涵义,应该会明白执行结果了。
public static void Main()
{
ConstructorProgram cp1= new ConstructorProgram("goal");
ConstructorProgram cp2 = new ConstructorProgram();
}
}
运行结果:
name=Simple Programmer
age=20
name=goal
name=Simple Programmer
age=20
name=bell
在上面的代码当中,可以看出来这里红色字体的this用来调用ConstructorProgram类的自身的构造函数。明白这句话的涵义,应该会明白执行结果了。
接着下面的代码如下:
public class ConstructorProgram1
{
private string name;
private int age;
public ConstructorProgram1()
{
Console.WriteLine("No Info Left");
}
public ConstructorProgram1(string name)
{
this.name = name;
Console.WriteLine("name=" + this.name);
}
public ConstructorProgram1(string name, int age)
{
this.name = name;
this.age = age;
Console.WriteLine("name=" + this.name);
Console.WriteLine("age=" + this.age);
}
}
public class ConstructorProgram : ConstructorProgram1
{
public ConstructorProgram()
{
//Console.WriteLine("sdfsdf");
}
public ConstructorProgram(string name)
: base("goalbell",20)
{
Console.WriteLine("name=" + name);
}
public static void Main()
{
ConstructorProgram cp = new ConstructorProgram("Programmer");
}
}
运行结果如下:
name=goalbell
age=20
name=Programmer
可以看出上面的代码,派生类中的base调用了父类(基类)的构造函数了,但是如果不提供初始化(即把 : base("goalbell",20)
不要)指向基类的构造函数的话,它会执行基类中没有参数的构造函数。
会得到如下结果:
name=goalbell
age=20
name=Programmer
No Info Left
也就是说BASE是对父类的引用,而THIS是对类本身自己的引用。
在看下下面的代码,(基类和派生类中的构造函数关系)
using System;
namespace Zjw.Csharp
{
public class ConstructorProgram1
{
private string name;
public ConstructorProgram1()
{
Console.WriteLine("No Info Left");
}
public ConstructorProgram1(string name)
{
this.name = name;
Console.WriteLine("name=" + this.name);
}
}
public class ConstructorProgram:ConstructorProgram1
{
private string name;
private int age;
public ConstructorProgram():this("bell")
{
//Console.WriteLine("No Info Left.");
}
public ConstructorProgram(string name)
:this("Simple Programmer",20)
{
this.name = name;
Console.WriteLine("name=" + this.name);
}
public ConstructorProgram(string name, int age)
{
this.name = name;
this.age = age;
Console.WriteLine("name=" + this.name);
Console.WriteLine("age=" + this.age);
}
public static void Main()
{
ConstructorProgram cp1= new ConstructorProgram("goal");
ConstructorProgram cp2 = new ConstructorProgram();
Console.ReadLine();
}
}
}
执行结果是
No Info Left
name=Simple Programmer
age=20
name=goal
No Info Left
name=Simple Programmer
age=20
name=bell
可以得到的结论是 派生类先调用父类的构造函数进行初始化,再调用继承类的构造函数,如果没有在继承类中指明父类的构造函数,则默认调用父类中没有参数的构造函数,然后调用继承类的构造函数。
转自 ;https://www.cnblogs.com/siyecao/archive/2012/05/17/2506375.html
C#--构造函数的理解的更多相关文章
- 转 关于C#中派生类调用基类构造函数的理解
关于C#中派生类调用基类构造函数的理解 .c#class 本文中的默认构造函数是指在没有编写构造函数的情况下系统默认的无参构造函数 1. 当基类中没有自己编写构造函数时,派生类默认的调用 ...
- C++ 类的多态一(virtual关键字--构造函数深刻理解)
//virtual关键字--构造函数深刻理解 #include<iostream> using namespace std; /* C语言编译器,c++编译器全部是静态链编,就是一段一段代 ...
- C++拷贝构造函数 的理解
#include <iostream> using namespace std; //拷贝构造函数的理解 class Point { public: Point(); Point(int ...
- js之构造函数的理解
在JavaScript中,创建对象的方式包括两种:对象字面量和使用new表达式.对象字面量是一种灵活方便的书写方式,例如: 1 2 3 4 5 6 var o1 = { p:”I’m in ...
- java 中构造函数 的理解
构造方法就是与类同名的那个方法,它的作用是可以用来初始化 class Person{ public Person(String n,int a) {//构造方法 name = n; age = a; ...
- 关于C#中派生类调用基类构造函数的理解
(1)当基类中没有自己编写的构造函数时,派生类默认条用基类的构造函数 (2)当基类中有自己编写的构造函数时,要在基类中添加无参的构造函数 public class MyBaseClass { publ ...
- 对C# 构造函数的理解
C#构造函数是在创建给定类型的对象时执行的类方法. 构造函数具有与类相同的名称,它通常初始化新对象的数据成员.不带参数的构造函数称为“默认构造函数”. 无论何时,只要使用 new 运算符实例化对象,并 ...
- javascript构造函数的理解
构造函数是在javascript文档的创建对象当中提到的,主要目的是为了解决代码复用,能够大量产生同类型而多作用的方法 在javascript中给出了几种创建对象的模式: 1.对象字面量 例: var ...
- 构造函数的理解(构造函数与 init 方法)
0. 构造函数与 init 方法 构造方法内部禁止添加任何业务逻辑,如果有业务逻辑,请放在 init 方法中: 1. 构造函数的参数 以下为一个堆实现优先队列(堆的实现借助完全二叉树,而完全二叉树又可 ...
随机推荐
- linux一些基本知识
一.linux i386是32位的,amd64是64位(一般情况不限intel或者amd) server是服务器版,desktop是桌面版 Desktop是社区开源版,拥有一些新功能新软件 ...
- folly无锁队列,尝试添加新的函数(续)
基于上一篇文章,dropHead取出节点后,删除节点,会出现内存访问的问题.按照这个逻辑,如果将移出的节点保存到一个无锁队列中,然后在需要节点的时候,从这个备用的无锁队列中取出节点,那么应该就可以避开 ...
- JVM -verbose参数详解(转)
原文 http://www.javaranger.com/archives/367 java -verbose[:class|gc|jni] 在输出设备上显示虚拟机运行信息. java -verbos ...
- kappa系数
kappa计算结果为-1~1,通常kappa是落在 0~1 间,可分为五组来表示不同级别的一致性: 0.0~0.20 极低的一致性(slight) 0.21~0.40 一般的一致性(fair) 0.4 ...
- Java中的Html解析:使用jsoup
包:jsoup-1.10.2.jar import java.io.File; import java.io.IOException; import org.jsoup.Jsoup; import o ...
- uWSGI, Gunicorn, 啥玩意儿?
因为nginx等优秀的开源项目,有不少本来不是做服务器的同学也可以写很多服务器端的程序了.但是在聊天中会发现,大家虽然写了不少代码,但是对wsgi是什么,gunicorn是什么,反向代理又是什么并不了 ...
- Java的字符串
1.String 类 2.StringBuilder 类 1.String类 1.1.构造方法 String的构造方法格式 说明 new String(String st) 把字符串数据封装成字符串对 ...
- android 开发 xml绘制shape与Selector与layer-list 一 基础篇
首先我们先来了解状态效果 android:state_pressed=["true" | "false"] 按下状态 android:state_focuse ...
- [转]access 标准表达式中数据类型不匹配
好久没有用access,今儿遇到一个特别让人无语的问题: access数据表的Date/Time类型的字段,假如字段名为dtime: 如果直接用dtime=‘2013/9/6 10:50:21’,sq ...
- 安装JavaFX Scene Builder,并配置到Eclipse
转载自:https://www.yiibai.com/javafx/install-javafx-scene-builder-into-eclipse.html 1-JavaFX Scene Buil ...