首页 > 经典文章 > 经典美文 > 软件工程师面试题

软件工程师面试题

时间:2018-06-04   来源:经典美文   点击:

【www.gbppp.com--经典美文】

软件工程师面试题 第一篇_高级软件工程师面试题

高级软件工程师、项目经理面试题

1、 类、对象的概念?

2、 简述抽象?

3、 接口与抽象类?

4、内部类(Inner Class)?

5、访问修饰符限制?

6、Static、final、abstract、native、synchronized关键字的使用?

11、运行时异常与一般异常有何异同?

14、Http与Https ?

16、J2EE的容器与服务器?

17、继承限制?

19、列举常见集合框架类型?

20、面向对象的特征?

23、设计模式?

26、存储过程和函数的区别?

27、 游标的作用?如何知道游标已经到了最后?

29、你经常看或仔细研读过的书有哪些?

高级软件工程师面试题答案

类、对象的概念:

1) 类:具有共同属性和行为的对象的抽象。类是创建对象的模板。

2) 对象:现实世界中的实体。在计算机中,是指可标识的存储区域。

3) 类是对象的抽象、对象是类的实例。

抽象:是从特定的实例中抽取共同性质形成一般化概念的过程。

接口与抽象类:

1)接口和抽象类都用于抽象,接口是抽象类的抽象。

2)接口中只有方法声明,没有实现(无方法体);在接口中声明的方法具有public和abstract属性,一个类可以实现多个接口(即多继承),接口以‘,’分隔;接口中的方法必须全部实现。

3)抽象类可以有部分方法实现,抽象类必须通过继承才能使用。

内部类(Inner Class):

1)内部类是嵌套在另一个类中的类。

2)内部类用于名称隐藏和程序代码的组织,另外内部类拥有直接访问其外部类所有成员(包括private的)的权限(无需任何关键字修饰)。

3)内部类不可以在其他类或main方法里实例化,必须使用如下方法(非静态内部类) 外部类.内部类 对象名=new 外部类().new 内部类();

静态内部类调用方式:

外部类.内部类 对象名=new 外部类.内部类();

4)非静态内部类不可以声明静态成员;静态内部类的非静态成员可以访问其外部类的静态成员,声明为静态的成员不可以访问外部的非静态成员。

访问修饰符限制:

Private protected friendly(default) public

同类 Y Y Y Y

同包不同类 N Y Y Y

同包子类 N Y Y Y

不同包不同类 N N N Y

不同包子类 N Y N Y

Static关键字的使用:

1)类成员,直接使用 类名.成员 调用。

2)静态方法只能访问静态成员。

3)静态方法不能使用this、super关键字。

4)静态方法不能被非静态方法重写或重载。

final关键字:

1)被final修饰的变量为常量不能改变。

2)被final修饰的方法不可以重写。

3)被final修饰的类不能被继承。

abstract关键字:

1)被abstract修饰的类不能实例化。

2)被abstract修饰的方法只能在子类中实现。

native关键字:非Java语言的编写,例如JNI技术。

synchronized关键字:多线程的同步访问控制。

11、运行时异常与一般异常有何异同?

异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

(Throwable是所有Java程序中错误处理的父类,有两种资类:Error和Exception。

Error:表示由JVM所侦测到的无法预期的错误,由于这是属于JVM层次的严重错误,导致JVM无法继续执行,因此,这是不可捕捉到的,无法采取任何恢复的操作,顶多只能显示错误信息。

Exception:表示可恢复的例外,这是可捕捉到的。

Java提供了两类主要的异常:runtime exception和checked exception。

checked异常也就是我们经常遇到的IO异常,以及SQL异常都是这种异常。对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

但是另外一种异常:runtime exception,也称运行时异常,我们可以不处理。当出现这样的异常时,总是由虚拟机接管。比如:我们从来没有人去处理过NullPointerException异常,它就是运行时异常,并且这种异常还是最常见的异常之一。

出现运行时异常后,系统会把异常一直往上层抛,一直遇到处理代码。如果没有处理块,到最上层,如果是多线程就由Thread.run()抛出,如果是单线程就被main()抛出。抛出之后,如果是线程,这个线程也就退出了。如果是主程序抛出的异常,那么这整个程序也就退出了。运行时异常是Exception的子类,也有一般异常的特点,是可以被Catch块处理的。只不过往往我们不对他处理罢了。也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。

如果不想终止,则必须扑捉所有的运行时异常,决不让这个处理线程退出。队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。

异常处理的目标之一就是为了把程序从异常中恢复出来。

)

