C#OOP自测C#自测.docx
《C#OOP自测C#自测.docx》由会员分享,可在线阅读,更多相关《C#OOP自测C#自测.docx(13页珍藏版)》请在冰豆网上搜索。
![C#OOP自测C#自测.docx](https://file1.bdocx.com/fileroot1/2023-6/9/5cd15858-4954-407e-b3b8-15625929254d/5cd15858-4954-407e-b3b8-15625929254d1.gif)
C#OOP自测C#自测
C#OOP(自测)
一、填空题
1、实例成员通过类的实例访问,静态成员通过类访问
2、用sealed修饰的类叫密封类,用于防止从所修饰的类派生出其它类。
如果一个密封类被指定为其他类的基类,则会发生编译时错误。
密封类不能同时为抽象类。
3、C#中,stringstr=null与stringstr="",请尽量用文字说明区别,前者只声明变量不分配内存;后者指向一个值为空字符串的实例,分配内存空间
4、详述.NET里class和struct的异同。
类与结构有很多相似之处:
结构可以实现接口,并且可以具有与类相同的成员类型。
然而,结构在几个重要方面不同于类:
结构为值类型而不是引用类型,并且结构不支持继承。
5、值类型和引用类型的区别:
值类型变量间赋值是值拷贝,引用类型变量间赋值是地址拷贝
6、如何把一个array复制到arrayList里:
将array传给arraylist的构造函数
7、Override是对基类中成员的重写,实现多态。
8、面向对象的语言具有封装性、继承性、多态性
9、Strings=newString("xyz");创建了两个StringObject,分别是一个是“xyx”,一个是指向“xyx”的引用对象s。
10、是否可以继承String类(写明原因):
String类是sealed类故不可以继承。
11、using的用法:
引入名称空间,自动释放对象。
12、如果x大于y,则输出x,否则输出y,用三元运算符表示:
x>y?
x:
y
13、publicstaticconstintA=1;这段代码有错误么?
是什么?
const不能用static修饰。
14、在.Net中所有可序列化的类都被标记为_[serializable],包括它的父类和属性中的引用类型。
15、.net的错误处理机制是什么:
.net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止
16、&和&&的区别:
&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)
17、类是具有共同特征和行为的一类事物的统称,以及对这一类事物的一种抽象定义
18、对象是独一无二的具体个体,用来描述现实世界的某个事物,将现实世界的事物模型化
20、实例化的对象可以通过对象.字段的方式来修改或访问该对象的字段值
21、属性是对字段的封装,主要目的是为了保障对字段访问的安全性和灵活性
22、在创建对象时对对象成员赋初值会调用构造函数。
23、创建对象时,根据不同的需要,在不同的场合对不同成员初始化,需要使用重载构造函数。
24、构成方法重载的条件有:
同一个类中、方法名相同、参数的类型或个数不同。
25、C#中集合的主要特性有:
动态改变大小、可存储任意类型的对象、提供一系列操作集合中对象的方法。
26、ArrayList和Hashtable中存储的元素都会自动转换成object类型,在访问时需要从object转换回存储前的类型。
27、使用泛型的优点有:
可以极大限度重用代码、保护类型的安全及提高程序的性能。
28、继承的特性有:
继承的传递性、继承的单根性、成员的访问性。
29、C#中使用:
符号实现继承。
30、当A类被B类继承时,我们就把A类称为父类或基类,B类稀烂为子类或派生类。
31、密封类是指防止派生子类,密封方法是指不允许子类再次被重写。
32、继承的好处在于子类自动拥有了父可可被继承的字段、属性和方法等,只需再定义自己独特的成员即可。
33、在创建子类对象时,先隐式调用父类的无参构造函数,再调用自身的构造函数。
如果父类没有无参构造函数则提示错误。
34、在继承关系中,子类和父类满足“子类isa父类”的关系。
36、在C#中,如果定义了一个没有父类的类,则会自动继承Object类。
37、多态的主要表现形式是:
子类继承父类后对于同一个方法有不同的实现方式。
其实现的方式分别是:
隐藏父类方法和重写父类方法。
38、sealed修饰方法时只能与override一起使用,防止重写的方法再次被重写。
39、抽象类可以不包含抽象方法,但有抽象方法的类必须定义为抽象类。
40、.NET框架提供了Directory类和DirectoryInfo类用于对磁盘和文件夹的操作管理,提供了File类和FileInfo类用于对文件进行常用操作管理。
41、序列化就是将对象实例的状态存储到存储媒体中的过程。
二、简答题
1.简述private、protected、public、internal修饰符的访问权限。
访问修饰符
说明
public
公有的,访问不受限制
private
私有的,只能本类内部访问
protected
受保护的,只能本类及其子类访问
internal
内部的,只限于本项目内成员访问
protectedinternal
内部保护的,只限于本项目或子类访问
2.abstractclass和interface有什么区别?
答:
抽象类可以有具体实现的成员,而接口没有;接口可以多重继承而抽象类不可以;抽象类的子类使用override关键字对父类成员进行重写,而接口的派生类直接实现接口成员。
3.
简述构造函数与普通方法的不同点:
4、使用抽象类要注意以下要点(简答):
并自己构造代码进行说明
1.抽象类可以不包含抽象方法,但是含有抽象方法的类必须定义为抽象类
2.抽象方法不允许有方法体
3.子类继承于抽象类时必须重写抽象类中所有的抽象方法,除非子类也是抽象类
4.抽象类不允许直接实例化,只能实例化其非抽象子类对象
5、抽象方法和虚方法的区别
抽象方法和虚方法都是为了实现多态功能,其主要区别在于:
抽象方法只提供一个功能名称,要求子类必须实现该功能;而虚方法不只提供功能名称还提供了默认实现方式,子类可以不重新实现该功能,其语法区别如表如示:
抽象方法
虚方法
使用abstract关键字修饰
使用virtual关键字修饰
只能定义在抽象类中
可以定义在除密封类以外的类中
不允许有方法体
必须有方法体
子类必须重写
子类可以重写
7、自定义接口时需要注意:
并自己构造代码进行说明
1、接口名通常使用大写字母“I”开头,表明其是接口类型
2、接口可包含方法、属性、事件和索引器,但不能包含字段
3、接口中定义的成员不允许有具体实现
4、接口中的成员不允许添加任何访问修饰符
8、抽象类和接口的异同点
C#中抽象类和接口在使用上有很多相同点:
例如,都不实例化,都可以包含未实现的方法,其子类必须实现其未实现的方法等级,但是在定义时有很大的区别,如下表如示:
1.抽象类和接口语法的区别
抽象类
接口
使用abstract关键字
使用interface关键字
可以包含字段和已实现成员
不能有字段,只能包含未实现的成员
子类通过override实现抽象方法
子类直接实现所有成员
2.应用场合的区别
抽象类是一种特殊的类,不能被实例化,除此之外可以像普通类一样使用,其使用场合侧重于有继承关系的一组对象。
而接口用于定义一组行为规则,一般用于多个不同种类对象具有相同行为或功能的场合。
9、ArrayList有3种方式来删除其中元素
(1)Remove(objectvalue):
从ArrayList集合中移除与指定的value对象匹配的第一个元素。
(2)RemoveAt(intindex):
从ArrayList集合中移除指定索引处的元素。
(3)Clear():
移除ArrayList中所有元素。
10、读写文件操作的基本步骤为:
(1)创建文件流。
(2)创建读、写器。
(3)执行读、写操作。
(4)关闭读写器。
(5)关闭文件流。
三、理解题
1、在下面的例子里
usingSystem;
classA
{
publicA(){
PrintFields();
}
publicvirtualvoidPrintFields(){}
}
classB:
A
{
intx=1;
inty;
publicB(){
y=-1;
publicoverridevoidPrintFields(){
Console.WriteLine("x={0},y={1}",x,y);
}
}
当使用newB()创建B的实例时,产生什么输出?
X=1,Y=0
2、
usingSystem;
classA
{
publicstaticintX;
staticA(){
X=B.Y+1;
}
}
classB
{
publicstaticintY=A.X+1;
staticB(){}
staticvoidMain(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}
产生的输出结果是什么?
x=1,y=2
4.执行下面代码后:
StringstrTemp="abcdefg某某某";
IntiSystem.Text.Encoding.Default.GetBytes(strTemp).Length;
Intj=strTemp.Length;
问:
i=(14);j=(11)
i=(14);j=(11)中文两个字节
5.override与重载的区别
答:
override与重载的区别。
重载是方法的名称相同,参数个数或参数类型不同,进行多次重载以适应不同的需要
6.请编程实现一个冒泡排序算法?
答:
int[]array=newint[*];
inttemp=0;
for(inti=0;i{
for(intj=array.Length-1;j>=i;j--)
{
if(array[j+1]{
temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
}
}
}
7.一列数的规则如下:
1、1、2、3、5、8、13、21、34......求第30位数是多少,用递归算法实现。
答:
publicclassMainClass
{
publicstaticvoidMain()
{
Console.WriteLine(Foo(30));
}
publicstaticintFoo(inti)
{
if(i==1||i==2)
return1;
returnFoo(i-1)+Foo(i-2);
}
}
8.在下面的例子里
usingSystem;
classA
{
publicA()
{
PrintFields();
}
publicvirtualvoidPrintFields(){}
}
classB:
A
{
intx=1;
inty;
publicB()
{
y=-1;
}
publicoverridevoidPrintFields()
{
Console.WriteLine("x={0},y={1}",x,y);
}
}
当使用newB()创建B的实例时,产生什么输出?
答:
X=1,Y=0;x=1y=-1
9.能用foreach遍历访问的对象需要实现________________接口或声明________________方法的类型。
答:
IEnumerable、GetEnumerator。
10.接口是否可继承接口?
抽象类是否可实现(implements)接口?
抽象类是否可继承实体类(concreteclass)?
答:
接口可以继承接口。
抽象类可以实现(implements)接口,抽象类可继承实体类,但前提是实体类必须有明确的构造函数。
11.构造器Constructor是否可被override?
答:
构造器Constructor不能被继承,因此不能重写Override,但可以被重载。
12.try{}里有一个return语句,那么紧跟在这个try后的finally{}里的code会不会被执行,什么时候被执行,在return前还是后?
答:
会执行,在return前执行。
13.swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
答:
都可以。
14.产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
int[]intArr=newint[100];
ArrayListmyList=newArrayList();
Randomrnd=newRandom();
while(myList.Count<100)
{
intnum=rnd.Next(1,101);
if(!
myList.Contains(num))
myList.Add(num);
}
for(inti=0;i<100;i++)
intArr[i]=(int)myList[i];
15.需要实现对一个字符串的处理,首先将该字符串首尾的空格去掉,如果字符串中间还有连续空格的话,仅保留一个空格,即允许字符串中间有多个空格,但连续的空格数不可超过一个.
答:
stringinputStr="xxxx";
inputStr=Regex.Replace(inputStr.Trim(),"[]*","");
16.下面这段代码输出什么?
为什么?
inti=5;
intj=5;
if(Object.ReferenceEquals(i,j))
Console.WriteLine("Equal";
else
Console.WriteLine("NotEqual";
答:
不相等,因为比较的是对象
17.什么是虚函数?
什么是抽象函数?
答:
虚函数:
有实现,可以被子类重写;抽象函数:
无实现,必须被非抽象子类重写。
60.类成员有_____种可访问形式?
答:
2;
62.floatf=-123.567F;inti=(int)f;i的值现在是_____?
答:
-123。
67.下面的代码中有什么错误吗?
_______
usingSystem;
classA
{
publicvirtualvoidF(){
Console.WriteLine("A.F";
}
}
abstractclassB:
A
{
publicabstractoverridevoidF();答:
abstractoverride是不可以一起修饰.
}//newpublicabstractvoidF();
68.当类T只声明了私有实例构造函数时,则在T的程序文本外部,___可以___(可以or不可以)从T派生出新的类,不可以____(可以or不可以)直接创建T的任何实例。
答:
不可以,不可以。
。
73.在.net(C#or)中,Appplication.Exit还是Form.Close有什么不同?
答:
一个是退出整个应用程序,一个是关闭其中一个form。
74.在C#中有一个double型的变量,比如10321.5,比如122235401.21644,作为货币的值如何按各个不同国家的习惯来输出。
比如美国用$10,321.50和$122,235,401.22而在英国则为£10321.50和£122235401.22
答:
System.Globalization.CultureInfoMyCulture=newSystem.Globalization.CultureInfo("en-US");
//System.Globalization.CultureInfoMyCulture=newSystem.Globalization.CultureInfo("en-GB");为英国货币类型
decimaly=9999999999999999999999999999m;
stringstr=String.Format(MyCulture,"Myamount={0:
c}",y);
78.重载与覆盖的区别?
答:
1、方法的覆盖是子类和父类之间的关系,是垂直关系;方法的重载是同一个类中方法之间的关系,是水平关系
2、覆盖只能由一个方法,或只能由一对方法产生关系;方法的重载是多个方法之间的关系。
3、覆盖要求参数列表相同;重载要求参数列表不同。
4、覆盖关系中,调用那个方法体,是根据对象的类型(对象对应存储空间类型)来决定;重载关系,是根据调用时的实参表与形参表来选择方法体的。