Java程序员面试分类模拟20_第1页
Java程序员面试分类模拟20_第2页
Java程序员面试分类模拟20_第3页
Java程序员面试分类模拟20_第4页
Java程序员面试分类模拟20_第5页
已阅读5页,还剩18页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java程序员面试分类模拟20一、单项选择题1.

以下关于关键字break的描述中,正确的是______。A.只中断最外层的循环B.只中断最内层的循环C.借助于标号,可以实现任何外层循环中断D.只(江南博哥)中断某一层的循环正确答案:C[解析]关键字break的作用是直接强行跳出当前循环,不再执行剩余部分代码。当循环中遇到break语句时,忽略循环体中任何其他语句和循环条件测试,程序控制在循环后面语句重新开始。所以,当多层循环嵌套,并且break语句出现在嵌套循环中的内层循环时,它将仅仅只是终止了内层循环的执行,而不影响外层循环的执行。

由于break只能跳出当前的循环,那么如何才能实现跳出多重循环呢?可以在多重循环的外面定义一个标识,然后在循环体里使用带有标识的break语句即可跳出多重循环。

程序示例如下:publicclassTest{publicstaticvoidmain(String[]args){out:for(inti=0;i<5;i++){for(intj=0;<5;j++){if(j>=2)breakout;System.out.println(j);}}System.out.pfintln("break");}}程序的运行结果为:01break

上例中,当内部循环执行到j等于2时,程序跳出双重循环,执行System.out.println("break")语句。

从以上分析可以看出,break可以借助标记跳出多重循环,选项C正确。

2.

有如下代码:intx=8,y=2,z;x=++x*y;z==x/y++;

在执行完后,变量x和变量y的值分别是______。A.16,3B.18,4C.18,2D.18,3正确答案:D[解析]前置自增运算符++与后置自增运算符++有本质的区别,它们的相同点都是为自身加1,不同点是前置自增运算符++是先加1,再使用操作数的值,后置自增运算符++是先使用操作数的值,再加1。

本题中,在执行语句x=++x*y的时候,首先,变量x的值变为9,然后,乘以y,y的值为2,得到x的值为18,在执行语句z=x/y++的时候,首先会执行z=x/y,运算结束后再执行y++,运行结束后y的值为3。所以,选项D正确。

3.

选项______中代码可以替换题目中//addcodehere的内容,同时不产生编译错误。publicabstractclassExample{publicintconstInt=5;//addcodeherepublicvoidmethod(){}}

A.publicabstractvoidmethod(floata);B.constInt=constInt+7;C.publicintmethod();D.publicabstractvoidmethod1(){}正确答案:A[解析]如果一个类中包含抽象方法,那么这个类就是抽象类。在Java语言中,可以通过把类或者类中的某些方法声明为abstract来表示一个类是抽象类。

只要包含一个抽象方法的类就必须被声明为抽象类,抽象类可以声明方法的存在而不去实现它,被声明为抽象的方法不能包含方法体。

对于选项A,定义了一个方法,这个方法与已有的方法有不同的参数,可以作为方法的重载。因此,选项A正确。

对于选项B,任何执行语句必须存在于一个代码块中(方法体、静态快等),不能单独存在于类的定义中。因此,选项B错误。

对于选项C,这个方法与已知的方法名以及参数相同,因此,会导致编译错误。因为无法通过返回值来进行重载。此外,这个方法没有被声明为abstract,说明它不是抽象方法,必须有方法体,但选项C的写法也没有方法体。因此,选项C错误。

对于选项D,使用关键字abstract修饰的方法为抽象方法,不能有方法体,也就是说不能有{}。因此,选项D错误。

4.

有如下代码:publicclassTest{publicstaticvoidmain(String[]args){try{return;}finally{System.out.println("Finally");}}}