14、Http与Https:Https即多了安全的Http,s(Security Socket Layer)指加密套接字协议层(简写SSL)。

17、继承限制:

父类对象不可以赋给子类对象,因为子类可能具有更多的成员,反之可以。

19、列举常见集合框架类型:

1)List、Set、Map。由这三个接口实现出ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等常用集合框架。

2)Vector属于重量级组件不推荐使用。

3)Map类型维护键/值对,Hashtable与HashMap相近但效率略低于HashMap、高于TreeMap,TreeMap优点是可以排序。

4)Set类型可装入唯一值,HashSet效率高于TreeSet但TreeSet可以维护内部元素的排序状态。

5)List类型可按某种特定顺序维护元素。ArrayList允许快速随机访问,但如果添加或删除位于中间的元素时效率很低;LikedList提供最 佳循序访问及快速的中间位置添加删除元素,并有addFirst、addLast、getFirst、getLast、removeFirst、 removeLast方法。

20、面向对象的特征:

1)继承:通过子类可以实现继承,子类继承父类的所有状态和行为,同时添加自身的状态和行为。

2)封装:将代码及处理数据绑定在一起的一种编程机制,该机制保证程序和数据不受外部干扰。

3)多态:包括重载和重写。重载为编译时多态,重写是运行时多态。重载必须是同类中名称相同参数不同(包括个数不同和类型不同),但返回类型不同不构成重载;重写发生于子类对父类的覆盖,子类继承父类方法名相同、参数列表相同、返回类型相同才构成重写。

23、设计模式:

一个设计模式描述了一个被证实可行的方案。这些方案非常普遍,是具有完整定义的最常用的模式。一般模式有4个基本要素:模式名称(pattern name)、问题(problem)、解决方案(solution)、效果(consequences)。

常见23种模式概述:

1) 抽象工厂模式(Abstract Factory):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

2) 适配器模式(Adapter):将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。

3) 桥梁模式(Bridge):将抽象部分与它的实现部分分离,使它们都可以独立地变化。

4) 建造模式(Builder):将一个复杂对象的构建与它的表示分离,使同样的构建过程可以创建不同的表示。

5) 责任链模式(Chain of Responsibility):为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

6) 命令模式(Command):将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

7) 合成模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。它使得客户对单个对象和复合对象的使用具有一致性。

8) 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。就扩展功能而言,它

能生成子类的方式更为灵活。

9) 门面模式(Facade):为子系统中的一组接口提供一个一致的界面,门面模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

10) 工厂方法(Factory Method):定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method 使一个类的实例化延迟到其子类。

12) 解释器模式(Interpreter):给定一个语言,定义它的语法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。

13) 迭代子模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个元素,而又不需暴露该对象的内部表示。

16) 观察者模式(Observer):定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。

18) 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。

19) 单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

26、存储过程和函数的区别

存储过程是用户定义的一系列sql语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。

1) 什么是线程?

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点。欲了解更多详细信息请点击这里。

2) 线程和进程有什么区别?

线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务。不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间。别把它和栈内存搞混,每个线程都拥有单独的栈内存用来存储本地数据。更多详细信息请点击这里。

3) 如何在Java中实现线程?

在语言层面有两种方式。java.lang.Thread 类的实例就是一个线程但是它需要调用java.lang.Runnable接口来执行,由于线程类本身就是调用的Runnable接口所以你可以继承java.lang.Thread 类或者直接调用Runnable接口来重写run()方法实现线程。更多详细信息请点击这里.

