1:
abstract class BaseClass
{
public virtual void MethodA()
{
}
public virtual void MethodB()
{
}
}
class Class1: BaseClass
{
public void MethodA(string arg)
{
}
public override void MethodB()
{
}
}
class Class2: Class1
{
new public void MethodB()
{
}
}
class MainClass
{
public static void Main(string[] args)
{
Class2 o = new Class2();
Console.WriteLine(o.MethodA());
}
}
请问,o.MethodA调用的是
class Class1
{
private static int count = 0;
static Class1()
{
count++;
}
public Class1()
{
count++;
}
}
Class1 o1 = new Class1();
Class1 o2 = new Class1();
请问,o1.Count的值是多少?
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);
}
当使用new B()创建B的实例时,产生什么输出?
多谢大侠!
1.首先代码有错误Console.WriteLine(o.MethodA());=>o.MethodA();
这个例子很好涉及到了不少知识
(1) 继承---o.MethodA()
Class2的父类Class1,Class1的父类BaseClass,所以当在BaseClass中定义了MethodA()
就可以被它的子类调用
(2) 方法重载
public virtual void MethodA()
public void MethodA(string arg) 如果把它改为public override void MethodA()
那么调用o.MethodA(); 调用的就是Class1的MethodA();
(3) 方法重写
public override void MethodB()
如果// new public void MethodB() Mark掉,那么
那么调用o.MethodB(); 调用的就是Class1的MethodB();
(4) 用new 方法重写
new public void MethodB()
调用o.MethodB(); 调用的就是Class2的MethodB()
2. 3, 关键有一个静态构造函数static Class1()
静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作
http://msdn.microsoft.com/zh-cn/library/k9x6w0hc(v=vs.80).aspx
3. 最后结果x=1, y=0。
实例化子类时一般是默认调用基类构造函数即使new B()的时候调用
public A(){PrintFields();} 又是虚方法,真正的执行会在B中做
public override void PrintFields()
1 调用的是BaseClass的方法,MethodA无参数
2、3, 静态初始化1次,实例初始化2次
3、
x=1, y=0 A先构造,此时y使用默认值
x=1, y=-1
Shift+F5 最好的答案