base与this的用法
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:Visual Studio 2017
作者:李成富
撰写时间:2019年7月29日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
意义:
this:指当前类,this调用当前类的属性,方法,包括构造函数的方法,继承本类的构造函数。
base:指当前类的父类,可调用父类的非私有属性,方法,继承父类的构造函数括号里的参数。
this关键字:
this关键字引用类的当前实例
注意:静态成员方法中不能使用this关键字,this关键字只能在实 例构造函数、实例方法或实例访问器中使用
base关键字:
base关键字用于从派生类中访问基类的成员;指定创建派生类实例时调用基类构造函数;调用基类上已被重写的方法。
Base最多使用地方就是在多态上,base可以完成创建派生类实例时调用其基类构造函数或则调用基类上已经被其他方法重写的方法。
注意:不能从静态方法中使用base关键字,base关键字只能在实 例构造函数、实例方法或实例访问器中使用
base调用构造方法:
base在派生类中调用基类的方法:
base和this的综合使用:
public class MyBase
{
public MyBase()
{
Console.Write("调用父类无参数的构造函数");
}
public MyBase(int i)
{
Console.Write("调用父类一个参数的构造函数");
}
}
public class Derived : MyBase
{
public int age;
public static int age2;//只要类里存在静态变量,那么静态变量总是最先初始化的。
//静态构造函数只执行一次。既然要初始化静态变量,就要调 用静态的构造函数。
static Derived()
{
age2 = 100;
Console.Write(age2);
}
public Derived()
: this(5)//调用当前实例有参数的构造函数。如果只调用 这个构造函数,那还需要调用一次基类没有参的构造函数!!!
{
age = 101;
Console.WriteLine(age);
}
public Derived(int i) : base(i)//调用基类有 参数的构造函数
{
age = 102;
Console.WriteLine(age);
}
public Derived(int i, int j)
{
Console.WriteLine("两个变量的参数");
}
}
class Program
{
static void MainWindow(string[] args)
{
Derived myder = new Derived();
//输出100 ,"调用父类无参数的构造函数",101
//执行顺序:<1>: static MyDerivedClass() <2>: public MyBaseClass() <3>:public MyDerivedClass()
Derived myder2 = new Derived(5); //输出"调用父类无参数的构造函数",102。
/**在初始化myder对象的时候已经初始化过静态变量age2 了。因为静态构造函数最多执行一次,
所以初始化myder2对象的时候就不会在 继续初始化静态变量age2了
**/
Derived myder3 = new Derived(5, 6); //输出"调用父类无参数的构造函数","两个变量的参数"
//执行顺序:<1>: public MyBaseClass() <2>: public MyDerivedClass(int i, int j)
Console.ReadKey();
}
}
this是标识当前资源对象的,而base是基于父级的。
base发挥了期灵魂级的作用——多态
base子类可以访问父类成员
base调用父类方法必须重写父类方法
base子类构造函数直接访问:base父类构造方法
base同样不能用于静态方法
总结:
不能在静态方法中引用this和base,因为当类第一次被加载的时候,静态成员已经被加载到静态存储区,此时类的对象还有可能能没有创建,而this和base访问的都是类的实例,也就是对象,而静态成员只能由类访问,不能由对象访问,所以静态方法中不能调用类成员字段。