类的构造器
试试分析下面这段代码,一个很简单的继承的代码:
using System;
class A
{
public A()
{
Console.WriteLine("i am a");
}
}
class B:A
{
public B()
{
Console.WriteLine("i am b");
}
}
class Test
{
static void Main()
{
B b=new B();
}
}
这段代码很简单,打印的结果是先调用A的构造器,再调用B的构造器。
但是我们再插入一个有带参数的构造器:
using System;
class A
{
public A()
{
Console.WriteLine("i am a");
}
public A(int i)
{
Console。WriteLine("i take a parm")
}
}
class B:A
{
public B(int j)
{
Console.WriteLine("i am b");
}
}
class Test
{
static void Main()
{
B b=new B();
}
}
在这里编译结果是先调用A的无参构造器,接下来我们屏蔽掉A无参构造器,编译,就会出错,这个是为什么呢,我们不是会自动生成一个无参构造函数吗。
是的我们是会自动生成一个无参的构造器,但是当我们的A中带有一个有参构造器的时候它不会再生成了所以就有错误了。同样如果此时A中什么都没写,也会出错,想想看,为什么呢
所以我们写类的时候要写上一个无参的构造器,这是好习惯
当我们要求使用A中的有参构造器的时候怎么办呢,很简单用base(i)
就是调用A中有一个参数的构造器。我们在类的设计中经常涉及到this。base所以要好好掌握
这是因为类的无参构造器只是编译一次
静态构造器:只会执行一次
using System
class A
{
public staic int i= 11;
}
class test
{
static void Main()
{
}
}
到这里,A类为了给静态成员初始化,会自动创建一个静态构造器
using System
class A
{
public staic int i;
static A()
{
Console.WriteLine("static ");
}
}
class test
{
static void Main()
{
Console.WriteLine(A.i);
}
}
这里我们没有对 A实例化,但是我们使用了它的i;这里会先打印 static 再打印出 i的值,如果有的话
如果我们再实例化一个类 A a1=new A();静态构造器还是只是执行一次。
所以说静态构造器不能被重载,默认为private类型,无参数。