4) 用Runnable还是Thread?

这个问题是上题的后续,大家都知道我们可以通过继承Thread类或者调用Runnable接口来实现线程,问题是,那个方法更好呢?什么情况下使用它?这个问题很容易回答,如果你知道Java不支持类的多重继承,但允许你调用多个接口。所以如果你要继承其他类,当然是调用Runnable接口好了。更多详细信息请点击这里。

6) Thread 类中的start() 和 run() 方法有什么区别?

这个问题经常被问到,但还是能从此区分出面试者对Java线程模型的理解程度。start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。更多讨论请点击这里

7) Java中Runnable和Callable有什么不同?

Runnable和Callable都代表那些要在不同的线程中执行的任务。Runnable从JDK1.0开始就有了,Callable是在JDK1.5增加的。它们的主要区别是Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。我的博客有更详细的说明。

8) Java中CyclicBarrier 和 CountDownLatch有什么不同?

CyclicBarrier 和 CountDownLatch 都可以用来让一组线程等待其它线程。与 CyclicBarrier 不同的是,CountdownLatch 不能重新使用。。

9) Java内存模型是什么?

Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了:

线程内的代码能够按先后顺序执行,这被称为程序次序规则。

对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。

前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。 一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规则。 一个线程的所有操作都会在线程终止之前,线程终止规则。

一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。

可传递性

我强烈建议大家阅读《Java并发编程实践》第十六章来加深对Java内存模型的理解。

10) Java中的volatile 变量是什么?

volatile是一个特殊的修饰符,只有成员变量才能使用它。在Java并发程序缺少同步类的情况下,多线程对成员变量的操作对其它线程是透明的。volatile变量可以保证下一个读取操作会在前一个写操作之后发生,就是上一题的volatile变量规则。点击这里查看更多volatile的相关内容。

11) 什么是线程安全?Vector是一个线程安全类吗? ()

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。

12) Java中什么是竞态条件? 举个例子说明。

竞态条件会导致程序在并发情况下出现一些bugs。多线程对一些资源的竞争的时候就会产生竞态条件,如果首先要执行的程序竞争失败排到后面执行了,那么整个程序就会出现一些不确定的bugs。这种bugs很难发现而且会重复出现,因为线程间的随机竞争。一个例子就是无序处理,详见答案。

13) Java中如何停止一个线程?

Java提供了很丰富的API但没有为停止线程提供API。JDK 1.0本来有一些像stop(), suspend() 和 resume()的控制方法但是由于潜在的死锁威胁因此在后续的JDK版本中他们被弃用了,之后Java API的设计者就没有提供一个兼容且线程安全的方法来停止一个线程。当run() 或者 call() 方法执行完的时候线程会自动结束,如果要手动结束一个线程,你可以用volatile 布尔变量来退出run()方法的循环或者是取消任务来中断线程。查看示例代码。

软件工程师面试题 第二篇_软件工程试卷及答案

软件工程试卷及答案

一、单项选择题(本大题共20小题,每小题1分,共20分)

在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。

1.“软件工程的概念是为解决软件危机而提出的”这句话的意思是( )

A.强调软件工程成功解决了软件危机的问题

B.说明软件危机的存在总是使软件开发不像传统工程项目那样容易管理

C.说明软件工程这门学科的形成是软件发展的需要

D.说明软件工程的概念,即:工程的原则、思想、方法可解决当时软件开发和维护存在的问题

2.瀑布模型的主要特点是( )

A.将开发过程严格地划分为一系列有序的活动

B.将开发过程分解为阶段

C.提供了有效的管理模式

D.缺乏灵活性

3.在软件工程的需求分析阶段,不属于问题识别内容的是( )

A.功能需求B.性能需求

C.环境需求D.输入/输出需求

4.画某系统的数据流图时,顶层图有( )

A.0张B.1张

C.2张D.3张及其以上

5.软件模块内聚性最强的是( )

A.功能内聚B.通信内聚

C.偶然内聚D.逻辑内聚

6.最早提出软件系统维护问题的阶段是( )

