C#基础(3)

本文详细解析了C#中的面向对象编程概念,包括访问修饰符、抽象类与接口的区别、继承与多态的实现方式等关键知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.public/protect/private/internal修饰符的区别

    public:任何类和成员都可以访问

    protect:该类和派生类能访问

    private:只能该类访问

    internal:只能在包含它的程序集中访问

 

2.接口是否可继承接口? 抽像类是否可实现(implements)接口? 抽像类是否可继承实体类(concrete class)?
    接口可以继承接口。

    抽像类可以实现(implements)接口,

    抽像类是可继承实体类,但前提是实体类必须有明确的构造函数。

 

3.abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?

   都不能。

 

4.成员变量和成员函数前加static的作用?
它们被称为常成员变量和常成员函数,又称为类成员变量和类成员函数。分别用来反映类的状态。比如类成员变量可以用来统计类实例的数量,类成员函数负责这种统计的动作。

 

5.public static const int A=1;这段代码有错误么?是什么?
     const成员都是static所以应该去掉static

 

6.谈谈final,finally,finalize的区别
   防止重写,
   try{}catch{}
   在垃圾回收之前,尝试释放资源并执行其他清理操作

 

7.const和static readonly 区别是什么?
   编译时常量
   运行时常量

 

8.  接口和抽象类有什么区别?你选择使用接口和抽象类的依据是什么?答

答:区别如下

(1)        抽象类可以有抽象成员(无具体实现),也可以有非抽象成员(有具体实现);接口只有抽象成员。

(2)        一个类不能同时继承多个抽象类,一个类可以同时实现多个接口。

如果多个子类中有很多代码是重复的,这时采用抽象类,因为可以将这些代码放到抽象类的非抽象方法中,这样可以达到代码复用。当实现多个接口时因为抽象类不支持,只能使用接口。

 

 

9. struct和class有什么区别

答:两者都可以有成员变量、属性、索引器、事件、函数、构造函数,主要区别如下:

区别点        结构        类

类型        值类型        引用类型

成员变量        在声明时不能赋值        可以赋值也可以不赋值

构造函数        可以不写,系统提供默认构造函数,默认构造函数中会将所有成员值设为0,如果写了构造函数则构造函数必须有参数,且在构造函数中必须为每一个成员赋值。        可以不写,系统提供默认构造函数,写了也没有结构中的限制。

析构函数        不能有析构函数        可以有析构函数

继承性        自定义的结构不能从类继承,但可以实现接口,结构都是密封(sealed),不能从结构继承        类没有限制

 

(1)类可以继承,结构不可以

(2)类在堆中,结构在栈分配内存

(3)类有构造函数,抽象函数,结构没有

 

 

 

 

10. net中什么类不能被继承?

答:如果在类前加上sealed关键字,则表示该类为密封类,密封类不能被继承。

sealed 除了可以应用于类外,还可以应用于实例方法和属性。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与override一起使用。如:

//下面这个sealed使用正确,表示该类不能继承

public sealed class Test

{

private int myVar;

//下面这个sealed错误,编译不会通过,因为sealed必须和override一起使用

     public sealed int MyProperty

     {

         get { return myVar; }

         set { myVar = value; }

     }

//下面这个sealed使用正确,表示如果该类不是密封类,

//那么在派生类中也不可以重写该方法

public sealed override string ToString()

     {

         return base.ToString();

     }

}

 

 11. 构造函数是否可被override?

答:不能。

 

 

12.    是否可以继承String类?

答:string 是密封类,所以不能被继承。

 

13.如何在C#中实现继承?

在类名后加上一个冒号,再加上基类的名称。

 

14.

C#支持多重继承么?

不支持。可以用接口来实现。

 

15.被protected修饰的属性/方法在何处可以访问?

在继承或间接继承与这个类的子类中可以访问。

 

16.私有成员会被继承么?

会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。

 

17.

请描述一下修饰符protected internal。

被protected internal修饰的属性/方法只能在它的在同一个程序集(Assembly)中的子类被访问。

 

18.C#提供一个默认的无参数构造函数,当我实现了另外一个有一个参数的构造函数时候,还想保留这个无参数的构造函数。这样我应该写几个构造函数?

两个,一旦你实现了一个构造函数,C#就不会再提供默认的构造函数了,所以需要手动实现那个无参数构造函数。

 

19.C#中所有对象共同的基类是什么?

System.Object.

 

20.重载和覆写有什么区别?

重载提供了对一个方法签名的不同参数调用的实现。覆写提供了子类中改变父类方法行为的实现。

 

21.在方法定义中,virtual有什么含意?

被virtual修饰的方法可以被子类覆写。

 

22. 能够将非静态的方法覆写成静态方法么?

不能,覆写方法的签名必须与被覆写方法的签名保持一致,除了将virtual改为override。

 

23.可以覆写私有的虚方法么?

不可以,甚至子类中无法访问父类中的私有方法。

 

24.能够阻止某一个类被其他类继承么?

可以,使用关键字sealed。

 

25.能够实现允许某个类被继承,但不允许其中的某个方法被覆写么?

可以,标记这个类为public,并标记这个方法为sealed。

 

26.什么是抽象类(abstract class)?

一种不可以被实例化的类。抽象类中一般含有抽象方法,当然也可有具体实现。继承类只有实现过所有抽象类的抽象方法后才能被实例化。

 

27. 何时必须声明一个类为抽象类?

当这个类中包含抽象方法时,或是该类并没有完全实现父类的抽象方法时。

 

28.接口(interface)是什么?

只含有共有抽象方法(public abstract method)的类。这些方法必须在子类中被实现。

 

29.为什么不能指定接口中方法的修饰符?

接口中的方法用来定义对象之间通信的契约,指定接口中的方法为私有或保护没有意义。他们默认为公有方法。

 

30.可以继承多个接口么?

当然。

 

31. 那么如果这些接口中有重复的方法名称呢?

这种情况中你可以决定如何实现。当然需要特别得小心。但是在编译环节是没有问题的。

 

32.接口和抽象类的区别是什么?

接口中所有方法必须是抽象的,并且不能指定方法的访问修饰符。抽象类中可以有方法的实现,也可以指定方法的访问修饰符。

 

33.如何区别重载方法?

不同的参数类型,不同的参数个数,不同的参数顺序。

注:同样的函数名但是返回类型不同的话不属于重载,你可能连编译都不能通过(呵呵)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值