上述代码的输出结果是______。A.FinallyB.编译失败C.运行时抛出异常D.代码正常运行但没有任何输出正确答案:A[解析]本题中,对于异常处理而言,即使有return语句存在,也得保证finally块中的语句能运行,所以,语句System.out.println("Finally")最终会被执行,因此,程序的运行结果为Finally。所以,选项A正确。

5.

可以完成编写一个C语言编译器的语言是______。A.汇编B.C语言C.VBD.以上全可以正确答案:D[解析]编译器的目的就是把编程语言编译成汇编语言或者机器语言,主要是词法分析、语法分析和语义分析等。从理论上讲,用任何程序设计语言都可以编写一个C语言编译器。所以,选项D正确。

所以,本题的答案为D。

6.

关于下面这段代码的描述正确的是______。

publicclassCard{

privateStringcardid;

publicStringgetCardid(){

returncardid;

}

publicvoidsetCardid(Stringcardid){

this.cardid=cardid;

}

}A.这个类不符合JavaBean的定义规则,因为没有无参数的构造方法B.这个类不符合JavaBean的定义规则,方法名setCardid应该改为setcardidC.这个类符合JavaBean的定义规则D.这个类不符合JavaBean定义的规则,因为没有实现序列化接口正确答案:D[解析]JavaBean是一种由Java语言编写的可重用组件,也就是Java类。定义一个JavaBean必须满足以下几个条件:

1)需要有一个公共的、无参数的构造方法。

2)定义实例变量为prirate,同时提供一组public存取方法(getXXX和setXXX)。例如属性name,get方法就要写成publicstringgetName(){},N大写。

3)类必须要能序列化,也就是说必须实现Serializable接口。

从上面分析可知,选项D正确。

对于选项A,当一个类没有构造方法的时候,编译器会提供一个默认的无参数的构造方法。所以,选项A错误。

对于选项B,对于属性的存取方法(getXXX和setXXX),get与set后面第一个字母为大写,因此,题目中的写法是正确的。所以,选项B错误。

7.

使i+1<i的数______。A.存在B.不存在C.不确定正确答案:A[解析]假设变量i为int类型,当i为int能表示的最大整数时,i+1就会溢出变成负数了,此时就满足i+1<i。如下例所示:publicclassTest{publicstaticvoidmain(Stringargs[]){inti=Integer.MAX_VALUE;if(i>i+1){System.out.println("存在");}}}程序输出结果为:存在

8.

在关系数据库中,用来表示实体之间联系的是______。A.树结构B.网结构C.线性表D.二维表正确答案:D[解析]关系数据库中用二维表来表示实体之间的联系。可以把数据看成一个二维表,而每一个二维表称为一个关系。所以,选项D正确。

9.

在Java语言中,下面可以用作正确的变量名称的是______。A.1xB.ageC.extendsD.implements正确答案:B[解析]对于选项A,这个名称是以数字开头的,因此,它不符合定义规则。所以,选项A错误。

对于选项B,符合定义规则。所以,选项B正确。

对于选项C和选项D,它们是Java中的关键字,extends是类继承的关键字,implements是实现接口的关键字,它们不能用来作为变量名称。所以,选项C和选项D错误。

10.

有如下代码:publicclassTest{publicintf(){return1%5;}publicstaticvoidmain(String[]args){System.out.println(f());}}

编译运行结果是______。A.编译错误B.运行错误C.正常运行,输出1D.正常运行,输出0正确答案:A[解析]在Java语言中,被声明为static的方法为静态方法,静态方法内部只能调用静态方法,不能调用非静态方法,原因是静态方法是类的方法,是不依赖于对象而存在的,在不创建对象的时候就可以调用。而非静态方法是对象的方法,只有对象被实例化后才存在。因此,当静态方法调用非静态方法的时候,就会出现编译错误。所以,选项A正确。

11.

下列不属于RTSP的方法的是______。A.OPTIONSB.CALLC.PLAYD.PALJSE正确答案:B[解析]RTSP(RealTimeStreamingProtocol,实时流传输协议)是TCP/IP协议体系中的一个应用层协议。