A.可行性分析B.需求分析

C.概要设计D.详细设计

7.SD(结构化设计)方法设计的结果是( )

A.模块B.模块结构图

C.模块的算法D.数据流图

8.在进行软件测试时,首先应当进行以下哪项测试,然后再进行组装测试,最后再进

行有效性测试( )

A.单元测试B.系统测试

C.集成测试D.确认测试

9.软件详细设计阶段的任务是( )

A.算法与数据结构设计B.功能设计

C.调用关系设计D.输入/输出设计

10.下列属于静态测试方法的是( )

A.黑盒法B.路径覆盖

C.白盒法D.人工检测

11.Fortran语言主要作为以下哪个方面的语言( )

A.科学工程计算B.系统软件

C.事务处理D.人工智能

12.用结构化语言来描述加工逻辑的外层结构时,以下不属于基本结构的是( )

A.顺序结构B.选择结构

C.嵌套结构D.重复结构

l3.可维护软件的主要特性包括( )

A.可理解性、可修改性、可移植性

B.可使用性

C.可维护性、可使用性、可靠性

D.可测试性

14.程序设计语言不具有的特性是( )

A.心理特性B.工程特性

C.应用特性D.技术特性

15.下列不属于项目进度安排主要方法的是( )

A.工程网络图B.Gantt图

C.进度结构图D.任务资源表

16.下列不属于通常冗余技术的是( )

A.结构冗余B.信息冗余

C.时间冗余D.代码冗余

17.下列工具中,属于需求追踪工具的是( )

A.在DBMS上的应用运行工具B.追踪和状态报告

C.访问和版本控制机构D.文件和修改管理

18.关于软件测试的目的,下面观点错误的是( )

A.为了发现错误而执行程序的过程

B.一个好的测试用例能够发现至今尚未发现的错误

C.证明程序是正确、没有错误的

D.一个成功的测试用例是发现了至今尚未发现的错误的测试

19.在制定项目开发计划文档时,不包含的内容是( )

A.项目概述B.实施计划

C.测试计划D.交付期限

20.面向对象的开发方法中,以下哪种方法原是面向Ada语言的,并处于面向对象开发方法的奠基性地位( )

A.Booch方法B.Coad方法

C.UML语言D.OMT方法

二、填空题(本大题共10小题,每小题2分,共20分)

请在每小题的空格中填上正确答案。错填、不填均无分。

21.可行性研究从技术可行性、经济可行性、________三方面进行分析。

22.IDEF0方法用来描述系统的功能活动及其联系,建立系统的_______模型。

23.结构化方法总的指导思想是_______逐层分解。

24.在一段程序中,将多次出现的一组语句设计为一个子程序,供多个部分调用,这种情况出现的内聚称为________。

25.软件部件的内部实现与外部可访问性分离,这是指软件的______。

26.用来模拟被测模块的上级调用模块的模块称为_______。

27.软件复杂性度量的参数很多,主要有规模、_______、结构、智能度。

28.软件开发环境中最主要的组成部分是______。

29.软件工程管理的具体内容包括对开发人员、组织机构、用户和______等方面的管理。

30.增量模型根据增量方式和形式的不同,分为_____和原型模型。

三、名词解释题(本大题共5小题,每小题3分,共15分)

31.过程设计语言(PDL)

32.可移植性

33.渐增式测试

【软件工程师面试题】

34.详细设计

35.条件覆盖

四、简答题(本大题共4小题,每小题5分,共20分)

36.软件生存周期可以分为几个阶段,每个阶段的提交物是什么?

37.结构化分析的描述工具有哪些?简述结构化分析的步骤。

38.什么是黑盒测试法?常用的黑盒测试方法有哪些?

39.简述面向对象的特征。

五、应用题(本大题共2小题,第40小题10分,第41小题15分,共25分)

40.某个学生成绩管理系统的部分功能如下:

(1)基本信息管理:教务管理人员输入或修改学期教学执行计划、学生名单和教师名单;

