计算机二级Java语言程序设计基础选择题全面解析
一、Java基础语法选择题
1. Java标识符规则
题目:下列哪个是合法的Java标识符?
- A. 123var
- B. _name
- C. public
- D. class
解析:
- 正确答案:B
Java标识符规则:
- 不能以数字开头(A错误)
- 不能是关键字(C、D错误)
- 可以包含字母、数字、下划线和$符号
- 建议采用驼峰命名法
2. 基本数据类型
题目:下列哪个不是Java的基本数据类型?
- A. int
- B. boolean
- C. String
- D. double
解析:
- 正确答案:C
Java 8种基本数据类型:
- 整型:byte(1), short(2), int(4), long(8)
- 浮点:float(4), double(8)
- 字符:char(2)
- 布尔:boolean(1)
- String是引用类型,属于java.lang包
二、面向对象选择题
3. 类与对象
题目:关于类和对象,说法错误的是:
- A. 类是对象的模板
- B. 对象是类的实例
- C. 一个类只能创建一个对象
- D. 类包含属性和方法
解析:
- 正确答案:C
类与对象关系:
- 类是蓝图,对象是具体实例
- 一个类可以创建多个对象
- 类包含成员变量(属性)和方法
4. 继承与多态
题目:关于继承说法正确的是:
- A. Java支持多重继承
- B. 子类可以继承父类的私有成员
- C. final类可以被继承
- D. 子类可以重写父类非私有方法
解析:
- 正确答案:D
继承要点:
- Java只支持单继承(A错误)
- 私有成员不能被继承(B错误)
- final类不能被继承(C错误)
- 方法重写遵循"两同两小一大"原则
三、异常处理选择题
5. 异常分类
题目:下列哪个不是RuntimeException?
- A. NullPointerException
- B. ArrayIndexOutOfBoundsException
- C. IOException
- D. ArithmeticException
解析:
- 正确答案:C
异常体系:
RuntimeException:运行时异常,不强制捕获
- NullPointerException
- ArrayIndexOutOfBoundsException
- ArithmeticException
Checked Exception:必须处理
- IOException
- SQLException
6. try-catch-finally
题目:关于finally块说法错误的是:
- A. 无论是否发生异常都会执行
- B. 通常用于释放资源
- C. 可以没有catch块单独存在
- D. finally中的return会覆盖try中的return
解析:
- 正确答案:C
finally要点:
- 必须与try一起使用
- System.exit(0)会阻止finally执行
- 返回值以finally中的为准
四、集合框架选择题
7. List与Set
题目:下列哪个集合允许重复元素?
- A. HashSet
- B. TreeSet
- C. ArrayList
- D. HashMap
解析:
- 正确答案:C
集合特性:
- List:有序可重复(ArrayList, LinkedList)
- Set:无序不重复(HashSet, TreeSet)
- Map:键值对(HashMap, TreeMap)
8. 泛型使用
题目:正确使用泛型的语句是:
- A. List list = new ArrayList();
- B. List
list = new ArrayList - C. List
- D. List
list = new ArrayList<>();
解析:
- 正确答案:D
泛型规则:
- 前后泛型类型必须一致
- Java 7+支持菱形语法(<>)
- 泛型擦除机制
五、IO流选择题
9. 字节流与字符流
题目:处理文本文件应该优先使用:
- A. FileInputStream
- B. FileOutputStream
- C. FileReader
- D. ObjectOutputStream
解析:
- 正确答案:C
IO流选择:
- 字节流:InputStream/OutputStream(处理二进制)
- 字符流:Reader/Writer(处理文本)
- 缓冲流提高效率(BufferedReader)
10. 序列化条件
题目:要使类可序列化需要:
- A. 实现Cloneable接口
- B. 实现Serializable接口
- C. 实现Runnable接口
- D. 实现Comparable接口
解析:
- 正确答案:B
序列化要点:
- 实现Serializable接口(标记接口)
- transient修饰的变量不被序列化
- serialVersionUID用于版本控制
六、备考建议
重点掌握:
- Java基础语法(数据类型、运算符、流程控制)
- 面向对象特性(封装、继承、多态)
- 异常处理机制
- 集合框架使用
- 基础IO操作
做题技巧:
- 排除法优先
- 注意绝对化表述("必须"、"所有"等)
- 关注题目中的关键字
常见易错点:
- ==与equals的区别
- 基本类型与包装类
- 字符串不可变性
- 集合遍历时的并发修改
模拟练习:
// 典型考题示例 String s1 = "hello"; String s2 = new String("hello"); System.out.println(s1 == s2); // false System.out.println(s1.equals(s2)); // true
由于数据的集成性使得数据可为多个应用所共享,特别是在网络发达的今天,数据库与网络的结合扩大了数据关系的应用范围。数据的共享自身又可极大地减少数据冗余性,不仅减少了不必要的存储空间,更为重要的是可以避免数据的不一致性。所谓数据的一致性是指在系统中同一数据的不同出现应保持相同的值,而数据的不一致性指的是同一个数据在系统的不同拷贝处有不同的值。
本题答案是A。
本题考查的是数据模型。
层次模型是最早发展起来的数据库模型,它的基本结构是树形结构。
故本题答案为C。
E-R图中用矩形表示实体集,用椭圆表示属性,用菱形表示联系。正确答案是A
软件设计中通常采用结构化设计方法,模块的独立程度是评价设计好坏的重要度量标准。耦合性与内聚性是模块独立性的两个定性标准。内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量;耦合性是模块间互相连接的紧密程度的度量。一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。正确答案是B
内聚性:内聚性是一个模块内部各个元素间彼此结合的紧密程度的度量。耦合性:耦合性是模块间互相连接的紧密程度的度量。因此选项C、D是错误的。在程序结构中,各模块的内聚性越强,则耦合性越弱。一般较优秀的软件设计,应尽量做到高内聚,低耦合,即减弱模块之间的耦合性和提高模块内的内聚性,有利于提高模块的独立性。因此选项A是错误的,应该降低耦性合提高内聚性,所以选项B是正确的。
故本题答案为B。
结构化程序设计方法的主要原则可以概括为自顶向下,逐步求精,模块化,限制使用goto语句。
故本题答案为A。
数据库管理系统是数据库的机构,它是一种系统软件,负责数据库中的数据组织、数据操纵、数据维护、控制及保护和数据服务等。
故本题答案为B。
关于软件测试的目的,Grenford J. Myers在《The Art of Software Testing》一书中给出了深刻的阐述:软件测试是为了发现错误而执行程序的过程;一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例;一个成功的测试是发现了至今尚未发现的错误的测试。整体来说,软件测试的目的就是尽可能多地发现程序中的错误。
故本题答案为A。
关于软件测试的目的,Grenford J. Myers在《The Art of Software Testing》一书中给出了深刻的阐述:软件测试是为了发现错误而执行程序的过程;一个好的测试用例是指很可能找到迄今为止尚未发现的错误的用例;一个成功的测试是发现了至今尚未发现的错误的测试。整体来说,软件测试的目的就是尽可能多地发现程序中的错误。
故本题答案为D。
结构图的深度表示控制的层数。如图所示在系统中包含功能1、功能2……功能n,其中功能1又包含2个子功能。该系统结构共三层,系统深度就为3。
故本题答案为C。
本题考的是Java语言的特点。
过去的高级语言大多数是面向过程的语言,它的缺点是问题的解决与程序是一对一的关系,问题如有任何一点变更,程序也随之要修改。
而面向对象的语言将客观世界看成由各种对象组成,对象客观实体可定义成大的结构-类(class),每个类有自己的特性(属性)和操作(方法)。面向对象技术使复杂的问题可以分解化,大大提高了软件的重用性。与其他面向对象语言相比,Java利用面向对象技术更彻底。它把所有的Java应用和Applet都看做对象,按类封装,其封装性实现了模块化和信息隐藏,继承性实现了代码重用,让用户可以自由地定义数据类型,建立自己的类库。
故本题答案为A。
本题考查的是布局管理器。
Frame继承自java.awt.window类,它们都在java.awt包中,对于Frame而言,其默认的布局管理器为BorderLayout。采用FlowLayout时,当容器内一行中构件布满后,将自动从下行开始;采用BorderLayout,将窗体分成东、南、西、北、中五个部分,在每个部分中可以放置一个构件;采用GridLayout布局时,将以m*n的网格的形式来显示容器中的构件,每个网格中可以放置一个构件;采用CardLayout时将为构件提供卡式界面。另外还有GridBag Layout布局管理器。
故本题答案为B。
本题考的是Java语言的特点。
Java解释器采用生成与体系结构无关的字节代码指令的技术,只需安装Java运行系统,就可保证Java程序可以在网络的任何地方运行,即同一个Java程序可在不同的处理器上运行,这就是Java的跨平台的特点,此特点保证了软件的可移植性。
故本题答案为D。
本题考的是Java程序结构。
Java规定,源文件名与程序类名必须相同,其扩展名为.java,源文件中最多只能有一个public类,其他类的个数不限。且Java是区分大小写的。
故本题答案为B。
本题考的是Java的简单数据类型。
整型常量分3种书写格式:
(1)十进制整数,如189,-360。
(2)八进制整数,以0开头,如012表示十进制的10。
(3)十六进制整数,以0x或0X开头,如0x123表示十进制数291。
另外选项B的书写格式表示科学计算,E是指数符。
故本题答案为D。
本题考的是运算符。
"?:"是条件运算符,条件运算符是三元运算符。
三元条件表达式的一般形式为:
expressinon1?expression2:expression3
其中表达式expression1应该是关系或布尔表达式,其计算结果为布尔值。如果该值为true,则计算表达式expression2,并将计算结果作为整个表达式的结果;如果为false,则计算表达式expression3,将计算结果作为条件表达式的结果。
故本题答案为A。
本题考查的是算术运算符。
首先说明一点,在Java语言中,取模运算符%,其操作数可以为浮点数。
对于二元算术运算符,其表达式结果的类型归纳为以下几类情况:
(1)操作数全为整型,那么,只要其中有一个为long型,则表达式结果为long型。
(2)两个操作数全是byte型或short型,表达式结果也为int型。
(3)操作数为浮点型,只要其中有一个为double型,表达式结果就是double型。
(4)两个操作数全是float型或其中一个是float型,而另外一个是整型,则表达式结果为float型。
故本题答案为B。
本题考查的是赋值运算符。
赋值运算符(=)把一个表达式赋给一个变量,在赋值运算符两侧不一致的情况下,如果左侧变量类型的级别高,则右侧的数据被转化为与左侧相同级别的数据类型后赋给左侧变量;否则,需要使用强制类型转换运算符。
本题中选项D右侧433为int型,而左侧是比它级别低的byte型,且byte型的数据范围是-128~+127,所以此选项不正确。
故本题答案为D。
本题考查的是条件语句。
if-else if结构:
if(条件1)
statement1;或{block1}
else if(条件2)
statement2;或{block2}
……
else if(条件N)
statementN;或{blockN}
[else
statementN+1;或{blockN+1}]
执行过程如下:
判断条件1:结果为真,执行statement1;或{block1},执行完直接跳到statementN+1;或{blockN+1}下面的语句继续执行;结果为假,判断条件2:结果为真,执行statement2;或{block2},执行完直接跳到statementN+1;或{blockN+1}下面的语句继续执行;结果为假,判断条件3……判断条件N:结果为真,执行statementN;或{blockN},否则执行statementN+1;或{blockN+1}。
本题当x>0,输出Hello;
x<=0,判断第一个else后面的if条件;
x<=0&x>-3,输出Nice to meet you!;
x<=-3,输出How are you?
故本题答案为C。
本题考查的是main()方法的组成。
main()方法是一个特殊的方法,它是所有的Java Application程序执行的入口点,所以任何一个Java Application方法必须有且只能有一个main()方法,而且这个main()方法的方法头必须按照下面的格式书写:
public static void main(String args[])
或public static void main(String[] args)
因为对于一个方法来讲,它是由方法头和方法体组成,其中方法头的一般格式如下:
修饰符1 修饰符2 ……返回值类型 方法名(形式参数列表)throw[异常列表]
所以,main()方法头中的public、static属于修饰符,void是返回类型,main为方法名,String args[]是形式参数。
故本题答案为C。
本题考查的是内部类。
在Java中经常使用内部类,但一般采用内部类的原因有以下几点:
1、内部类的对象可以访问外部类的成员和方法。
2、实现事件监听时,采用内部类、匿名类容易实现。
3、编写事件驱动程序,内部类很方便。
本题中,不存在内部类对外部类的数据访问,故A是错的;同样也不存在同一包内其它类访问该内部类的问题,故选项C也是错的;又因为ActionListener事件监听器在Java中无事件适配器,所以此内部类不可能用于生成事件适配器。
故本题答案为B。
本题考查的是数组大小的调整。
Java语言中用一种特殊的类-java.util.ArrayList(数组列表)在运行时动态调整数组的大小。ArrayList类在定义数组时,不必限定数组的大小。
故本题答案为C。
本题考查的是接口的概念。
接口是不包含成员变量和方法实现的抽象类,它只包含常量和方法的定义。接口的主要功能是:
(1)不管类的层次,可实现互不相关的类具有相同的行为。
(2)通过接口说明多个类所需实现的方法。
(3)通过接口可以了解对象的交互界面,无需了解对象所对应的类。
所以选项A、B、C都是正确的叙述。另外,由于接口不包括任何实现,所以与存储空间没有任何关系。所以选项D的叙述是错误的。
故本题答案为D。
本题考查的是类的继承。
对一个类的继承是指在现有类(父类)的基础上构建一个新类(子类),子类重用(继承)了父类的方法和状态,同时还可以向新类中增添新的方法和状态。Java中创建子类是通过在类声明中加入extends子句来实现的。
故本题答案为B。
本题考查的是窗体的方法。
windowOpened是打开窗体后将要执行的方法。windowClosed是关闭窗体后将要执行的方法,windowClosing是在关闭窗体时要执行的方法,该方法可以执行窗体的关闭功能。windowDeactivated是窗体处于非激活时将会执行该方法。因此windowClosing是可以实现窗口关闭操作的方法。
故本题答案为C。
本题考查的是Applet的基础知识。
Applet是一类非常重要的Java程序,一般来说其嵌入在HTML语言中,它与Application不同之处在于,它必须要通过其它程序调用执行,本身不能被直接解释执行,故A是错的。Applet是java.applet.Applet的子类,如果其采用了swing构件,则是javax.swing.JApplet的子类,在HTML中可以通过<PARAM>标记向Applet传递参数。
故本题答案为A。
本题考查的是Applet生命周期概念。
在Applet程序序中有如下几个方法与其生命周期相关:init()方法用来在加载Applet时完成初始化工作;start()方法用来启动Applet的执行;stop()用来停止Applet的执行,例如,用户离开Applet页面或浏览器;destroy()用来完成撤消清理工作,准备卸载。因此在与Applet生命周期相关的方法的数量为四个。
故本题答案为A。
本题考查的是正则表达式。
正则表达式必须对字符串进行匹配,因此选项A是错误的,对于任一二进制串,正则表达式也无法匹配,对于一个回文字串,正则表达式无法匹配,故选取项A、B、C也都是错误的,对于一个公式,由于其符合3型文法标准,故必能与正则表达式相匹配。
故本题答案为D。
本题考查的是线程的相关知识。
Java的线程调度策略是一种基于优先级的抢先式调度。这种调度策略的含义是:Java基于线程的优先级选择高优先级的线程进行运行。该线程(当前线程)将持续运行,直到它中止运行或其它更高优先级程成为可运行时。所以选项C的叙述是正确的。在线程的几种基本控制方法中,sleep()方法使比其低的优先级线程运行;yield()方法只让给同优先级运行。所以选项A、B的叙述均是正确的。
抢先式调度可能是分时的,即每个池中的轮流运行;也可能不是,即线程逐个运行。所以即使具有相同优先级的多个线程的调度也不一定是分时的,它的运行方式是由具体JVM而定的。
故本题答案为D。
本题考查的是线程状态与生命周期。
线程的生命周期主要分为如下几个状态:新建状态、可运行状态、运行状态、阻塞状态、终止状态。
假设当前线程处于运行状态,则会改变线程当前状态的操作总结如下:
(1)当前线程执行了yield(),或当前线程因调度策略(执行过程中,有一个更高优先级的线程进入可运行状态,这个线程立即被调度执行,当前线程占有的CPU被抢占;或在分时方式时,当前执行线程执行完当前时间片)从而导致当前线程进入可运行状态。
(2)线程调用了sleep()方法、join()方法、wait()方法时,线程进入阻塞状态。
其中yield()方法的作用是暂停当前线程的执行,从而允许与它具有相同优先级的线程执行,如果不存在可执行且与它同优先级的线程,则继续执行当前线程。
当某线程需要在synchronized块中等待共享数据状态改变时,调用wait()方法,这样该线程等待并暂时释放共享数据对象的锁,其它线程可以获得该对象的锁,并进入synchronized块对共享数据进行操作,而此线程则放入wait pool中,转入阻塞状态,当其它线程对共享数据操作完后,只要调用notify()方法就可以通知正在等待的线程重新占有锁,并运行。
sleep方法的作用是让当前线程处于休眠状态,并持续一定的时间,该时间的长短由sleep()方法的参数决定。sleep()方法结束后,线程将进入可运行状态。
所以对选项A、B、C的调用都会改变线程生命周期中的状态,而isAlive()方法的作用是测试线程,以确定线程是否活着。此方法并不会改变线程生命周期中的状态。
故本题答案为D。
本题考查的是方法参数列表的格式。
参数列表的各项间用逗号隔开,每项中包含类型及变量两部分,因此选项B,D是错误的,由于在方法的主体中出现了out实例,但没有它的定义存在,所以其定义应该在参数列表中。
故本题答案为C。
本题考查的是逻辑运算符。
由于逻辑运算符"&&"采用的是"短路"方式进行计算的,即若左边表达式为false,则不会再对运算符右边的表达式求值,整个逻辑表达式的结果确定为false。所以对于a&&b,由于a的值为false,所以不需要考虑b的值,直接返回a&&b这个表达式的值为false;而对于整个表达式,又是一个关于&&的运算,所以对整个表达式的值的运算继续采用"短路"的方法,返回false,故布尔型变量c的值为false。
对于result的结果,由于两个"&"运算符的两侧均为布尔值,故在这里"&"是布尔逻辑运算符,其与普通的逻辑运算符&&相比较,除了&&会发生短路外,其余功能都是相同的。在执行a&b操作时,false & true=false,!b=false,false & false=false,故reslut=false。
故本题答案为A。
本题考查的是Matcher类。
在J2SE1.4中的正则表达式包中存在一个匹配器类。该类用于将一个输入字符串与模式串进行比较,在这个类中通过matches方法用来对输入字符串与模式串的比较,如果匹配成功则返回true否则返回false;matcher.find()方法用来寻找下一模式匹配串;matcher.start()用来返回匹配串的一个起始索引整数值;matcher.end()用来返回匹配串的终止索引整数值。
故本题答案为A。
本题考查的是线程的同步问题。
对象锁在如下几种情况下由持有线程返还:
(1)当synchronized()语句块执行完后。
(2)当在synchronized()语句块中出现例外(exception)。
(3)当持有锁的线程调用该对象的wait()方法。此时该线程将释放对象的锁,而被放入对象的wait pool中,等待某事件的发生。
而suspend()方法只是基本线程控制方法,在一个线程中调用t.suspend(),将使t暂停执行,要想恢复线程,必须由其他线程调用t.resume()恢复t的执行。
故本题答案为B。
本题考查的是Applet的安全限制。
在Java1.0中,沙箱对Applet限制根本无法排除,而在Java2中可以通过策略文件来授予Applet所需的权限,该文件可以通过文本编辑器进行编辑,也可以通过图形化工具来编辑。
故本题答案为C。
本题考查的是多线程。
该程序实现了线程的创建。
在JAVA中,创建线程的方法有两种:一种是通过创建Thread类的子类来实现,另一种方法是通过实现Runnable接口的类来实现。
通过继承Thread类实现多线程的方法是首先设计Thread的子类,然后根据工作需要重新设计线程的run方法,再使用start方法启动线程,将执行权转交到run。
本题中,程序虽然继承了Thread类,并且重写了run方法,但是语句"Thread t=new Thread();"调用的还是Thread类的run方法,所以,程序通过编译,且运行正常,但没有任何输出。
如果想要打印出一个"Hello",则需要将语句"Thread t=new Thread();"修改为"Thread t=new Test();"。
故本题答案为C。
本题考查的是多线程。
线程的创建有两种方法:实现Runnable接口和继承Thread类。
通过实现Runnable接口创建线程:当实现Runnable接口的类的对象用来创建线程后,该线程的启动将使得对象的run()方法被调用。通过这种方式创建线程的过程是:Runnable的一个实例作为参数传递给Thread类的一个构造方法,该实例对象提供线程体run()。
故本题答案为B。
本题考查的是循环嵌套。
本程序中定义了一个int型的多维数组data[][],程序中利用for循环"for(int i=0;i<data.length;i++)"判断并输出数组data[][]中的元素,当变量i的值不小于数组长度(数组长度为3)时,循环终止。循环中的判断语句"if(i%2==0)"用于判断输出的元素,符合条件则输入"data[i][4] "。
循环运行过程如下:
第1轮:当i=0时,i%2==0,条件为真,输出"data[i][4] ":5 ;
第2轮:当i=1时,i%2==0,条件为假,不执行输出语句;
第3轮:当i=2时,i%2==0,条件为真,输出"data[i][4] ":555 ;
第4轮:当i=3时,i<data.length条件不满足,退出循环。
故本题答案为A。
本题考查的是线程的基本控制。
当线程完成运行并结束后,将不能再运行。除线程正常运行结束外,还可用其他方法控制其停止。可以用stop()方法强行终止线程,但不提倡使用这种方法,容易造成线程的不一致。可以使用标志flag,通过设置flag通知一个线程应该结束。
故本题答案为B。
本题考查的是并发控制。
Java中对共享数据操作的并发控制是采用传统的封锁技术。一个程序中单独的、并发的线程对同一个对象进行访问的代码段,称为临界区。在Java语言中,临界区可以是一个语句块或是一个方法,并且用"synchronized"关键字标识。
故本题答案为C。
通过系统梳理这些基础选择题考点,结合代码实践和模拟练习,可以有效提升Java二级考试的通过率。建议考生在备考过程中多动手编写测试代码,加深对知识点的理解记忆。