RTSP请求报文的方法包括OPTIONS、DESCRIBE、SETUP、TEARDOWN、PLAY、PAUSE、GETPARAMETER和SET_PARAMETER。

很显然,CALL不是RTSP的方法。所以,选项B正确。

12.

下列情况中,不能使用栈(stack)来解决问题的是______。A.将数学表达式转换为后辍形式B.实现递归算法C.高级编程语言的过程调用D.操作系统分配资源(例如CPU)正确答案:D[解析]栈的性质是先进先出。

对于选项A,后缀表达式指的是不包含括号,运算符放在两个运算对象的后面,所有的计算按运算符出现的顺序,严格从左向右进行(不再考虑运算符的优先规则),例如,对于表达式(2+1)*3,其后缀表达式为21+3*,通过定义可知,可以通过栈来实现。所以,选项A正确。

对于选项B,根据递归算法的性质可知,可以通过栈来实现。所以,选项B正确。

对于选项C,根据过程调用的性质可知,可以通过栈来实现。所以,选项C正确。

对于选项D,操作系统资源分配有多种分配策略,例如先到先执行,此时就可以使用队列来完成。

所以,选项D不正确。

所以,本题的答案为D。

13.

下面不属于SQL语句的子类的是______。A.数据查询语言(DQL)B.数据定义语言(DDL)C.事务控制语言(TCL)D.数据插入语言(DIL)正确答案:C[解析]SQL语言可以分为四大类:数据定义语言DDL(DataDefinitionLanguage)、数据查询语言DOL(DataQueryLanguage)、数据操纵语言DML(DataManipulationLanguage)以及数据控制语言DCL(DatacontrolLanguage)。

1)数据定义语言用来建立、修改和删除数据库中的对象(包括表、视图、索引等)。

2)数据查询语言主要用来检索数据库,主要是指select语句。

3)数据操纵语句是指用来改变数据库中数据的语句,主要包含insert、update和delete语句。

4)数据控制语言用于对数据库的访问,例如,①给用户授予访问权限(GRANT);②取消用户访问权限。

通过上面分析可知,选项A和选项B属于SQL语句的子类,所以,选项A与选项B错误。选项D的数据插入语言也属于数据操作语言的一种,因此,它也是SQL语句的子类,所以,选项D错误。对于选项C,事务控制语言不属于SQL语句的子类,所以,选项C正确。

14.

有如下代码:classSuper{publicIntegergetLenght(){returnnewInteger(4);}}publicclassSubextendsSuper{publicLonggetLenght(){returnnewLong(5);}publicstaticvoidmain(String[]args){Supersuper=newSuper();Subsub=newSub();System.out.println(super.getLenght().toString()+","+sub.getLenght());}}

上述代码的输出结果是______。A.4,5B.4,4C.5,4D.编译失败正确答案:D[解析]如果有两个方法的方法名相同,但参数不一致,那么一个方法是另一个方法的重载。如果在子类中定义了一个方法,其方法名称、返回值类型及参数列表正好与父类中某个方法的名称、返回值类型及参数列表一致,那么,此时子类的方法覆盖了父类的方法。

本题是典型的方法Override(覆盖),它要求子类中的方法必须与父类完全相同(相同的方法名、相同的参数列表及相同的返回值)。

对于本题而言,父类中定义了一个getLenght方法,子类中也有同样的方法,但是却有着不同的返回值,因此,编译错误。所以,选项D正确。

15.

某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数是______。A.9B.10C.11D.12正确答案:B[解析]系统不会发生死锁的最少资源数=每个进程拥有(4-1=3)个资源+多出1个资源=3*3+1=10。所以,选项B正确。

16.

设某棵二叉树中有360个结点,则该二叉树的最小高度是______。A.7B.9C.10D.8正确答案:B[解析]本题中的二叉树并没有说明到底是一棵什么类型的二叉树(完全二叉树、满二叉树、普通二叉树还是其他二叉树),所以,其高度存在不确定性。

