为什么一个子类static对象不能在调用父类构造函数时使用?不是在一个构造函数中吗?代码如下
class BackGround:GameObject
{
//首先先将图片导入,原因是我们需要将图片绘制到窗体中,子类的非static属性,若是static,就能正常调用不报错
private Image imgBG = Resources.像素人bg;
//写构造函数去调用父类的构造函数
public BackGround(int x,int y,int speed):base(x,y,imgBG.Width,imgBG.Height,speed,0,Direction.Down)
{
int i=imgBG.Width;
}
}
解决方案
5
按照本人的理解,
当你通过构造函数使子类实例化时,
由于base(…) 会先执行父类的构造方法。
那么这个时候,其实子类并没有实例化,进入base时,也就没无法调用子类的字段和属性了。
当你通过构造函数使子类实例化时,
由于base(…) 会先执行父类的构造方法。
那么这个时候,其实子类并没有实例化,进入base时,也就没无法调用子类的字段和属性了。
5
private Image imgBG = Resources.像素人bg;
public BackGround(int x,int y,int speed):base(x,y,<span style=”color: #FF0000;”>imgBG.Width,imgBG.Height</span>,speed,0,Direction.Down)
{
int i=imgBG.Width;
}
这个在编译之后的实际代码是这样的
private Image imgBG; public BackGround(int x,int y,int speed):base(x,y,<span style="color: #FF0000;">imgBG.Width,imgBG.Height</span>,speed,0,Direction.Down) { imgBG = Resources.像素人bg; int i=imgBG.Width; }
所谓“变量声明初始化”,都是 c# 的语法糖。.net 并没有什么变量声明时进行初始化的功能,纯粹是 c# 的功能,而不是 .net framework 的功能。你看看编译之后的代码(的反编译结果)就知道了。
5
要区分哪些功能是 c# 的,那些是 .net framework 的。不要把 c#的功能总是误认为是 .net 的,同样也不要把 vb.net 的功能说成是 .net 的。
5
了解下静态区 堆 和栈你就懂了。看看反编译。
静态成员是由静态构造函数里去申请和开辟。他会一直存在也是最优先的。
堆空间是放引用类型的,引用类型的成员都是由 构造函数里去申请和开辟 退出方法体就回被标记为回收。
实例化对像的时候会先从顶级父类的构造函数开始操作
静态成员是由静态构造函数里去申请和开辟。他会一直存在也是最优先的。
堆空间是放引用类型的,引用类型的成员都是由 构造函数里去申请和开辟 退出方法体就回被标记为回收。
实例化对像的时候会先从顶级父类的构造函数开始操作