(985学校名单
⼆)NETOOP⾯向对象编程的⾯试题
(⼆) OOP ⾯向对象编程
1. ⾯向对象的三⼤基本原则?
封装,继承,多态。
(1) 封装:隐藏内部实现,稳定外部接⼝;好处:保证对象⾃⾝数据的完整性和安全性
(2) 继承:⼦类继承⽗类的成员;好处:实现代码复⽤,⽅便系统的扩展
(3) 多态:A:不同⼦类对象同⼀个消息(⽅法调⽤);做出不同的反映;
B:同⼀个类在不同情况下表现出不同的⾏为。
静态⽅法和实例⽅法:
(1)静态⽅法⾥⾯不能直接调⽤实例⽅法(不能直接写⽅法名),需要实例化对象,然后再⽤对象.⽅法名去调⽤。静态⽅法中不能⽤this关键字直接调⽤实例⽅法。
(2) 实例⽅法⾥⾯可以直接使⽤静态⽅法
(直接写静态⽅法名)
2 .传⼊某个属性的t(设置器)⽅法的隐含参数的名称是什么?
value,它的类型和属性所声名的类型相同。
3. c#中字段和属性的区别
字段是变量;属性是对字段的封装,对外提供的访问,保证数据的安全
4 .请叙述属性与索引器的区别。
属性 a 通过名称标识
b 通过简单名称或成员访问来访问。
c 可以为静态成员或实例成员
d 属性的get 访问器没有参数
e 属性的t 访问器包含隐式value参数
索引器 a 通过签名标识。
b 通过元素访问来访问。
c 必须为实例成员。
d 索引器的get 访问器具有与索引器相同的形参表
e 除了value 参数外,索引器的t 访问器还具有与索引器相同的形参表
5. 如何在C#中实现继承?
在类名后加上⼀个冒号,再加上基类的名称。
6. C#⽀持多重继承么?
不⽀持多继承。可以⽤接⼝来实现。
7. 被protected修饰的属性/⽅法在何处可以访问?
在继承或间接继承与这个类的⼦类中可以访问。
8.私有成员会被继承么?
会,但是不能被访问。所以看上去他们似乎是不能被继承的,但实际上确实被继承了。
9.简述 private、 protected、 public、 internal 修饰符的访问权限。
private:私有成员, 在类的内部才可以访问。
Protected:保护成员,该类内部和继承类中可以访问。
public :公共成员,完全公开,没有访问限制。
internal: 在同⼀命名空间内(同⼀个程序集中)可以访问。
10. 可访问性级别有哪⼏种?
public 访问不受限制。
protected 访问仅限于包含类或从包含类派⽣的类型。
internal 访问仅限于当前程序集。
protected internal 访问仅限于从包含类派⽣的当前程序集或类型。
private 访问仅限于包含类型。
11.请描述⼀下修饰符protected internal。
被protected internal修饰的属性⽅法只能在它的在同⼀个
程序集(Asmbly)中的⼦类被访问。
12. C#提供⼀个默认的⽆参数构造函数,当我实现了另外⼀个有⼀个参数的构造函数时候,
还想保留这个⽆参数的构造函数。这样我应该写⼏个构造函数?
两个,⼀旦你实现了⼀个构造函数C#就不会再提供默认的构造函数了,所以需要⼿动实现那个⽆参数构造函数。
13. C#中所有对象共同的基类是什么?
System.Object.
14 . 重载Overload 和覆写Override(重写)有什么区别?
(1)重载:针对⼀个类来说,当定义两种或多种具有相同名称的⽅法时,就称作重载。
只要⽅法名相同,别的可以不同,⽅法的重载⼀般满⾜2个条件
⑴返回类型相同,参数类型相同,参数个数不同;
⑵返回类型不同,参数类型不同,参数个数相同
⑶参数加ref或者out,与不加ref或out也可以构成重载,但是参数加ref和out不能同时⼀起构
成重载的。
(2) 重写:⼀般⽤于有继承关系的类(针对多个类),多数情况下是⽗类中有抽象⽅法或者虚⽅法,在
⼦类中使⽤override关键字重写⽗类的⽅法,⽽且重写⽅法的名称,⽅法的返回类型,参数类型,参数个数都要和基类⼀致。
15. 在⽅法定义中,virtual(虚有的⽅法)有什么含意?
被virtual修饰的⽅法可以被⼦类覆写。
16 .能够将⾮静态的⽅法覆写成静态⽅法么?
不能,覆写⽅法的签名必须与被覆写⽅法的签名保持⼀致,除了将virtual改为override。
17 .可以覆写私有的虚⽅法么?
不可以,甚⾄⼦类中⽆法访问⽗类中的私有⽅法。
18 .能够阻⽌某⼀个类被其他类继承么?
可以,使⽤关键字aled。(密封类:不能被其他类继承)
19 aled关键字有什么特点?
aled 修饰符可以应⽤于类、实例⽅法和属性。
修饰类,那么此类不能被继承,密封类不能被继承。
密封⽅法会重写基类中的⽅法,但其本⾝不能在任何派⽣类中进⼀步重写。
当应⽤于⽅法或属性时aled 修饰符必须始终与override ⼀起使⽤。
20.能够实现允许某个类被继承,但不允许其中的某个⽅法被覆写么?
可以,标记这个类为public,并标记这个⽅法为aled。
21 . 什么是抽象类(abstract class)?
⼀种不可电影决战之后
以被实例化的类。抽象类中⼀般含有抽象⽅法,当然也可有具体实现。继承类只有实现
过所有抽象类的抽象⽅法后才能被实例化。
22 . 何时必须声明⼀个类为抽象类?
当这个类中包含抽象⽅法时,或是该类并没有完全实现⽗类的抽象⽅法时。
23 . 为什么不能指定接⼝中⽅法的修饰符?
接⼝中的⽅法⽤来定义对象之间通信的契约,指定接⼝一半恶魔一半天使图片
中的⽅法为私有或保护没有意义。他们默认为公有⽅法。
24 .那么如果这些接⼝中有重复的⽅法名称呢?
这种情况中你可以决定如何实现。当然需要特别得⼩⼼。但是在编译环节是没有问题的。
(只是会提出警告:这时可以使⽤New 关键字消除警告)
25 请解释接⼝的显式实现有什么意义?
答: 规定强制执⾏,保持⼀致
26. 虚⽅法(virtual)和抽象(abstract)⽅法区别:
虚⽅法和抽象⽅法都可以⽤override重写。在⼦类中重写后,会覆盖⽗类中的⽅法。
抽象⽅法必须在⼦类中重写。抽象⽅法没有⽅法体,虚⽅法有⽅法体。
在⼦类中也可以不重写⽗类中的虚⽅法,或者不写⾃⼰的⽅法,则⼦类可以使⽤Ba 调⽤⽗类中的虚⽅法。
27 .什么是虚函数?什么是抽象函数?
虚函数:没有实现的,可由⼦类继承并重写的函数。抽象函数:规定其⾮虚⼦类必须实现的函数,必须被重写。
28 abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized?
答:都不能。
30 接⼝(interface)和抽象类(abstract class)的区别是什么?
(1) 接⼝也可以理解为⼀种特殊的抽象类,也可以实现多态和继承。接⼝中的字段,属性,⽅法等
都不做具体的实现。
接⼝是⼀组规范,⼀种标准,必须实现了接⼝才能实现某种功能。通常⽤来约束类的⾏为。
实现接⼝的⼦类,必须实现接⼝中提供的未实现的⽅法或属性等。
接⼝⽀持多继承,⼀个类可以实现多个接⼝。接⼝可以作为返回值或者参数来使⽤。接⼝传递的是:实现了接⼝的类的实例化对象;返回的也是:实现了接⼝的对象。
(2) 抽象类:
声明⽅法的存在⽽不去实现它的类被叫做抽像类(abstract class)
抽象类不能被实例化,必须通过⼦类来实例化。(⾥⽒替换原则)。实例化以后,⽗类中的抽象⽅法会被⼦类覆盖。
抽象类不能是静态或者密封类(因为抽象类⼀般是做⽗类对象);
抽象类中不⼀定有抽象⽅法(抽象类中即可以包含抽象⽅法:没有实现的⽅法;也可以包含⾮抽象⽅法:实现的⽅法,具体⽅法;也可以指定⽅法的访问修饰符),有抽象⽅法的类⼀定是抽象类(抽象⽅法必须包含在抽象类中)。
当⼦类继承抽象类,⼀定要实现抽象类中的抽象⽅法。
31 接⼝是否可以继承接⼝?抽象类是否可以实现(implements)接⼝? 抽象类是否可以继承实体类(concrete class)?
接⼝是可以继承接⼝的,抽象类是可以实现接⼝的,抽象类可以继承实体类,但是有个前提条件(实体类必须要有明确的构造函数。)
32 C#中接⼝(Interface)和类(class)的异同
接⼝和类都是类,不同的事,接⼝只包含⽅法或属性的声明,不包含具体实现⽅法的代码,接⼝可以实现多继承,⽽类只能是单继承,继承接⼝的类必须实现接⼝中声明的⽅法或属性。接⼝主要定义⼀种规范,统⼀调⽤⽅法,在⼤型项⽬中接⼝正发挥⽇益重要的作⽤。
接⼝是⼀种规范,声明⽅法、字段等⽽不去实现它,具体的实现交由实现它的⼦类来完成,可以理解成抽象类的变体。同时也不能声明为static、aled类。
类是⽅法和字段具体实现的地⽅,实现接⼝则必须实现接⼝中所有的⽅法等
接⼝是负责功能的定义,项⽬中通过接⼝来规范类,操作类以及抽象类的概念!⽽类是负责功能的具体实现!在类中也有抽象类的定义,抽象类与接⼝的区别在于:抽象类是⼀个不完全的类,类⾥⾯有抽象的⽅法,属性,也可以有具体的⽅法和属性,需要进⼀步的专业化。但接⼝是⼀个⾏为的规范,⾥⾯的所有东西都是抽象的!⼀个类只可以继承⼀个基类也就是⽗类,但可以实现多个接⼝
33. 请你说说中类(class)与结构(struct)的区别?
Class可以被实例化,属于引⽤类型,是分配在内存的堆上的,
Struct属于值类型,是分配在内存的栈上的.
结构与类共享⼏乎所有相同的语法,但结构⽐类受到的限制更多:尽管结构的静态字段可以初始化,结构实例字段声明还是不能使⽤初始值设定项。结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
结构的副本由编译器⾃动创建和销毁,因此不需要使⽤默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来亚洲最大的大学
实现默认构造函数。结构不能从类或其他结构继承。结构是值类型 -- 如果从结构创建⼀个对象并将该对象赋给某个变量,变量则包含结构的神秘现象
全部值。复制包
含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使⽤引⽤,因此结构没有标识 -- 具有相同数据的两个值类型实例是⽆法区分的。C# 中的所有值类型本质上都继承⾃ ValueType,后者继承⾃ Object。编译器可以在⼀个称为装箱的过程中将值类型转换为引⽤类型。
结构具有以下特点:
l 结构是值类型,⽽类是引⽤类型。
2。向⽅法传递结构时,结构是通过传值⽅式传递的,⽽不是作为引⽤传递的。
3.与类不同,结构的实例化可以不使⽤ new 运算符。
4. 结构可以声明构造函数,但它们必须带参数。
5⼀个结构不能从另⼀个结构或类继承,⽽且不能作为⼀个类的基。所有结构都直接继承⾃System.ValueType,后者继承⾃System.Object。
6 结构可以实现接⼝。
7 在结构中初始化实例字段是错误的。(类可以实现接⼝。)
34 . 如何区别重载⽅法?
不同的参数类型,不同的参数个数,不同的参数顺序。(具有相同⽅法名名称)
35 . const和readonly有什么区别?
const关键字⽤来声明编译时常量,固定不变的常量。( 中声明常量使⽤的关键字)
readonly⽤来声明运⾏时常量
每⼀个class⾄多只可以定义⼀个static构造函数,并且不允许增加访问级别关键字,参数列必须为空。为了不违背编码规则,通常把static数据成员声明为private,然后通过statci property提供读写访问。
const 关键字⽤于修改字段或局部变量的声明。它指定字段或局部变量的值不能被修改。常
数声明引⼊给定类型的⼀个或多个常数。const数据成员的声明式必须包含初值,且初值必须是⼀个
常量表达式。因为它是在编译时就需要完全评估。
const成员可以使⽤另⼀个const成员来初始化,前提是两者之间没有循环依赖。
readonly在运⾏期评估赋值,使我们得以在确保“只读访问”的前提下,把object的初始化动作
推迟到运⾏期进⾏。
readonly 关键字与const 关键字不同:const 字段只能在该字段的声明中初始化。readonly 字
段可以在声明或构造函数中初始化。因此,根据所使⽤的构造函数,readonly 字段可能具有不同的
值。另外,const 字段是编译时常数,⽽readonly 字段可⽤于运⾏时常数。readonly 只能在声明
时或者构造函数⾥⾯初始化,并且不能在static 修饰的构造函数⾥⾯。
36 .在c#中using和new这两个关键字有什么意义,请写出你所知道的意义?
Using 引⼊⼀个名⼦空间,或在使⽤了⼀个对像后⾃动调⽤其IDespo,
New 实例化⼀个对像,或修饰⼀个⽅法,表此⽅法完全重写此⽅法
37.构造器Constructor是否可被override?
构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading。
38 . new 关键字有⼏种⽤法?
(1)new 运算符⽤于创建实例化对象和调⽤构造函数。
(2)new 修饰符⽤于向基类成员隐藏继承成员,隐藏基类的⽅法。
(注意:当⼦类和⽗类中有相同的⽅法名时:使⽤new可以消除警告)
(3)new 约束⽤于在泛型声明中约束可能⽤作类型参数的参数的类型。
39 .概述反射和序列化?
(⼀)序列化:(1)序列化是将对象转换为容易传输的格式的过程。就是将对象的状态存储到特定
存储介质的过程,也可以说是将对象状态转换为可保持或传输的格式的过程。在序列化过程中,会
将对象的公有成员,私有成员包括类名,都转换为数据流的形式,存储到存储介质中,这⾥说的存
储介质通常是⽂件。例如,可以序列化⼀个对象,然后使⽤HTTP 通过Internet 在客户端和服务器之
间传输该对象。在另⼀端,反序列化将从该流重新构造对象。
注意:如果要序列化某个特定对象,他的各个成员对象也必须是可序列化的。
(2)特性:使⽤ [Serializable] 标记⼀个类是可序列化,⽽[Serializable]本⾝就是可序列
化特性。所谓特性,就是为⽬标元素(可以是数据集写给父母的感恩信
,模块,类,属性,⽅法,甚⾄函数参数等)
加⼊附加信息,类似于注释。特性本质上也是⼀个类,[Serializable]对应的类是