定义二叉树中的结点总数为n,当每个结点只有一棵子树的时候,其高度值最大,为n。当该二叉树为完全二叉树时,其高度值最小,为(其中符号表示取下整),其他情况的二叉树的高度都是介于这两个值之间,即,不大于最大值也不小于最小值。

本题中要想求二叉树的最小高度,那么此时该二叉树为完全二叉树,其对应的高度为。所以,选项B正确。

17.

在进程间通信的方式中,访问速度最快的是______。A.管道B.消息队列C.共享内存D.套接字正确答案:C[解析]共享内存就是映射一段能被其他进程所访问的内存,这段内存由一个进程创建,但多个进程都可以访问。共享内存是最快的进程间通信的方式,它是针对其他进程间通信方式运行效率低而专门设计的。所以,选项C正确。

18.

新建一个流对象,下面代码中,描述错误的是______。A.newBufferedWriter(newFileWriter("d.txt"));B.newBufferedReader(newFilelnputStream("d.dat"));C.newObjectInputStream(newFilelnputStream("d.dat"));D.newGZlPOutputStream(newFileOutputStream("d.zip"));正确答案:B[解析]本题中,选项A、选项C、选项D的方法写法都是正确的,只有选项B的方法写法不正确。BufferedReader是Reader的一个子类,具有缓冲的作用,避免了频繁地从物理设备中读取信息。它有以下两个构造函数:

1)BufferedReader(Readerin)

2)BufferedReader(Readerin,intsz)//sz是指定缓冲区的大小

由此可见,BufferedReader类只能用来包装Reader类或其子类。因此,选项B错误。

19.

以下获取ResutlSet对象rst的第一行数据的方法中,正确的是______。A.rst.hashNext();B.rst.next();C.rst.first();D.rst.nextRow();正确答案:B[解析]ResultSet(结果集)是数据中查询结果返回的一种对象,通常通过执行查询数据库的语句生成。ResultSet对象不仅具有存储功能,还具有操纵数据的功能。

ResultSet对象具有指向其当前数据行的指针,它包含了符合SQL语句查询结果的所有行,提供了一套get方法(访问当前行的不同列)用于对这些行中数据进行访问。ResultSet的next方法用于移动到ResultSet中的下一行,使下一行成为当前行。因此,对于刚获取到的ResultSet对象,第一次调用next方法就会得到第一行的数据。所以,选项B正确。

所以,本题的答案为B。

20.

以下不是内核对象的是______。A.进程B.线程C.互斥器D.临界区正确答案:D[解析]一个内核对象就是在系统堆中占据一块空间的结构体。不同种类的内核对象用来管理操作系统中不同的资源,例如进程、线程和文件等。所有内核对象都会保存该对象的引用计数,进程对象会保存进程ID,文件对象会保存当前字节偏移量、共享模式和打开模式等。操作系统中所有内核对象都是保存在一块内存空间中的,系统上所有的进程都共享这一块内存空间。

每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。每次只允许一个进程进入临界区,进入后不允许其他进程进入。

互斥对象是一种最简单的内核对象,用它可以方便地实现对某一资源的互斥访问。而临界区并不是内核对象,而是系统提供的一种数据结构,程序中可以声明一个该类型变量,之后用它来实现对资源的互斥访问。当希望访问某一临界资源时,先将该临界区加锁(如果临界区不空闲,则等待),用完该资源后,将临界区释放。

21.

可以对对象加互斥锁的关键字是______。A.transientB.synchronizedC.serializeD.static正确答案:B

22.

用树形结构表示实体之间联系的模型是______。A.关系模型B.网状模型C.层次模型D.以上三个都是正确答案:C[解析]数据库模型是数据库管理的形式框架,用来描述一组数据的概念和定义。模型的结构部分规定了数据如何被描述(例如树、表等)。

