笔试代码考查

写出以下代码的输出结果

  class A
  {
    public A()
    {
      i = 3;
    }

    public int i;

    public int Calc(int j)
    {
      return i + j * j;
    }
  }
  class B : A
  {
    new public int i;
    new public int Calc(int j = 10)
    {
      if (j < 0)
      {
        return i + base.Calc(j);
      }
      return i + j;
    }

    public int? compare(int l, int n)
    {
      if (l > n)
      {
        return 1;
      }
      else if (l < n)
      {
        return -1;
      }
      else
      {
        return null;
      }
    }

  }

static void Main(string[] args)
{

  B b = new B() { i = 2 };        
  Console.WriteLine(b.i);        2
  Console.WriteLine(((A)b).i);      3
  Console.WriteLine(b.Calc());      12
  Console.WriteLine(b.Calc(1));      3
  Console.WriteLine(b.Calc(-1));      6
  Console.WriteLine(((A)b).Calc(3));    12

}

考点:考查继承类中new的第二种用法,new的三种用法分别是:第一种 创建对象、调用构造函数;第二种 是作为修饰符,显示隐藏继承于基类的继承成员;第三种 是用在泛型中添加类型的约束

递归或冒泡排序

//一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。
public static int foo(int n)
  {
    if (n < 0)
    {
      return 0;
    }
    else if (n <= 2)
    {
      return 1;
    }
    else
    {
      return foo(n - 1) + foo(n - 2);
    }
  }

//冒泡排序

public static void BubbleSort(int[] arr)
{
  for (int i = 0; i < arr.Length-1; i++)
  {
    for (int j = i+1; j < arr.Length; j++)
    {
      if (arr[j] < arr[i])
      {
        arr[i] = arr[i] + arr[j];
        arr[j] = arr[i] - arr[j];
        arr[i] = arr[i] - arr[j];
      }
    }
  }
}

写法很多不写太多答案了,考查新手编码基础,逻辑性。注意算法的时间复杂度优化,O(n2)

var b=new B();b.PrintFields();产生什么输出?

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);
  }
}

答案:x=1,y=0

   x=1,y=-1

考点:这道题就是考查类继承时执行的顺序,及继承类中override作用,在new B()时,先执行了int x = 1;int y;再执行B的构造函数,未进构造函数前会先是会先创建父类A对象构造函数,这时会执行PrintFields();方法,因为PrintFields方法为virtual 虚拟方法,在子类override 中重写的该方法,所以实际执行的为B中的PrintFields方法。为什么Y=0?这是因为调用的是父类方法,子类的中的Y还没初始化,默认值为0,这时候才会执行到B的构造函数,赋值了y = -1;,在b.PrintFields()时,自然就是x=1,y=-1了。

下面的代码输出结果

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

写出程序的输出结果

class Class1 {

private string str = "Class1.str";

private int i = 0;

 static void StringConvert(string str) {

str = "string being converted.";

 }

static void StringConvert(Class1 c) {

c.str = "string being converted.";

 }

static void Add(int i) {

i++;

}

static void AddWithRef(ref int i) {

i++;

}

static void Main() {

int i1 = 10;

 int i2 = 20;

 string str = "str";

Class1 c = new Class1();

Add(i1);

 AddWithRef(ref i2);

 Add(c.i);

 StringConvert(str);

StringConvert(c);

 Console.WriteLine(i1);

 Console.WriteLine(i2);

 Console.WriteLine(c.i);

 Console.WriteLine(str);

 Console.WriteLine(c.str);

 }

}

答案:10  21  0  str  string being converted.

考点:更改的是是局部变量的值。

写出程序的输出结果

public abstract class A

{

public A()

{

Console.WriteLine('A');

 }

public virtual void Fun()

{

Console.WriteLine("A.Fun()");

}

}

public class B: A

{

public B()

{

Console.WriteLine('B');

 }

public new void Fun()

{

Console.WriteLine("B.Fun()");

}

public static void Main()

{

A a = new B();

a.Fun();

}

}

答案:A  B  A.Fun()

考点:抽像类、虚方法、继承、显示隐藏

A a = new B();创建B对象时先创建继承的A对象,先执行A构造函类,再执行B构造函数,输出A  B

a.Fun();注意这个a是A的对象,虽然是以new B();创建,但声明的是A对象,执行Fun()时,会执行A的方法(new 是显式隐藏从基类继承的成员,但A类执行还是A的虚方法)

写出程序的输出结果

 public class A

{

public virtual void Fun1(int i)

{

Console.WriteLine(i);

 }

public void Fun2(A a)

{

a.Fun1(1);

 Fun1(5);

 }

}

public class B : A

{

public override void Fun1(int i)

{

base.Fun1 (i + 1);

 }

public static void Main()

{

B b = new B();

A a = new A();

a.Fun2(b);

 b.Fun2(a);

}

}

答案:2 5 1 6 

考点:分清楚是哪个对象,调的是哪个方法,  a.Fun2(b)时,调的是A类的public void Fun2(A a),传的参数是b,此时A a实际是B的对象,a.Fun1(1)也就是B类里的Fun1(1),B类里代码是base.Fun1 (i + 1);又调的A类的Fun1(2),输出2,Fun1(5);是直接调的A类自己的,输出5, b.Fun2(a);同理,调的是B类继承的A类的public void Fun2(A a),传的参数是a,此时A a实际是A的对象,a.Fun1(1)也就是A类里的Fun1(1),输出1,Fun1(5);是直接调的B类复写的,输出6

原文地址:https://www.cnblogs.com/fantaohaoyou/p/9389781.html