.NET/C#⾯试题汇总系列:面向对象(总结篇)

1.什么是构造函数?

概念:构造函数的⽅法名与类型相同、没有返回类型
作⽤:完成对类的对象初始化
创建⼀个类的新对象时,系统会⾃动调⽤该构造函数初始化新对象, 如果没有写定义,那么系统会⾃动提供⼀个不带任何参数的public 构造函数

2.class和struct的区别?

相同点 都可以实现接⼝
不同点
1.class是引⽤类型,struct是值类型
2.class允许继承、被继承,struct不允许,只能继承接⼝
3.class可以初始化变量,struct不可以
4.class可以有⽆参的构造函数,struct不可以,必须是有参的构造函数,⽽且在有参的构造函数必须初始化所有成员
使⽤场景
1.Class⽐较适合⼤的和复杂的数据,表现抽象和多级别的对象层次时。
2.Struct适⽤于作为经常使⽤的⼀些数据组合成的新类型,表示诸如点、矩形等主要⽤来存储数据的轻量级对象时,偏简单值。
3.Struct有性能优势,Class有⾯向对象的扩展优势。

3.简述⼀下⾯向对象的三⼤特性?

封装、继承、多态。
封装:是通过把对象的属性的实现细节隐藏起来,仅对外提供公共的访问⽅法。
继承:是通过⼦类继承基类、继承抽象类、继承接⼝实现的。
多态:是通过重写基类的override ⽅法、重写虚⽅法实现的。 好处是:⽅便维护、易扩展。 缺点是:⽐⾯向过程性能低。

4.构造函数是否能被重写?

构造器Constructor不能被继承,因此不能重写,但可以被重载

5.抽象类和接⼝有什么区别?

相同点:都不能直接实例化 不同点:
1.抽象类⽤abstract修饰、接⼝⽤interface修饰
2.抽象类中的⽅法可以实现,也可以不实现,有抽象⽅法的类⼀定要⽤abstract修饰,接⼝中的⽅法不允许实现
3.抽象类只能单继承,接⼝⽀持多实现
4.抽象类有构造⽅法,接⼝不能有构造⽅法
5.接⼝只负责功能的定义,通过接⼝来规范类的,(有哪些功能),⽽抽象类即负责功能的定义有可以实现功能(实现了哪些功能)

6…类的执⾏顺序?

执⾏顺序:⽗类,⼦类,静态块,静态字段,⾮静态块,⾮静态字段,构造器,⽅法

7.接⼝是否可继承接⼝?抽象类是否可实现(implements)接⼝?抽象类是否可继承实现类(concrete class)?

接⼝可以继承接⼝,抽象类可以实现接⼝,抽象类可以继承实现类,但前提是实现类必须有明确的构造函数。

8.继承最⼤的好处?

对⽗类成员进⾏重⽤,增加代码的可读性、灵活性。

9.请说说引⽤和对象?

对象和引⽤时分不开的,对象⽣成⼀个地址,放在堆⾥⾯,引⽤则指向这个地址,放在栈⾥⾯

10.什么是匿名类,有什么好处?

不⽤定义、没有名字的类,使⽤⼀次便可丢弃。好处是简单、随意、临时的。

11.重写和重载的区别?

重写⽅法:关键字⽤override修饰,派⽣类重写基类的⽅法,⽅法命名、返回类型,参数必须相同
重载⽅法:⽅法名必须相同,参数列表必须不相同,返回类型可以不相同。
作⽤:重写主要是实现⾯向对象的多态性、重载主要是实现实例化不同的对象

12.C#中有没有静态构造函数,如果有是做什么⽤的?

特点: 静态构造函数既没有访问修饰符,也没有参数。在创建第⼀个实例或引⽤任何静态成员之前,将⾃动调⽤静态构造函数来初始化类。⽆法直接调⽤静态构造函数。在程序中,⽤户⽆法控制何时执⾏静态构造函数。 ⽤途 : 当类使⽤⽇志⽂件时,将使⽤这种构造函数向⽇志⽂件中写⼊项。

13.怎样理解静态变量?静态成员和⾮静态成员的区别?

静态变量属于类,⽽不属于对象;并对所有对象所享;静态成员在加类的时候就被加载。

14.属性能在接⼝中声明吗?

可以,不能有访问修饰符,不能初始化赋值。

15.在项⽬中为什么使⽤接⼝?接⼝的好处是什么?什么是⾯向接⼝开发?

接⼝是⼀种约束,描述类的公共⽅法/公共属性,不能有任何的实现
好处是:结构清晰,类之间通信简单易懂,扩展性好,提⾼复⽤性。
⾯向interface编程,原意是指⾯向抽象协议编程,实现者在实现时要严格按协议来办。

16.什么时候⽤重载?什么时候⽤重写?

当⼀个类需要⽤不同的实现来做同⼀件事情,此时应该⽤重写,⽽重载是⽤不同的输⼊做同⼀件事情

17.静态⽅法可以访问⾮静态变量吗?如果不可以为什么?

静态⽅法和⾮静态变量不是同⼀⽣命周期,静态⽅法属于类,⾮静态变量属于具体的对象,静态⽅法和具体的对象没有任何关联

18.在.Net中所有可序列化的类都被标记为_?

[serializable]

19.C#中 property 与 attribute的区别,他们各有什么⽤处,这种机制的好处在哪⾥?

⼀个是属性,⽤于存取类的字段,⼀个是特性,⽤来标识类,⽅法等的附加性质

20.当使⽤new B()创建B的实例时,产⽣什么输出?

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

答:X=1,Y=0;

21.能⽤foreach遍历访问的对象需要实现 接⼝或声明⽅法的类型

答:IEnumerable 、 GetEnumerator。

猜你喜欢

转载自blog.csdn.net/weixin_45091053/article/details/127133129
今日推荐