本题中,对于选项A,关系模型是二维表,一张表即为一个关系,例如教师关系(教师编号,姓名,出生年月,性别),就像office中的电子表格excel的表格,关系模型的数据结构简单、清晰,用户理解容易,应用方便。鉴于此,当今大多数数据库系统都采用关系数据模型。所以,选项A错误。

对于选项B,网状模型是一种用网络结构表示实体类型及其实体之间联系的模型,它相当于一个有向图。与层次模型结构不同的是,在网状模型中,一个结点可以有多个双亲结点,且允许一个以上的结点无双亲。所以,选项B错误。

对于选项C与选项D,层次模型指的是使用树形结构表示实体及其之间的联系,其结构是一棵有向树,树中的每个结点代表一种记录类型,在这些结点中,有且仅有一个结点无双亲(根结点),其他结点有且仅有一个双亲结点。所以,选项C正确,选项D错误。

所以,本题的答案为C。

23.

以下关于继承的描述中,正确的是______。A.在Java语言中类只允许单一继承B.在Java语言中一个类只能实现一个接口C.在Java语言中,一个类不能同时继承一个类和实现一个接口D.在Java语言中接口只允许单一实现正确答案:A[解析]继承指的是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。在Java语言中,继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以使用父类的功能,但不能选择性地继承父类。类只允许单继承,但是为了实现类似于C++语言中多继承的特性,Java语言引入了接口的概念,虽然Java语言只允许继承一个类,但是却可以同时实现多个接口,因此,也就间接地实现了多继承。

从以上分析可知,选项A正确,选项B和选项D错误。

对于选项C,一个类只能继承一个类,在继承的同时,还可以实现多个接口。因此,选项C错误。

24.

下列的进程状态变化中,不可能发生的是______。A.运行→就绪B.运行→等待C.等待→运行D.等待→就绪正确答案:C[解析]状态不能直接从等待状态(也称为阻塞状态)跳转到运行状态,只能跳转到就绪状态。所以,选项C正确。

25.

在Java语言中,位于集合框架的顶层的接口是______。A.CollectionB.CollectionsC.ListD.Iterator正确答案:A[解析]Collection是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。实现该接口的类主要有List和Set,该接口的设计目标是为各种具体的集合提供最大化的统一的操作方式。

由此可见,选项A正确,选项C和选项D错误。

Collections是针对集合类的一个包装类,它提供一系列静态方法实现对各种集合的搜索、排序和线程安全化等操作,其中的大多数方法都是用来处理线性表。Collections类不能实例化,如同一个工具类,服务于Collection框架。因此,Collections不是一个集合框架类,选项D错误。

所以,本题的答案为A。

26.

有如下代码:publicclassTest{publicstaticvoidmain(Stringargv[]){Testh=newTest();}protectedTest(){for(inti=0;i<10;i++){System.out.println(i);}}}

当编译并运行上面程序时,输出结果是______。A.编译错误,构造方法不能被声明为protectedB.运行错误,构造方法不能被声明为protectedC.编译并运行输出0到10D.编译并运行输出0到9正确答案:D[解析]一般而言,构造方法都是被public修饰的,这个构造方法对所有的类都是可见的。当构造方法被protected修饰时,只有当前类、当前包和子类可见。当构造方法被private修饰时,该方法只对本类可见,常被用来实现单例模式。

对于本题而言,定义了一个protected的构造方法,由于main方法在这个类内部,因此,这个构造方法对main方法是可见的,故会调用这个构造方法,输出0到9。因此,选项D正确。

27.

有以下二叉树:

对其进行后序遍历的结果是______。A.丙乙丁甲戊己B.甲乙丙丁戊己C.丙丁乙己戊甲D.丙丁己乙戊甲正确答案:C

28.

有如下代码:publicclassPerson{staticintarr[]=newint[10];publicstaticvoidmain(Stringa[]){System.out.println(arr[1]);}}

