永发信息网

C# 子类 父类 初始化问题

答案:3  悬赏:0  手机版
解决时间 2021-03-09 23:05
  • 提问者网友:不爱我么
  • 2021-03-09 18:18
using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B :A
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
产生的输出结果是什么?
x=1,y=2

为什么 答案是x=1,y=2
怎么理解 谢谢
最佳答案
  • 五星知识达人网友:酒安江南
  • 2021-03-09 19:40
由于程序的入口点(Main)在Class B中。所以Class B一定是最先被初始化的。


那么下面我相信楼主你一定知道为什么了。


1. 初始化B.Y
2. 访问A.X(此时B的静态构造函数,已经被调用过一次了,不会再进行初始化,与静态构造函数的调用)所以X=0+1
3. Y=1+1
全部回答
  • 1楼网友:空山清雨
  • 2021-03-09 20:49
>>为什么这里b2.x输出的值是10呢??? 答:java中方法为动态绑定,但是属性是静态绑定的,也就是说虽然b2指向的是一个sub类对象,但是由于属性的静态绑定原则,b2本身作为base类型的对象他的属性x依然是base类中的x,这也可以说明:多态在面向对象中是针对方法而言的。 >>这和b2是base型有什么关系,b2是base型在这里有什么意义。 >>最好能举个例子。 答:b2作为base类型的对象,在面向对象语言中,父类类型的引用是可以指向子类类型的对象的,因此b2是base类型的引用指向sub类型的对象。如: collection c = new arraylist(); 这里的c也是这种情况。 >>顺便问一下溯造型是怎么回事? 我学java这么长时间没听说过"溯造型"的概念,也可能是叫法不同,但是在我想你说的应该是类型转换的问题,在面向对象语言中子类对象可以直接转换变成父类对象,如collection c =new arraylist(),同时父类对象也可以通过强制类型转换变成父类对象,前提是父类对象的实际类型是子类对象,如: collection c1 = new arraylist(); collection c2 = new hashset() arraylist a = (arraylist)c1;//成功 arraylist b = (arraylist)c2;//失败 >>最后一个问事关于“上溯造型”的。 答案同上个问题
  • 2楼网友:酒醒三更
  • 2021-03-09 20:37
首先程序执行B构造函数,构造函数是给属性赋值作用,此时int类型的Y = 0; 然后程序执行了A构造函数X=B.Y+1; B.Y = 0所以 X = 1; 然后程序又执行 Y=A.X+1; A.X=1.所以Y = 2; 理论:构造函数优先执行权, 所以类中任何属性 默认都是有值,int是0 string是null, 然后才会执行我们的 声明属性值 如果没有构造函数给属性默认值,直接执行 int Y=A.X+1;的声明值,那程序就无限执行了, 执行顺序是 B.Y = 0; A.X = B.Y+1; B.Y = A.X+1; 可见B.Y是被改过一次值的,只是B.Y = 0;这一个初始化执行 你在代码里没看到而已
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