虚拟方法的重写和静态方法的调用
2008-04-11 17:15
323 查看
虚拟方法的重写和静态方法的调用
1、 using System;
class A
{
public A(){
PrintFields();
}
public virtual void PrintFields(){}
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadLine();
}
static void Main(string[] args)
{
B b = new B(); // x=1 y=0
b.PrintFields(); //x=1 y=-1
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0
当使用new B()创建b的实例时,b.PrintFields()产生什么输出?
x=1,y=-1
2.下面的例子中
using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B
{
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
1.运行子类的构造函数时会先实行父类的构造函数,父类构造函数调用被子类覆盖的虚函数
2.而实际上,第二题是首先加载B类的代码到内存中,因为Main在B类里面。依照顺序执行的时候,发现了A.X,这时候A尚未出现,于是去找A。A加载到内存。此时X为0.B已存在,Y未赋值,自然为0.A静态部分构造完成后,X为1.回到B,此时Y = 1 + 1,也就是2.于是得到输出,X = 1,Y = 2。
如果需要证明,可以执行本人修改的代码如下:
class A
{
public static int X;
static A()
{
Console.WriteLine("in A static,X is " + X.ToString()); //x=0
X = B.Y + 1;
Console.WriteLine("in A static again,X is " + X.ToString());//x=1
}
}
class B
{
public static int Y = A.X + 1;
static B()
{
Console.WriteLine("in B static,Y is " + Y.ToString());//x=2
}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
Console.ReadLine();
}
}
1、 using System;
class A
{
public A(){
PrintFields();
}
public virtual void PrintFields(){}
}
class B : A
{
int x = 1;
int y;
public B()
{
y = -1;
}
public override void PrintFields()
{
Console.WriteLine("x={0},y={1}", x, y);
Console.ReadLine();
}
static void Main(string[] args)
{
B b = new B(); // x=1 y=0
b.PrintFields(); //x=1 y=-1
}
当使用new B()创建B的实例时,产生什么输出?
答:X=1,Y=0
当使用new B()创建b的实例时,b.PrintFields()产生什么输出?
x=1,y=-1
2.下面的例子中
using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B
{
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
1.运行子类的构造函数时会先实行父类的构造函数,父类构造函数调用被子类覆盖的虚函数
2.而实际上,第二题是首先加载B类的代码到内存中,因为Main在B类里面。依照顺序执行的时候,发现了A.X,这时候A尚未出现,于是去找A。A加载到内存。此时X为0.B已存在,Y未赋值,自然为0.A静态部分构造完成后,X为1.回到B,此时Y = 1 + 1,也就是2.于是得到输出,X = 1,Y = 2。
如果需要证明,可以执行本人修改的代码如下:
class A
{
public static int X;
static A()
{
Console.WriteLine("in A static,X is " + X.ToString()); //x=0
X = B.Y + 1;
Console.WriteLine("in A static again,X is " + X.ToString());//x=1
}
}
class B
{
public static int Y = A.X + 1;
static B()
{
Console.WriteLine("in B static,Y is " + Y.ToString());//x=2
}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
Console.ReadLine();
}
}
相关文章推荐
- 调用已编译成静态库的插件私有接口的方法
- Java多态及静态方法对动态方法的调用
- JAVA中子类是否可以可以继承、重写父类的静态方法--总结
- 子类为什么不能重写父类的静态方法
- java_静态方法能否被子类重写
- Python的实例方法,类方法,静态方法之间的区别及调用关系
- 黑马程序员--03.面向对象--01.静态方法调用非静态成员【个人总结】
- static的继承:静态方法只能隐藏(hidden),不能重写(override)
- gojs 进行监听删除事件及重写监听方法时调用原有方法
- java静态方法的重写,为什么不能?
- 子类继承父类重写静态方法不能变成普通方法
- 静态方法中实现对非静态方法的调用的讨论
- 为什么java静态方法不能调用普通方法?普通方法能调用静态方法?
- 类的多参数,带返回值的静态方法的调用
- 重写父类方法、super关键字、调用父类构造器——Java
- JS+JSP通过img标签调用实现静态页面访问次数统计的方法
- 武侠世界中的:虚拟方法、重写方法、抽象方法
- java中静态(static)的方法为什么不能重写(override)
- Play tag标签,模板、tag中直接调用后台静态java方法
- 用WinDbg探索CLR世界 [4] 方法的调用机制之静态结构