下面语句正确的是______。A.编译时将产生错误B.编译时正确,运行时将产生错误C.输出零D.输出空正确答案:C

29.

Java语言是从______语言改进重新设计。A.BASICB.C++C.PascalD.Ada正确答案:B[解析]对于选项A,BASIC语言是一种为了让用户容易控制计算机开发的语言,其特点是简单易懂,且可以用解释和编译两种方法执行。

对于选项B,C++语言是一种静态数据类型检查的、支持多重编程范式的通用程序设计语言,它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。

对于选项C,Pascal语言是为提倡结构化编程而发明的语言。

对于选项D,Ada语言是美国军方为了整合不同语言开发的系统而发明的一种语言,其最大的特点是实时性,在ADA95中已加入面向对象内容。

Java语言是一种面向对象语言,从语法结构上看,与C++语言类似。所以,选项B正确。

30.

下列描述中,正确的是______。A.Java程序经编译后会产生MachineCode(机器码)B.Java程序经编译后会产生ByteCode(字节码)C.Java程序经编译后会产生DLL(动态链接库)D.以上描述都不正确正确答案:B[解析]Java语言为解释性语言,运行的过程为:源代码经过Java编译器编译成字节码(ByteCode),然后由JVM(JavaVirtualMachine,Java虚拟机)解释执行。而C/C++语言为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java语言的执行速度比C/C++语言慢,但是Java语言能够跨平台执行,而C/C++语言不能够跨平台执行。

所以,Java程序经编译后会产生ByteCode(字节码),选项B正确,而选项A、选项C和选项D描述都不正确。

二、论述题1.

为什么需要publicstaticvoidmain(String[]args)这个方法?正确答案:publicstaticvoidmain(String[]args)为Java程序的入口方法,JVM在运行程序时,会首先查找main()方法。其中,public是权限修饰符,表明任何类或对象都可以访问这个方法,static表明main()方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问,可以直接通过类名.main()直接访问,JVM在启动时就是按照上述方法的签名(必须有public与static修饰,返回值为void,且方法的参数为字符串数组)来查找方法的入口地址,若能找到,就执行;找不到,则会报错。void表明方法没有返回值,main是JVM识别的特殊方法名,是程序的入口方法。字符串数组参数args为开发人员在命令行状态下与程序交互提供了一种手段。

因为main是程序的入口方法,所以当程序运行时,第一个执行的方法就是main()方法。通常来讲,要执行一个类的方法,先必须实例化一个类的对象,然后通过对象来调用这个方法。但由于main是程序的入口方法,此时还没有实例化对象,因此在编写main()方法时就要求不需要实例化对象就可以调用这个方法,鉴于此,main()方法需要被定义成public与static。下例给出了在调用main()方法时传递参数的方法。

publicclassTest{

publicstaticvoidmain(String[]args){

for(inti=0;i<args.length;i++){

System.out.println(args[i]);

}

}

}

在控制台下,使用javacTestjava指令编译上述程序,使用javaTestarg1arg2arg3指令运行程序,程序运行结果为:

arg1

arg2

arg3

引申:

1.main()方法是否还有其他可用的定义格式?

1)由于public与static没有先后顺序关系,因此下面的定义也是合理的。

staticpublicvoidmain(String[]args)

2)也可以把main()方法定义为final。

publicstaticfinalvoidmain(String[]args)

3)也可以用synchronized来修饰main()方法。

staticpublicsynchronizedvoidmain(String[]args)

不管哪种定义方式,都必须保证main()方法的返回值为void,并有static与public关键字修饰。同时由于main()方法为程序的入口方法,因此不能用abstract关键字来修饰。

2.同一个java文件中是否可以有多个main()方法?

虽然每个类中都可以定义main()方法,但是只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法。如下例所示,创建了一个名为Test.java的文件。

