面向对象测试题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

一、问答题1.值类型和引用类型的区别?值类型和引用类型的区别在于,值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。值类型变量直接把变量的值保存在栈中,引用类型的变量把实际数据的地址保存在栈中,而实际数据则保存在堆中。注意,堆和栈是两个不同的概念,在内存中的存储位置也不相同。堆(Heap)一般用于存储可变长度的数据,如字符串类型堆中保存值和对象,调用完毕之后依然存在,由垃圾回收器查找栈中有无指向该值或对象的引用,无则从堆中删除;栈(Stack)则用于存储固定长度的数据,如整型类型的数据int(每个int变量占用四个字节),栈由系统管理生存期,存储代码执行和调用路径,执行或调用完毕即从栈中清除。由数据存储的位置可以得知,当把一个值变量赋给另一个值变量时,会在堆栈中保存两个完全相同的值;而把一个引用变量赋给另一个引用变量,则会在堆栈中保存对同一个堆位置的两个引用,即在堆栈中保存的是同一个堆的地址。在进行数据操作时,对于值类型,由于每个变量都有自己的值,因此对一个变量的操作不会影响到其它变量;对于引用类型的变量,对一个变量的数据进行操作就是对这个变量在堆中的数据进行操作,如果两个引用类型的变量引用同一个对象,实际含义就是它们在堆栈中保存的堆的地址相同,因此对一个变量的操作就会影响到引用同一个对象的另一个变量。(1)值类型包括:简单类型、结构类型、枚举类型。其中,简单类型又分为:整型、布尔型、字符型、浮点型、小数型。(2)引用类型包括:对象类型、类类型、接口、元数据、字符串类型、数组。//值类型与引用类型的例子staticvoidMain(string[]args){//=====值类型,操作的是值========inti1=10;inti2=i1;i2=88;Console.WriteLine(i1++i2);//1088[由于值类型直接操作值,所以不会发生改变]//=====引用类型,操作的是引用,所谓的引用可以看作是指向内存的地址,地址再对应着内容=====int[]intArr1=newint[]{1,2,3};int[]intArr2=intArr1;intArr2[0]=9;intArr2[2]=0;foreach(intiinintArr1){Console.Write(i);//结果:920[由于引用类型intArr1的引用赋值给了intArr2,所以他们是持有同一个引用,当intArr2的引用发生改变的时候,intArr1的引用也将发生变化]}foreach(intjinintArr2){Console.Write(j);//结果:920}Console.Read();下面代码的输出结果是什么?classProgram{staticvoidMain(string[]args){stringb;b=old;Func1(refb);Console.WriteLine(b);intc;c=3;Func1(refc);Console.WriteLine(c);}publicstaticvoidFunc1(refstringa){a=new;}publicstaticvoidFunc1(refinta){a=6;}}答案:new6题目2:下面代码的输出结果是什么?classProgram{staticvoidMain(string[]args){stringb;b=old;Func1(b);Console.WriteLine(b);intc;c=3;Func1(c);Console.WriteLine(c);}publicstaticvoidFunc1(stringa){a=new;}publicstaticvoidFunc1(inta){a=6;}}答案:old32.简述装箱和拆箱的过程。装箱(boxing)是将值类型隐式地转换为引用类型。如inti=3;objecto=i;便是装箱过程,装箱一个数值会为其分配一个对象实例,并把该数值拷贝到新对象中。拆箱(unboxing)是显式地把引用类型转换成值类型,如intj=(int)ocharj=(char)o。3.结构和类的区别是什么?1)结构是一个值类型,保存在栈上,而类是一个引用类型,保存在受管制的堆上。2)对结构中的数据进行操作比对类或对象中的数据进行操作速度要快。3)一般用结构存储多种类型的数据,当创建一个很多类或对象共用的小型对象时,使用结构效率更高。4.什么是静态变量?类的数据成员可以分静态变量、非静态变量两种.静态成员:静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会分配内存,所以静态成员不能访问非静态的成员..因为静态成员存在于内存,所以非静态成员可以直接访问类中静态的成员.非成静态员:所有没有加Static的成员都是非静态成员,当类被实例化之后,可以通过实例化的类名进行访问..非静态成员的生存期决定于该类的生存期..而静态成员则不存在生存期的概念,因为静态成员始终驻留在内容中。一个类中可以同时包含静态成员和非静态成员,类中也包括静态构造函数和非静态构造函数。5.abstractclass和interface有什么区别?声明方法的存在而不去实现它的类被叫做抽像类(abstractclass),它用于要创建一个体现某些基本行为的类,抽象类不能被实例化。abstactclassA{}Aa=newA();//这个是错误的classB:A{}Bb=newB();Aa=b;-------------------然而可以创建一个变量,其类型是一个抽像类,并让它指向【具体子类】的一个实例。-------------------===》不能有抽像构造函数或抽像静态方法。抽象类的方法必须全部被子类继承::如果子类也是抽象的,那么就不必全部继承接口(interface)是抽像类的【变体】。在接口中,所有方法都是抽像的;在抽象类中,有些方法可以不是抽象的。多继承性可通过接口实现。接口中的所有方法都是抽像的,没有一个有【方法体】。interfaceA{}interfaceB{}abstractclassA1(){}abstractclassA2{}classc:A1,A,B{}6.接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承实体类(concreteclass)?接口可以继承接口。抽象类可以实现(implements)接口,抽象类是可继承实体类,但前提是实体类必须有明确的构造函数。7.进程和线程分别怎么理解?1)定义解释进程是具有一定独立功能程序在关于某个数据集上的一次运行活动。进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是Cup调度的基本单位。它是比进程更小的能独立运行的基本单位,线程只拥有一点在运行中必不可少的资源,可与同一个进程中其他线程共享进程中所拥有的所有资源。一个线程可以创建和销毁另一个线程,同一进程中的多个线程可以同时并发执行;2)区别解释一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序并发行高,另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存从而极大的提高程序的运行效率。进程有独立的地址空间一个进程崩溃后在保护模式下不会对其他进程产生影响,而线程只是一个进程中的不同执行路径;线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮,但在进程切换时耗费资源较大,效率要差一些。但对一些要同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。8.简述“开-闭”原则的基本思想。请举出一个使用了软件“开-闭”原则的软件设计模式,其中何处体现了“开-闭”原则。答:“开—闭”原则:软件实体应当对扩展开放,而对修改关闭,“开-闭”原则要求软件系统能够在不需要修改原有类的基础上,通过增加类达到扩展功能的目的。Abstractfactory体现了这个原则,如果想增加一类新的products,只需在product类体系中增加各个products,然后在factory类体系结构中增加一个concretefactory就可以了,而不需要对现有类做任何修改,TheOpen-closedprinciple[ocp]在不改动过模块源代码的情况下扩展模块的行为。9.简述依赖倒置原则的基本思想。请举出一个使用了软件依赖原则的软件设计模式,其中何处体现了依赖原则。答:依赖倒置原则的基本思想是:①高层模块不应该依赖于低层模块,二者都应该依赖于抽象。②抽象不应该依赖于细节,细节应该依赖于抽象。Templatemethod就体现了这个原则,它定义了一个操作中的算法骨架,而将一些步骤延迟到子类中,templatemethod使得子类不改变一个算法的结构,即可重定义该算法的某些特定步骤。10.什么是单一职责原则?请举出一个使用了单一职责原则的软件设计模式,其中何处体现了单一职责原则。答:基本思想:SRP使得一个类或一个模块承担的责任尽可能的少,使尽可能少的因素或动机影响该类或该模块,即增大类或模块的内聚性,减少其耦合度,SRP是所有原则中最简单的之一,也是最难正确运用的之一。COMMAND模式体现了SRP原则,大多数类都是一组方法和相应的一组变量的结合,而该模式只是封装了一个没有任何变量的函数,它对函数的关注超过了类,将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化。11.软件复用可采用类的继承方式和类的聚合方式,比较两者的优缺点。答:聚合:一个对象拥有另一个对象或对另一个对象负责(即一个对象包含另一个对象或是另一个对象的一部分)并且聚合对象和其所有具有相同的生命周期(即所谓的“同生共死”关系)。聚合复用优点:①容器类仅能通过被包含对象的接口来对其进行访问。②“黑盒”复用,因为被包含对象的内部细节对外是不可见。③包装性好。④实现上的相互依赖性比较小。⑤每一个类只专注于一项任务。⑥通过获取指定其他的具有相同类型的对象的使用,可以在运行期间动态地定义(对象的)组合。聚合的缺点:①导致系统中的对象过多②为了能将多个不同的对象作为组合块来使用,必须仔细地对接口进行定义。类继承:是一种通过扩展(一个已有对象的)实现,从而获得新功能的复用方法。继承的优点:①容易进行新的实现,因为其大多数可继承而来②易于修改或扩展那些被复用的实现。继承的缺点:①破坏了封装性,因为这会将父类的实现细节暴露给子类②“白盒”复用,因为父类的内部细节对于子类而言通常是可见的③当父类的实现更改时,子类也不得不随之更改④从父类继承来的实现将不能在运行期间进行改变。12.比较Adapter和Proxy模式使用上的异同之处。适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。代理模式有两个英文名字:ProxyPattern和SurrogatePattern。代理模式:为其他对象提供一种代理以控制对这个对象的访问。说白了就是,在一些情况下客户不想或者不能直接引用一个对象,而代理对象可以在客户和目标对象之间起到中介作用,去掉客户不能看到的内容和服务或者增添客户需要的额外服务。两者的主要区别在于代理模式应用的情况是不改变接口命名的,而且是对已有接口功能的一种控制;而适配器模式则强调接口转换。二、选择题1.关于信息隐藏的描述错误的是()A.信息隐藏是指对象在与外界的交互中,尽可能地隐藏对象的内部细节,仅保留有限的对外接口与外部进行联系。B.信息隐藏既可以隐藏属性,也可以隐藏操作。C.一个对象信息隐藏的内容对任何对象都是一样的,并不随与之交互的对象的不同而改变。D.信息隐藏的原则是公开不变的操作,隐藏易变的操作。2.关于多态的描述正确的是()A.多态是指在聚合关系中的各个类中名字相同的属性和操作具有不同的意义。B.多态的实现机制是编译时

1 / 9
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功