版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java备考练习题及答案一、基础语法与变量1.分析以下代码的输出结果,并说明原因:```javapublicclassVariableTest{staticintstaticVar=10;intinstanceVar=20;publicstaticvoidmain(String[]args){VariableTestobj1=newVariableTest();VariableTestobj2=newVariableTest();obj1.staticVar=30;obj1.instanceVar=40;System.out.println("obj1.staticVar="+obj1.staticVar+",obj1.instanceVar="+obj1.instanceVar);System.out.println("obj2.staticVar="+obj2.staticVar+",obj2.instanceVar="+obj2.instanceVar);System.out.println("VariableTest.staticVar="+VariableTest.staticVar);}}```答案:输出结果为:obj1.staticVar=30,obj1.instanceVar=40obj2.staticVar=30,obj2.instanceVar=20VariableTest.staticVar=30原因:`staticVar`是静态变量(类变量),属于类本身,所有实例共享同一个静态变量的存储空间。因此,通过`obj1`修改`staticVar`后,`obj2`和类直接访问的`staticVar`都会同步变化。而`instanceVar`是实例变量,每个对象独立存储,修改`obj1`的`instanceVar`不会影响`obj2`的`instanceVar`(默认初始化为20)。2.写出以下代码的输出结果:```javapublicclassOperatorTest{publicstaticvoidmain(String[]args){inta=5;intb=a+++++a;intc=a-----a;System.out.println("a="+a+",b="+b+",c="+c);}}```答案:输出结果为:a=4,b=12,c=2解析:-`a++`是先取值后自增:初始a=5,`a++`取值5,a变为6;-`++a`是先自增后取值:a=6自增为7,取值7;因此`b=5+7=12`,此时a=7。-`a--`先取值后自减:a=7取值7,a变为6;-`--a`先自减后取值:a=6自减为5,取值5;因此`c=7-5=2`,此时a=5自减后变为4(注意:`a--`后a=6,`--a`后a=5,最后输出a=5-1=4?不,正确步骤:执行`a--`时,a=7→取值7→a=6;执行`--a`时,a=6→自减为5→取值5;所以c=7-5=2,此时a=5。但后续无操作,最终输出a=5?这里可能计算错误,需重新推导:初始a=5:-执行`b=a+++++a`:第一步`a++`:表达式值为5,a变为6;第二步`++a`:a先自增为7,表达式值为7;所以b=5+7=12,此时a=7。-执行`c=a-----a`:第一步`a--`:表达式值为7,a变为6;第二步`--a`:a先自减为5,表达式值为5;所以c=7-5=2,此时a=5。最终输出a=5,b=12,c=2。(原答案可能笔误,正确输出应为a=5)---二、面向对象编程3.写出以下代码的输出结果,并解释多态的实现过程:```javaclassAnimal{publicvoidsound(){System.out.println("Animalmakessound");}publicstaticvoidrun(){System.out.println("Animalruns");}}classDogextendsAnimal{@Overridepublicvoidsound(){System.out.println("Dogbarks");}publicstaticvoidrun(){System.out.println("Dogrunsfast");}}publicclassPolymorphismTest{publicstaticvoidmain(String[]args){Animalanimal=newDog();animal.sound();//①animal.run();//②Dogdog=(Dog)animal;dog.run();//③}}```答案:输出结果为:DogbarksAnimalrunsDogrunsfast解析:-①处:`sound()`是实例方法,多态生效。编译时类型为`Animal`,运行时类型为`Dog`,调用`Dog`重写的`sound()`。-②处:`run()`是静态方法(类方法),静态方法的调用只与编译时类型有关(绑定于类)。`animal`的编译类型是`Animal`,因此调用`Animal.run()`。-③处:`dog`的编译类型是`Dog`,直接调用`Dog`的静态方法`run()`。4.分析抽象类与接口的区别(至少列出5点)。答案:抽象类与接口的核心区别:-定义关键字:抽象类用`abstractclass`,接口用`interface`。-成员变量:抽象类可以有普通成员变量(实例/静态),接口的变量默认是`publicstaticfinal`(必须初始化)。-方法实现:抽象类可以有抽象方法(无实现)和具体方法(有实现);Java8前接口只能有抽象方法,Java8后支持默认方法(`default`)和静态方法。-继承关系:类只能单继承抽象类,但可以实现多个接口;接口可以继承多个接口(多继承)。-设计目的:抽象类用于抽取子类的公共行为("is-a"关系);接口用于定义规范("can-do"关系)。-构造方法:抽象类可以有构造方法(用于子类初始化),接口不能有构造方法。---三、异常处理5.分析以下代码的输出结果,并说明`finally`块的执行规则:```javapublicclassExceptionTest{publicstaticvoidmain(String[]args){System.out.println(testFinally());}publicstaticinttestFinally(){intresult=1;try{result=2;returnresult;}catch(Exceptione){result=3;returnresult;}finally{result=4;System.out.println("Finallyblockexecuted");}}}```答案:输出结果为:Finallyblockexecuted2解析:-`try`块中无异常,执行`returnresult`前会先执行`finally`块。-`finally`块中修改了`result`的值为4,但`try`中的`return`语句在进入`finally`前已将`result`的值(2)保存到返回栈中,因此`finally`的修改不影响返回结果。-最终返回的是`try`块中保存的2,而`finally`块的输出会在返回前执行。6.自定义一个检查型异常(CheckedException)`AgeInvalidException`,要求当用户输入年龄小于0或大于150时抛出该异常,并编写一个示例方法验证。答案:```java//自定义检查型异常(需继承Exception)classAgeInvalidExceptionextendsException{publicAgeInvalidException(Stringmessage){super(message);}}publicclassCustomExceptionDemo{publicstaticvoidvalidateAge(intage)throwsAgeInvalidException{if(age<0||age>150){thrownewAgeInvalidException("年龄无效:"+age+"(范围0-150)");}}publicstaticvoidmain(String[]args){try{validateAge(160);System.out.println("年龄有效");}catch(AgeInvalidExceptione){System.out.println("异常:"+e.getMessage());}}}```输出结果:异常:年龄无效:160(范围0-150)---四、集合框架7.简述`ArrayList`、`LinkedList`和`Vector`的区别,并说明各自的适用场景。答案:区别:-线程安全:`Vector`是线程安全的(方法用`synchronized`修饰),`ArrayList`和`LinkedList`非线程安全。-底层结构:`ArrayList`基于动态数组(Object[]),`LinkedList`基于双向链表(Node节点),`Vector`基于动态数组(与ArrayList类似但线程同步)。-性能:-随机访问(`get(i)`):`ArrayList`和`Vector`的时间复杂度为O(1)(数组下标),`LinkedList`为O(n)(需遍历链表)。-插入/删除(中间位置):`ArrayList`需移动元素(O(n)),`LinkedList`只需修改指针(O(1),但定位节点需O(n))。-扩容机制:`ArrayList`默认扩容为原容量的1.5倍,`Vector`默认扩容为原容量的2倍(可指定扩容增量)。适用场景:-`ArrayList`:需要频繁随机访问,且插入/删除多发生在末尾时使用(如数据查询)。-`LinkedList`:需要频繁在中间插入/删除元素时使用(如队列、栈的实现)。-`Vector`:需线程安全且对性能要求不高时使用(现代多线程场景更推荐`CopyOnWriteArrayList`)。8.分析以下代码向`HashSet`中添加元素的结果,并说明`HashSet`如何保证元素唯一性:```javaimportjava.util.HashSet;publicclassHashSetTest{staticclassPerson{Stringname;intage;publicPerson(Stringname,intage){=name;this.age=age;}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Personperson=(Person)o;returnage==person.age&&name.equals();}//未重写hashCode()方法}publicstaticvoidmain(String[]args){HashSet<Person>set=newHashSet<>();Personp1=newPerson("Alice",20);Personp2=newPerson("Alice",20);set.add(p1);set.add(p2);System.out.println("集合大小:"+set.size());}}```答案:输出结果为:集合大小:2解析:`HashSet`通过`hashCode()`和`equals()`共同保证元素唯一性。添加元素时,先计算元素的`hashCode`确定存储桶的位置;若桶中已有元素,再通过`equals()`比较是否相同。若相同则不添加,否则存储。本案例中,`Person`类重写了`equals()`但未重写`hashCode()`。`Object`默认的`hashCode()`返回对象的内存地址哈希值,因此`p1`和`p2`的`hashCode`不同,会被分配到不同的桶中,即使`equals()`返回`true`,`HashSet`仍会认为它们是不同的元素,导致集合大小为2。正确做法是同时重写`hashCode()`(如基于`name`和`age`计算哈希值)。---五、多线程编程9.编写一个使用`synchronized`关键字实现的线程安全的计数器类,要求包含`increment()`(计数加1)和`getCount()`(获取当前计数)方法。答案:```javapublicclassThreadSafeCounter{privateintcount=0;//同步方法保证increment()的原子性publicsynchronizedvoidincrement(){count++;}//同步方法避免脏读(保证getCount()获取最新值)publicsynchronizedintgetCount(){returncount;}}```解析:-`synchronized`修饰方法时,锁对象是当前实例(`this`)。-`increment()`和`getCount()`都被同步,确保多线程环境下,一个线程执行`increment()`时,其他线程无法同时修改或读取`count`,避免竞态条件(如丢失更新或脏读)。10.说明线程的生命周期(状态)及状态转换条件。答案:Java线程的6种状态(`Thread.State`枚举):-`NEW`(新建):线程对象创建后未调用`start()`。-`RUNNABLE`(可运行):调用`start()`后进入,包括“就绪”(等待CPU调度)和“运行中”状态。-`BLOCKED`(阻塞):线程尝试获取同步锁失败(锁被其他线程持有)时进入。-`WAITING`(无限等待):调用`Object.wait()`、`Thread.join()`(无超时)或`LockSupport.park()`后进入,需其他线程唤醒(如`notify()`)。-`TIMED_WAITING`(超时等待):调用`Thread.sleep(long)`、`Object.wait(long)`、`Thread.join(long)`(有超时)后进入,超时或被唤醒后回到`RUNNABLE`。-`TERMINATED`(终止):线程执行完毕或因异常终止。状态转换示例:`NEW`→`RUNNABLE`(调用`start()`);`RUNNABLE`→`BLOCKED`(尝试获取锁失败);`RUNNABLE`→`WAITING`(调用`wait()`无超时);`WAITING`→`RUNNABLE`(被`notify()`唤醒);`RUNNABLE`→`TIMED_WAITING`(调用`sleep(1000)`);`TIMED_WAITING`→`RUNNABLE`(超时或被唤醒);任意状态→`TERMINATED`(线程结束)。---六、IO流与文件操作11.使用JavaIO流编写程序,将当前目录下的`input.txt`文件内容复制到`output.txt`中(要求使用缓冲流提高效率)。答案:```javaimportjava.io.;publicclassFileCopyDemo{publicstaticvoidmain(String[]args){//使用try-with-resources自动关闭流(JDK7+)try(BufferedInputStreambis=newBufferedInputStream(newFileInputStream("input.txt"));BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("output.txt"))){byte[]buffer=newbyte[1024];//1KB缓冲区intlength;while((length=bis.read(buffer))!=-1){bos.write(buffer,0,length);}System.out.println("文件复制完成");}catch(IOExceptione){e.printStackTrace();}}}```解析:-`FileInputStream`和`FileOutputStream`是字节节点流,直接操作文件。-`BufferedInputStream`和`BufferedOutputStream`是缓冲处理流,内部维护缓冲区(默认8192字节),减少IO次数,提高效率。-`read(buffer)`读取字节到缓冲区,返回实际读取的字节数(-1表示结束);`write(buffer,0,length)`将缓冲区中有效数据写入输出流。12.简述Java序列化与反序列化的实现方式,并说明`transient`关键字的作用。答案:序列化(Serialization):将Java对象转换为字节序列,便于存储或传输;反序列化(Deserialization):将字节序列恢复为Java对象。实现方式:-对象需实现`Serializable`接口(标记接口,无方法)。-使用`ObjectOutputStream`的`writeObject(Objectobj)`方法序列化。-使用`ObjectInputStream`的`readObject()`方法反序列化。`transient`关键字:标记不需要序列化的字段。被`transient`修饰的字段在序列化时会被忽略,反序列化后恢复为默认值(如`int`为0,`对象`为`null`)。示例:```javaimportjava.io.;classUserimplementsSerializable{privateStringusername;privatetransientStringpassword;//密码不序列化publicUser(Stringusername,Stringpassword){this.username=username;this.password=password;}//getter/setter省略}//序列化与反序列化代码(略)```---七、反射与Lambda表达式13.通过反射机制调用一个类的私有方法(假设类名为`TargetClass`,方法名为`privateMethod`,无参数)。答案:```javaimportjava.lang.reflect.Method;classTargetClass{privatevoidprivateMethod(){System.out.println("私有方法被调用");}}publicclassReflectionDemo{publicstaticvoidmain(String[]args)throwsException{//获取Class对象Class<?>clazz=TargetClass.class;//创建实例TargetClassobj=(TargetClass)clazz.getDeclaredConstructor().newInstance();//获取私有方法(参数为方法名和参数类型数组)Methodmethod=clazz.getDeclaredMethod("privateMethod");//禁用访问检查(否则无法调用私有方法)method.setAccessible(true);//调用方法(参数为实例和方法参数)method.invoke(obj);}}```输出结果:私有方法被调用解析:-`getDeclaredMethod("privateMethod")`获取所有方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 基于PID的直流电机调速系统在控制策略课程设计
- 梅花鹿养殖技术员岗位技能考试试卷及答案
- 【一年级上册数学】每日10分钟睡前计算小纸条
- 公共场所防灾避险课件
- 电厂钢梁安装方案范本
- 幼儿遵守时间不迟到好习惯养成课堂
- 2026年中秋节假期幼儿园画一画中秋月亮
- 2026年11月感恩节 感恩身边每一个人
- 2026 年新学期:智慧校园管理平台实操培训
- 第12课 从明朝建立到清军入关 课件(共21张) 高中历史统编版(部编版)必修 中外历史纲要(上)
- 教科版(2024)三年级上册科学全册教案
- 北京市五十七中2025-2026学年上学期九年级物理开学测试(无答案)
- (正式版)DB3301∕T 0498-2025 《小型水利工程项目划分管理规范》
- T-CFLP 0016-2023《国有企业采购操作规范》【2023修订版】
- 体外膜氧合技术 (ECMO)
- 财务人员法律风险培训课件
- 几何公差教学课件
- CJ/T 158-2002城市污水处理厂管道和设备色标
- 光荣院入住协议书
- DB37T 4706-2024事故车辆损失鉴定评估规范
- 工程结算分红协议书范本
评论
0/150
提交评论