classT{

publicstaticvoidmain(String[]args){

System.out.println("Tmain");

}

}

publicclassTest{

//程序入口函数

publicstaticvoidmain(String[]args){

System.out.println("Testmain");

}

}

程序运行结果为:

Testmain

常见笔试题:

Java程序中程序运行入口方法main的签名正确的有______。

A.publicstaticvoidmain(String[]args)

B.publicstaticfinalvoidmain(String[]args)

C.staticpublicvoidmain(String[]args)

D.staticpublicsynchronizedvoidmain(String[]args)

E.staticpublicabstractvoidmain(String[]args)

答案:A、B、C、D。见上面讲解。

2.

Java与C/C++有什么异同?正确答案:Java与C++都是面向对象语言,都使用了面向对象思想(例如封装、继承、多态等),由于面向对象有许多非常好的特性(继承、组合等),因此二者都有很好的可重用性。

需要注意的是,二者并非完全一样,下面主要介绍它们的不同点:

1)Java为解释性语言,其运行过程为:程序源代码经过Java编译器编译成字节码,然后由JVM解释执行。而C/C++为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。因此,Java的执行速度比C/C++慢,但是Java能够跨平台执行,而C/C++不能。

2)Java为纯面向对象语言,所有代码(包括函数、变量等)必须在类中实现,除基本数据类型(包括int、float等)外,所有类型都是类。此外,Java语言中不存在全局变量或全局函数,而C++兼具面向过程和面向过程编程的特点,可以定义全局变量和全局函数。

3)与C/C++语言相比,Java语言中没有指针的概念,这有效防止了C/C++语言中操作指针可能引起的系统问题,从而使程序变得更加安全。

4)与C++语言相比,Java语言不支持多重继承,但是Java语言引入了接口的概念,可以同时实现多个接口。由于接口也具有多态特性,因此在Java语言中可以通过实现多个接口来实现与C++语言中多重继承类似的目的。

5)在C++语言中,需要开发人员去管理对内存的分配(包括申请与释放),而Java语言提供了垃圾回收器来实现垃圾的自动回收,不需要程序显式地管理内存的分配。在C++语言中,通常都会把释放资源的代码放到析构函数中,Java语言中虽然没有析构函数,但却引入了一个finalize()方法,当垃圾回收器将要释放无用对象的内存时,会首先调用该对象的finalize()方法,因此,开发人员不需要关心也不需要知道对象所占的内存空间何时会被释放。

C++语言支持运算符重载,而Java语言不支持运算符重载。C++语言支持预处理,而Java语言没有预处理器,虽然不支持预处理功能(包括头文件、宏定义等),但它提供的import机制与C++中的预处理器功能类似。C++支持默认函数参数,而Java不支持默认函数参数。C/C++支持goto语句,而Java不提供goto语句(但Java中goto是保留关键字)。C/C++支持自动强制类型转换,这会导致程序的不安全;而Java不支持自动强制类型转换,必须由开发人员进行显式地强制类型转换。C/C++中,结构和联合的所有成员均为公有,这往往会导致安全性问题的发生,而Java根本就不包含结构和联合,所有内容都封装在类里面。

Java具有平台无关性,即对每种数据类型都分配固定长度,例如,int类型总是占据32位,而C/C++却不然,同一个数据类型在不同的平台上会分配不同的字节数。

Java提供对注释文档的内建支持,所以源码文件也可以包含它们自己的文档。通过一个单独的程序,这些文档信息可以提取出来,并重新格式化成HTML。

Java包含了一些标准库,用于完成特定的任务,同时这些库简单易用,能够大大缩短开发周期,例如,Java提供了用于访问数据库的JDBC库,用于实现分布式对象的RMI等标准库。C++则依靠一些非标准的、由其他厂商提供的库。

常见笔试题:

下列说法中,错误的有______。

A.Java面向对象语言容许单独的过程与函数存在

B.Java面向对象语言容许单独的方法存在