(2)学生选课:学生根据教学执行计划进行选课;

(3)分配任课教师:教务管理人员为符合开课条件的课程分配教师,并打印任课通知单给教师;

(4)成绩管理:每门课程的教师在考试评分结束后将考试成绩交给教务管理人员,教务管理人员输入、维护成绩,系统可生成成绩单(发给学生)、成绩统计分析表(发给教务管理人员)。

请根据要求画出该问题的分层数据流图(要求画出顶层和0层数据流图)。

一、单项选择题(在每小题的四个备选答案中选出一个正确答案,并将其号码填在题后的括号内。每小题1分,共20分)

1. “软件危机”是指( )

A. 计算机病毒的出现

B. 利用计算机进行经济犯罪活动

C. 软件开发和维护中出现的一系列问题

D. 人们过分迷恋计算机系统

2. DFD中的每个加工至少需要( )

A. 一个输入流 B. 一个输出流

C. 一个输入或输出流 D. 一个输入流和一个输出流

3. 为了提高模块的独立性,模块之间最好是( )

A. 控制耦合 B. 公共耦合 C. 内容耦合 D. 数据耦合

4. 下面关于PDL语言不正确的说法是( )

A. PDL是描述处理过程怎么做

B. PDL是只描述加工做什么

C. PDL也称为伪码

D. PDL的外层语法应符合一般程序设计语言常用的语法规则

5. 详细设计与概要设计衔接的图形工具是( )

A. DFD图 B. 程序图 C. PAD图 D. SC图

6. 不适合作为数据处理与数据库应用的语言是( )

A. SQL B. Cobol C. 4GL D. Lisp

7. 下列关于功能性注释不正确的说法是( )

A. 功能性注释嵌在源程序中,用于说明程序段或语句的功能以及数据的状态

B. 注释用来说明程序段,需要在每一行都要加注释

C. 可使用空行或缩进,以便很容易区分注释和程序

D. 修改程序也应修改注释

8. 下列关于效率的说法不正确的是( )

A. 效率是一个性能要求,其目标应该在需求分析时给出

B. 提高程序效率的根本途径在于选择良好的设计方法,数据结构与算法

C. 效率主要指处理机时间和存储器容量两个方面

D. 程序的效率与程序的简单性无关

9. 测试的关键问题是( )

A. 如何组织对软件的评审 B. 如何验证程序的正确性

C. 如何采用综合策略 D. 如何选择测试用例

10. 结构化维护与非结构化维护的主要区别在于( )

A. 软件是否结构化 B. 软件配置是否完整

C. 程序的完整性 D. 文档的完整性

11. 软件维护困难的主要原因是( )

A. 费用低 B. 人员少

C. 开发方法的缺陷 D. 得不到用户支持

12. 可维护性的特性中,相互矛盾的是( )

A. 可理解性与可测试性 B. 效率与可修改性

C. 可修改性和可理解性 D. 可理解性与可读性

软件工程师面试题 第三篇_.NET软件工程师面试题

一.填空题(每空1分,共12分)

1面向对象的语言具有__封装______性、__继承_______性、__多态______性。

2能用foreach遍历访问的对象需要实现 ____Ienumerable____________接口或声明_____GetEnumerator___________方法的类型。

3当类T只声明了私有实例构造函数时,则在T的程序文本外部,___不可以___(可以 or 不可以)从T派生出新的类,在T的内部__可以__(可以 or 不可以)直接创建T的任何实例,在T的外部__不可以__(可以 or 不可以)直接创建T的任何实例。

4. 委托声明的关键字是__Delegate____

5. override与重载的区别: override覆盖是基类中函数的重写。重载:方法或函数的名称相同,参数或许参数类型不同,进行多次重载实现功能。

二. 不定项选择(每题2分,共18)

Question 1

以下叙述正确的是:

A. 接口中可以有虚方法。 B. 一个类可以实现多个接口。

C. 接口不能被实例化。 D. 接口中可以包含已实现的方法。

Question 2

以下描述错误的是()