C.Java语言中的方法属于类中的成员(member)

D.Java语言中的方法必定隶属于某一类(对象),调用方法与过程或函数相同

答案:A、B、C。见上面讲解。

3.

如何寻找单链表的中间结点?正确答案:如何寻找单链表的中间结点?最容易想到的思路是先求解单链表的长度length,然后遍历length/2的距离即可查找到单链表的中间结点,但是此种方法需要遍历两次链表,即第一次遍历求解单链表的长度,第二次遍历根据索引获取中间结点。

如果是双向链表,可以首尾并行,利用两个指针一个从头到尾遍历,一个从尾到头遍历,当两个指针相遇时,就找到了中间元素。以此思想为基础,如果是单链表,也可以采用双指针的方式来实现中间结点的快速查找。

具体而言,第一步,有两个指针同时从头开始遍历;第二步,一个快指针一次走两步,一个慢指针一次走一步;第三步,快指针先到链表尾部,而慢指针则恰好到达链表中部(快指针到链表尾部时,当链表长度为奇数时,慢指针指向的即是链表中间指针,当链表长度为偶数时,慢指针指向的结点和慢指针指向结点的下一个结点都是链表的中间结点)。

具体实现代码如下:

publicNodeSearchMid(Nodehead){

Nodep=this.head;

Nodeq=this.head;

while(p!=null&&p.next!=null&&p.next.next!=null){

p=p.next.next;

q=q.next;

}

returnq;

4.

关键字static的作用是什么?正确答案:关键字static主要有两种作用:第一,为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下可以通过类来直接调用方法或使用类的属性。具体而言,static在Java语言中主要有四种使用情况:成员变量、成员方法、代码块和内部类。以下将分别对这4种情况进行介绍。

(1)static成员变量

虽然Java语言中没有全局的概念,但可以通过static关键字来达到全局的效果。Java类提供了两种类型的变量:用static关键字修饰的静态变量和没有static关键字的实例变量。静态变量属于类,在内存中只有一个副本(所有实例都指向同一个内存地址),只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此,就可以被使用了。对静态变量的引用有两种方式,分别为“类.静态变量”和“对象.静态变量”。

实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个副本。只能用“对象.静态变量”的方式来引用。以下是静态变量与实例变量的使用例子。publicclassTestAttribute{publicstaticintstaticInt=0;publicintnonStaticInt=0;publicstaticvoidmain(String[]args){TestAttributet=newTestAttribute();System.out.println("t.staticInt="+t.staticInt);System.out.println("TestAttribute.staticInt="+TestAttribute.staticInt);System.out.println("t.nonStaticInt="+t.nonStaficInt);System.out.println("对静态变量和实例变量分别+1");t.staticInt++;t.nonStaticInt++;TestAttfibutet1=newTestAttribute();System.out.pfintln("t1.staticInt="+t1.staticInt);System.out.pfintln("TestAttribute.staticInt="+TestAttribute.staticInt);System.out.println("t1.nonStaticInt="+t1.nonStatictnt);}}上例的运行结果为:t.staticInt=0TestAttribute.staticInt=0t.nonStaticInt=0对静态变量和实例变量分别+1t1.staticInt=1TestAttribute.staficInt=1t1.nonStaticInt=0从上例可以看出,静态变量只有一个,被类拥有,所有的对象都共享这个静态变量,而实例对象是与具体对象相关的。需要注意的是,与C++语言不同的是,在Java语言中,不能在方法体中定义static变量。(2)static成员方法与变量类似,Java类同时也提供了static方法与非static方法。static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用。static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用的时候,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量。static的一个很重要的用途是实现单例模式。单例模式的特点是该类只能有一个实例。为了实现这一功能,必须隐藏类的构造方法,即把构造方法声明为private,并提供一个创建对象的方法。由于构造对象被声明为private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把创建对象的方法声明为static。程序示例如下:classSingleton{privatestaticSingleto

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论