1. 在C++中支持抽象类而在C#中不支持抽象类。

2. C++中可在头文件中声明类的成员而在CPP文件中定义类的成员,在C#中没有头文件并且在同一处声明和定义类的成员。

3. 在C#中可使用 new 修饰符显式隐藏从基类继承的成员。

4. 在C#中要在派生类中重新定义基类的虚函数必须在前面加Override。

Question 3

声明一个委托public delegate int myCallBack(int x); 则用该委托产生的回调方法的原型应该是

1. void myCallBack(int x)

2. int receive(int num)

3. string receive(int x)

4. 不确定的

Question 4

下列描述错误的是()

a) 类不可以多重继承而接口可以;

b) 抽象类自身可以定义成员而接口不可以;

c) 抽象类和接口都不能被实例化;

d) 一个类可以有多个基类和多个基接口;

Question 5

下列关于构造函数的描述正确的是()

a) 构造函数可以声明返回类型。

b) 构造函数不可以用private修饰

c) 构造函数必须与类名相同

d) 构造函数不能带参数

Question 6

接口是一种引用类型,在接口中可以声明( ),但不可以声明公有的域或私有的成员变量。 a) 方法、属性、索引器和事件;

b) 方法、属性信息、属性;

c) 索引器和字段;

d) 事件和字段;

Question 7

以下的C#代码,试图用来定义一个接口:

public interface IFile

{

int A;

int delFile()

{

A = 3;

}

void disFile();

}

关于以上的代码,以下描述错误的是( )。

a) 以上的代码中存在的错误包括:不能在接口中定义变量,所以int A代码行将出现错误; b) 以上的代码中存在的错误包括:接口方法delFile是不允许实现的,所以不能编写具体的实现函数;

c) 代码void disFile();声明无错误,接口可以没有返回值;

d) 代码void disFile();应该编写为void disFile(){};

Question 8.

class Class1

{

public static int Count = 0;

static Class1()

{

Count++;

}

public Class1()

{

Count++;

}

}

Class1 o1 = new Class1();

Class1 o2 = new Class1();

请问,Class1.Count的值是多少?( )

1. 1

2. 2

3. 3

4. 4

Question 9

abstract class BaseClass

{

public virtual void MethodA()

{

Console.WriteLine("BaseClass");

}

public virtual void MethodB()

{

}

}

class Class1: BaseClass

{

public void MethodA()

{

Console.WriteLine("Class1");

}

public override void MethodB()

{

}

}

class Class2: Class1

{

new public void MethodB()

{

}

}

class MainClass

{

public static void Main(string[] args)

{

Class2 o = new Class2();

o.MethodA();

}

}

请问,此程序输出结果是:

1. BaseClass

2. BassClass Class1

3. Class1

4. Class1 BassClass

(解析,三重继承问题,孙类只是继承父类,而不是直接继承祖父类)

三.问答题(每题3分,共15分)

1. 简述 private、 protected、 public、 internal 修饰符的访问权限。

private:私有访问,它只能在声明自身的类中进行访问。

protected:表示受保护的访问,该类内部和继承类中可以访问

.public :表示公共访问,在代码任何位置都可对其进行访问

internal表示内部成员,在同一命名空间内可以访问。

2. C#中的委托是什么?事件是不是一种委托?

委托是指具有相同属性(也称具有相同的函数签名:返回类型相同,参数类型、参数顺序及参数个数相同)的函数或方法的抽象,关键字为delegate。主要用途是三个:1)函数回调;2)传递方法;3)事件机制

事件就是一个狭义的委托,也就是事件是一个用于事件驱动模型的专用委托,对事件的声明, 实际是声明一个私有的委托变量,对委托变量进行封装,即委托变量加上event关键字后,不管其前面的访问修饰符是public还是private,编译器都会将其编译为private。

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。以委托为参数的函数具有一定的通用性。

使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,是因为此变量代表一个方法),可以依次调用

本文来源:http://www.gbppp.com/jd/450956/

推荐访问:软件实施工程师面试题 java软件工程师面试题

热门文章