Java刷题错题集合
1. 下面论述正确的是()?
A. 如果两个对象的hashcode相同,那么它们作为同一个HashMap的key时,必然返回同样的值
B. 如果a,b的hashcode相同,那么a.equals(b)必须返回true
C. 对于一个类,其所有对象的hashcode必须不同
D. 如果a.equals(b)返回true,那么a,b两个对象的hashcode必须相同
正确答案:D 你的答案:B
hashCode方法本质就是一个哈希函数,这是Object类的作者说明的。Object类的作者在注释的最后一段的括号中写道:将对象的地址值映射为integer类型的哈希值。但hashCode()并不完全可靠的,有时候不同的对象他们生成的hashcode也会一样,因此hashCode()只能说是大部分时候可靠。
因此我们也需要重写equals()方法,但因为重写的equals()比较全面比较复杂,会造成程序效率低下,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高。因此,正常的操作流程是先用hashCode()去对比两个对象,如果hashCode()不一样,则表示这两个对象肯定不相等,直接返回false,如果hashCode()相同,再对比他们的equals()。
综上所述:
equals()相等的两个对象hashCode()一定相等。hashCode()相等的两个对象equal()不一定相等。
因此选项D正确。
2. 下面哪一项不是加载驱动程序的方法?
A. 通过DriverManager.getConnection方法加载
B. 调用方法 Class.forName
C. 通过添加系统的jdbc.drivers属性
D. 通过registerDriver方法注册
正确答案:A 你的答案:B
DriverManager.getConnection方法返回一个Connection对象,这是加载驱动之后才能进行的
3. 下面哪些选项是正确的()
A. >>是算术右移操作符
B. >>是逻辑右移操作符
C. >>>是算术右移操作符
D. >>>是逻辑右移操作符
正确答案:AD 你的答案:BC
Java中:
<<
:算术左移。>>
:算术右移。>>>
:逻辑右移。
【注】没有<<<
符号。
4. JavaWEB中有一个类,当会话种绑定了属性或者删除了属性时,他会得到通知,这个类是:( )
A. HttpSessionAttributeListener
B. HttpSessionBindingListener
C. HttpSessionObjectListener
D. HttpSessionListener;
E. HttpSession
F. HttpSessionActivationListener
正确答案:A 你的答案:B
HttpSessionAttributeListener:可以实现此侦听器接口获取此web应用程序中会话属性列表更改的通知;
HttpSessionBindingListener:当该对象从一个会话中被绑定或者解绑时通知该对象,这个对象由HttpSessionBindingEvent对象通知。这可能是servlet程序显式地从会话中解绑定属性的结果,可能是由于会话无效,也可能是由于会话超时;
HttpSessionObjectListener:没有该接口API;
HttpSessionListener:当web应用程序中的活动会话列表发生更改时通知该接口的实现类,为了接收该通知事件,必须在web应用程序的部署描述符中配置实现类;
HttpSessionActivationListener:绑定到会话的对象可以侦听容器事件,通知它们会话将被钝化,会话将被激活。需要一个在虚拟机之间迁移会话或持久会话的容器来通知所有绑定到实现该接口会话的属性。
5.在java中重写方法应遵循规则的包括()
A. 访问修饰符的限制一定要大于被重写方法的访问修饰符
B. 可以有不同的访问修饰符
C. 参数列表必须完全与被重写的方法相同
D. 必须具有不同的参数列表
正确答案:BC 你的答案:BD
总结来说为:
- 方法名相同,参数类型相同
- 子类返回类型等于父类方法返回类型,
- 子类抛出异常小于等于父类方法抛出异常
- 子类访问权限大于等于父类方法访问权限。
详细的说明为:
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。 即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常IOException,但是在重写这个方法的时候不能抛出Exception异常,因为Exception是IOException的父类,只能抛出IOException的子类异常。
方法的重写规则
- 1)参数列表必须完全与被重写方法的相同;
- 2)返回类型必须完全与被重写方法的返回类型相同;
- 3)访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
- 4)父类的成员方法只能被它的子类重写。
- 5)声明为final的方法不能被重写。
- 6)声明为static的方法不能被重写,但是能够被再次声明。
- 7)子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
- 8)子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。
- 9)重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 10)构造方法不能被重写。
- 11)如果不能继承一个方法,则不能重写这个方法。
6.一个容器类数据结构,读写平均,使用锁机制保证线程安全。如果要综合提高该数据结构的访问性能,最好的办法是______。
A. 只对写操作加锁,不对读操作加锁
B. 读操作不加锁,采用copyOnWrite的方式实现写操作
C. 分区段加锁
D. 无法做到
正确答案:C 你的答案:A
参考答案:答案:C
- A,只对写操作加锁,不对读操作加锁,会造成读到脏数据
- B,CopyOnWrite的核心思想是利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用。这里读写平均,不适用
- C,分段加锁,只在影响读写的地方加锁,锁可以用读写锁,可以提高效率
7.以下哪些jvm的垃圾回收方式采用的是复制算法回收?
A. 新生代串行收集器
B. 老年代串行收集器
C. 并行收集器
D. 新生代并行回收收集器
E. 老年代并行回收收集器
F. cms收集器
正确答案:AD 你的答案:ACEF
Serial New收集器是针对新生代的收集器,采用的是复制算法
Parallel New(并行)收集器,新生代采用复制算法,老年代采用标记整理
Parallel Scavenge(并行)收集器,针对新生代,采用复制收集算法
Serial Old(串行)收集器,新生代采用复制,老年代采用标记整理
Parallel Old(并行)收集器,针对老年代,标记整理
CMS收集器,基于标记清理
G1收集器:整体上是基于标记整理 ,局部采用复制
综上:新生代基本采用复制算法,老年代采用标记整理算法。cms采用标记清理。
8.关于下面一段代码,以下说法正确的是: ()
public class Test {
private synchronized void a() {
}
private void b() {
synchronized (this) {
}
}
private synchronized static void c() {
}
private void d() {
synchronized (Test.class) {
}
}
}
A. 同一个对象,分别调用方法a和b,锁住的是同一个对象
B. 同一个对象,分别调用方法a和c,锁住的是同一个对象
C. 同一个对象,分别调用方法b和c,锁住的不是同一个对象
D. 同一个对象,分别调用方法a、b、c,锁住的不是同一个对象
正确答案:AC 你的答案:AB
修饰非静态方法 锁的是this 对象
修饰静态方法 锁的是class对象
9.Java的Daemon线程,setDaemon( )设置必须要?
A. 在start之前
B. 在start之后
C. 前后都可以
正确答案:A 你的答案:B
setDaemon()方法必须在线程启动之前调用,当线程正在运行时调用会产生异常。
java的线程分为两类: 用户线程和daemon线程
- 用户线程: 用户线程可以简单的理解为用户定义的线程,当然包括main线程(以前我错误的认为main线程也是一个daemon线程,但是慢慢的发现原来main线程不是,因为如果我再main线程中创建一个用户线程,并且打出日志,我们会发现这样一个问题,main线程运行结束了,但是我们的线程任然在运行).
- daemon线程: daemon线程是为我们创建的用户线程提供服务的线程,比如说jvm的GC等等,这样的线程有一个非常明显的特征: 当用户线程运行结束的时候,daemon线程将会自动退出.(由此我们可以推出下面关于daemon线程的几条基本特点)
daemon 线程的特点:
守护线程创建的过程中需要先调用setDaemon方法进行设置,然后再启动线程.否则会报出IllegalThreadStateException异常.(个人在想一个问题,为什么不能动态更改线程为daemon线程?有时间一个补上这个内容,现在给出一个猜测: 是因为jvm判断线程状态的时候,如果当前只存在一个线程Thread1,如果我们把这个线程动态更改为daemon线程,jvm会认为当前已经不存在用户线程而退出,稍后将会给出正确结论,抱歉!如果有哪位大牛看到,希望给出指点,谢谢!)
由于daemon线程的终止条件是当前是否存在用户线程,所以我们不能指派daemon线程来进行一些业务操作,而只能服务用户线程.
daemon线程创建的子线程任然是daemon线程.
10.关于String、StringBuffer、StringBuilder以下说法错误的是
A. StringBuilder运行速度最快
B. StringBuffer是线程安全的
C. String的值是可变的
D. StringBuffer运行速度比String快
正确答案:C
String是final修饰的,不可变
在运行速度上StringBuffer因为兼顾了线程安全,效率不及StringBuilder
StringBuffer是线程安全的
11.对于非运行时异常,程序中一般可不做处理,由java虚拟机自动进行处理。
A. 正确
B. 错误
正确答案:B 你的答案:A
Java异常都继承自类Throwable,Throwable子类有Error和Exception,其中Exception又分为运行时异常和编译时异常。编译时异常是未雨绸缪性质的异常,是防范,需要显示处理。运行时异常是程序员问题造成,并不强制进行显示处理。
12. 关于匿名内部类叙述正确的是? ( )
A. 匿名内部类可以继承一个基类,不可以实现一个接口
B. 匿名内部类不可以定义构造器
C. 匿名内部类不能用于实参
D. 以上说法都不正确
正确答案:B
巧记:由于构造器的名字必须与类名相同,而匿名类没有类名,所以匿名类不能有构造器。
在使用匿名内部类的过程中,我们需要注意如下几点:
- 使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或者实现一个接口。
- 匿名内部类中是不能定义构造函数的。
- 匿名内部类中不能存在任何的静态成员变量和静态方法。
- 匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
- 匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
13.当你编译和运行下面的代码时,会出现下面选项中的哪种情况?
public class Pvf{
static boolean Paddy;
public static void main(String args[]){
System.out.println(Paddy);
}
}
A. 编译时错误
B. 编译通过并输出结果false
C. 编译通过并输出结果true
D. 编译通过并输出结果null
正确答案:B 你的答案:C 类中声明的变量有默认初始值;方法中声明的变量没有默认初始值,必须在定义时初始化,否则在访问该变量时会出错。
本题中Paddy是静态的成员变量,因此它会获得boolean类型的初始值false。
14.给定include1.jsp文件代码片段,如下:
<% pageContext.setAttribute(“User”,”HAHA”);%>
_______________________________// 此处填写代码
//给定include2.jsp文件代码片段如下:
<%=pageContext.getAttribute(“User”)%>
//要求运行include1.jsp时,浏览器上输出:HAHA
A. <jsp:include page=”include2.jsp” flash=”true”>
B. <%@include file=”include2.jsp”%>
C. <jsp:forward page=”include2.jsp”>
D. <% response.sendRedirect(“include2.jsp”); %>
正确答案:B 你的答案:A
A选项使用了jsp中动作标签的包含标签,这里是动态包含。原理是包含与被包含的页面单独翻译成不同的java文件,然后运行时合并在一起。因为是存在域中的数据,故刚开始就直接翻译数据还不存在,因此浏览器上不能显示出HAHA。
B选项使用了jsp三大指令中的包含指令,这里是静态包含。原理是直接把包含与被包含页面的内容先合并在一起,然后翻译成一个java源文件,最后编译执行。故可以在浏览器上显示出HAHA。
C和D选项分别使用了跳转和重定向,我们知道jsp中有四个域对象,从小到大分别为:
- page域:在同一个jsp页面中数据有效
- request域:在同一个请求中数据有效
- session域:在用一个会话中数据有效
- application域:在同一个网站中数据有效
题中使用的是page域对象:pageContext,而C选项应该使用request域对象:HttpServletRequest,而D选项应该至少使用session域对象:HttpSession(如果处于同一会话中)。
15.下面对静态数据成员的描述中,正确的是
A. 静态数据成员可以在类体内进行初始化
B. 静态数据成员不可以被类的对象调用
C. 静态数据成员不受private控制符的作用
D. 静态数据成员可以直接用类名调用
正确答案:A 你的答案:D
D选项需要考虑在A类通过类名访问B类的静态成员变量时,B类的静态成员变量必须public修饰
16.下面哪些类实现或继承了 Collection 接口?
A. HashMap
B. ArrayList
C. Vector
D. Iterator
正确答案:BC 你的答案:ABCD
- Java集合框架主要由Collection和Map两个根接口及其子接口、实现类组成
- collection 的子接口包括List,set,queue
- Map包括三个实现类HashMap,HashTable,LinkeHashMap
17.在J2EE中,使用Servlet过滤器,需要在web.xml中配置()元素
A. <filter>
B. <filter-mapping>
C. <servlet-filter>
D. <filter-config>
正确答案:AB 你的答案:BC
Servlet过滤器的配置包括两部分:
- 第一部分是过滤器在Web应用中的定义,由
<filter>
元素表示,包括<filter-name>
和<filter-class>
两个必需的子元素 - 第二部分是过滤器映射的定义,由
<filter-mapping>
元素表示,可以将一个过滤器映射到一个或者多个Servlet或JSP文件,也可以采用url-pattern将过滤器映射到任意特征的URL。
18.下面正确的是?
A. Statement sta=con.createStatement(); ResultSet rst=sta.executeQuery("select * from book");
B. Statement sta=con.createStatement("select * from book"); ResultSet rst=sta.executeQuery();
C. PreparedStatement pst=con.prepareStatement(); ResultSet rst=pst.executeQuery("select * from book");
D. PreparedStatement pst=con.prepareStatement("select * from book"); ResultSet rst=pst.executeQuery();
正确答案:AD 你的答案:BC
创建Statement是不传参的,PreparedStatement是需要传入sql语句
19.可以把任何一种数据类型的变量赋给Object类型的变量。
A. 对
B. 错
正确答案:A 你的答案:B
对象类型继承自Object可以赋值;而八大基础数据类型会自动装箱后赋值给Object,所以编译运行都不会报错
20.已知如下类定义:
class Base {
public Base (){
//...
}
public Base ( int m ){
//...
}
public void fun( int n ){
//...
}
}
public class Child extends Base{
// member methods
}
如下哪句可以正确地加入子类中?
A. private void fun( int n ){ //...}
B. void fun ( int n ){ //... }
C. protected void fun ( int n ) { //... }
D. public void fun ( int n ) { //... }
正确答案:A 你的答案:B
方法的重写(override)两同两小一大原则:
- 方法名相同,参数类型相同
- 子类返回类型小于等于父类方法返回类型
- 子类抛出异常小于等于父类方法抛出异常
- 子类访问权限大于等于父类方法访问权限。
21.以下哪个类包含方法flush()?()
A. InputStream
B. OutputStream
C. A 和B 选项都包含
D. A 和B 选项都不包含
正确答案:B 你的答案:C
flush()函数强制将缓冲区中的字符流、字节流等输出,原因是如果输出流输出到缓冲区完成后,缓冲区并没有填满,那么缓冲区将会一直等待被填满。所以在关闭输出流之前要调用flush()
22.下列关于JAVA多线程的叙述正确的是()
A. 调用start()方法和run()都可以启动一个线程
B. CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程
C. Callable类的call()方法可以返回值和抛出异常
D. 新建的线程调用start()方法就能立即进行运行状态
正确答案:BC
A. start是开启线程,run是线程的执行体,run是线程执行的入口。
B. CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程。前者是让一组线程相互等待到某一个状态再执行。后者是一个线程等待其他线程结束再执行。
C. Callable中的call比Runnable中的run厉害就厉害在有返回值和可以抛出异常。同时这个返回值和线程池一起用的时候可以返回一个异步对象Future。
D. start是把线程从new变成了runnable
23.java程序内存泄露的最直接表现是( )
A. 频繁FullGc
B. jvm崩溃
C. 程序抛内存溢出的Exception
D. java进程异常消失
正确答案:C 你的答案:D
ava是自动管理内存的,通常情况下程序运行到稳定状态,内存大小也达到一个 基本稳定的值 但是内存泄露导致Gc不能回收泄露的垃圾,内存不断变大. 最终超出内存界限,抛出OutOfMemoryExpection
24.关于Java中参数传递的说法,哪个是错误的?
A. 在方法中,修改一个基础类型的参数不会影响原始参数值
B. 在方法中,改变一个对象参数的引用不会影响到原始引用
C. 在方法中,修改一个对象的属性会影响原始对象参数
D. 在方法中,修改集合和Maps的元素不会影响原始集合参数
正确答案:D 你的答案:C
java只有值传递
25.下列流当中,属于处理流的是:()
A. FilelnputStream
B. lnputStream
C. DatalnputStream
D. BufferedlnputStream
正确答案:CD 你的答案:D
按照流是否直接与特定的地方(如磁盘、内存、设备等)相连,分为节点流和处理流两类。
- 节点流:可以从或向一个特定的地方(节点)读写数据。如FileReader.
- 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。
JAVA常用的节点流:
- 文 件 FileInputStream FileOutputStrean FileReader FileWriter 文件进行处理的节点流。
- 字符串 StringReader StringWriter 对字符串进行处理的节点流。
- 数 组 ByteArrayInputStream ByteArrayOutputStreamCharArrayReader CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)。
- 管 道 PipedInputStream PipedOutputStream PipedReaderPipedWriter对管道进行处理的节点流。
常用处理流(关闭处理流使用关闭里面的节点流)
缓冲流:BufferedInputStrean BufferedOutputStream BufferedReader BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
转换流:InputStreamReader OutputStreamReader 实现字节流和字符流之间的转换。
数据流 DataInputStream DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来.
流的关闭顺序
- 一般情况下是:先打开的后关闭,后打开的先关闭
- 另一种情况:看依赖关系,如果流a依赖流b,应该先关闭流a,再关闭流b。例如,处理流a依赖节点流b,应该先关闭处理流a,再关闭节点流b
- 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。
26.Hashtable 和 HashMap 的区别是:
A. Hashtable 是一个哈希表,该类继承了 AbstractMap,实现了 Map 接口
B. HashMap 是内部基于哈希表实现,该类继承AbstractMap,实现Map接口
C. Hashtable 线程安全的,而 HashMap 是线程不安全的
D. Properties 类 继承了 Hashtable 类,而 Hashtable 类则继承Dictionary 类
E. HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。
正确答案:BCDE 你的答案:E
Hashtable:
- Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。
- Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
- HashTable直接使用对象的hashCode。
HashMap:
- 由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
- 不是线程安全的,HashMap可以接受为null的键(key)和值(value)。
- HashMap重新计算hash值 Hashtable,HashMap,Properties继承关系如下:
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable
public class HashMap<K,V>extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
java.lang.Objecct java.util.Dictionary<K,V> java.util.Hashtable<Object,Object> java.util.Properties
27.关于Java内存区域下列说法不正确的有哪些
A. 程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器,每个线程都需要一个独立的程序计数器.
B. Java虚拟机栈描述的是java方法执行的内存模型,每个方法被执行的时候都会创建一个栈帧,用于存储局部变量表、类信息、动态链接等信息
C. Java堆是java虚拟机所管理的内存中最大的一块,每个线程都拥有一块内存区域,所有的对象实例以及数组都在这里分配内存。
D. 方法区是各个线程共享的内存区域,它用于存储已经被虚拟机加载的常量、即时编译器编译后的代码、静态变量等数据。
正确答案:BC 你的答案:CD
A.程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器(偏移地址),Java编译过程中产生的字节码有点类似编译原理的指令,程序计数器的内存空间存储的是当前执行的字节码的偏移地址,每一个线程都有一个独立的程序计数器(程序计数器的内存空间是线程私有的),因为当执行语句时,改变的是程序计数器的内存空间,因此它不会发生内存溢出 **,并且程序计数器是jvm虚拟机规范中唯一一个没有规定 OutOfMemoryError 异常 的区域;
B.java虚拟机栈:线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。 没有类信息,类信息是在方法区中
C.java堆:对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组
D.方法区:属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
28.下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换:
byte[] src,dst;
A. dst=String.fromBytes(src,"GBK").getBytes("UTF-8")
B. dst=new String(src,"GBK").getBytes("UTF-8")
C. dst=new String("GBK",src).getBytes()
D. dst=String.encode(String.decode(src,"GBK")),"UTF-8" )
正确答案:B 你的答案:D
选B,先通过GBK编码还原字符串,在该字符串正确的基础上得到“UTF-8”所对应的字节串
String就没有decode和encode方法,坑爹货!
29.执行如下程序代码
char chr = 127;
int sum = 200;
chr += 1;
sum += chr;
后,sum的值是(),备注:同时考虑c/c++和Java的情况的话
A. 72
B. 99
C. 328
D. 327
正确答案:AC 你的答案:CD
java中char是两个字节, 所以对于java来说127不会发生溢出, 输出328
c/c++语言char是一个字节, 会发生溢出, 对127加一发生溢出, 0111 1111 --> 1000 0000, 1000 0000为补码-128, 所以结果为200-128=72
30.在Web应用程序中,( )负责将HTTP请求转换为HttpServletRequest对象
A. Servlet对象
B. HTTP服务器
C. Web容器
D. JSP网页
正确答案:C 你的答案:A
Apache就是一个Http服务器,Tomcat是一个web容器,静态的htmlApache还可以处理,但是动态的需要转发给Tomcat去处理了,比如jsp页面,请求先经由Apache转发给Tomcat再由Tomcat解析请求。所以应该是web容器去解析成request对象
31.java8中,下面哪个类用到了解决哈希冲突的开放定址法
A. LinkedHashSet
B. HashMap
C. ThreadLocalMap
D. TreeMap
正确答案:C 你的答案:B
ThreadLocalMap使用开放定址法解决hash冲突,HashMap使用链地址法解决hash冲突。
32.如果希望监听TCP端口9000,服务器端应该怎样创建socket?
A. new Socket("localhost",9000);
B. new ServerSocket(9000);
C. new Socket(9000);
D. new ServerSocket("localhost",9000);
正确答案:B 你的答案:D
ServerSocket(int port) 是服务端绑定port端口,调accept()监听等待客户端连接,它返回一个连接队列中的一个socket。
Socket(InetAddress address , int port)是创建客户端连接主机的socket流,其中InetAddress是用来记录主机的类,port指定端口。
33.关于JDK1.8中Java的抽象类、接口,以下描述错误的是?
A. 抽象类不一定含有抽象方法,接口中的方法都是抽象方法
B. 一个类只能继承一个抽象类,但可以实现多个接口;一个接口可以继承多个接口
C. 抽象类和接口中的方法都没有方法体
D. 抽象类可以含有私有成员变量,接口不含有私有成员变量
正确答案:C 你的答案:A
- A 接口中的方法默认修饰符有public abstract。
- B 一个接口可以继承多个接口。 Java里类是单继承的,接口是可以多继承的,用关键字extends。
- C 抽象类中的方法是可以有方法体的。JDK1.8之后,接口中的方法也可以有方法体,用default关键字修饰方法。
- D 接口中的成员变量都是public static final的,一般用作常量。
34.下列Java代码中的变量a、b、c分别在内存的____存储区存放。
class A {
private String a = “aa”;
public boolean methodB() {
String b = “bb”;
final String c = “cc”;
}
}
正确答案:堆区、栈区、栈区 你的答案:堆区、堆区、堆区
- 堆区:只存放类对象,线程共享;
- 方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
- 栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;
35.下列代码片段中,存在编译错误的语句是()
byte b1=1,b2=2,b3,b6,b8;
final byte b4=4,b5=6,b7;
b3=(b1+b2); /*语句1*/
b6=b4+b5; /*语句2*/
b8=(b1+b4); /*语句3*/
b7=(b2+b5); /*语句4*/
System.out.println(b3+b6);
A. 语句2
B. 语句1
C. 语句3
D. 语句4
正确答案:BCD 你的答案:D
一、关于final的重要知识点;
1、final关键字可以用于成员变量、本地变量、方法以及类。
2、 final成员变量必须在声明的时候初始化或者在构造器中初始化,否则就会报编译错误。
3、 你不能够对final变量再次赋值。
4、 本地变量必须在声明时赋值。
5、 在匿名类中所有变量都必须是final变量。
6、 final方法不能被重写。
7、 final类不能被继承。
8、 没有在声明时初始化final变量的称为空白final变量(blank final variable),它们必须在构造器中初始化,或者调用this()初始化。不这么做的话,编译器会报错“final变量(变量名)需要进行初始化”。
二、数据类型转换
当使用 +、-、*、/、%、运算操作是,遵循如下规则:
只要两个操作数中有一个是double类型的,另一个将会被转换成double类型,并且结果也是double类型,如果两个操作数中有一个是float类型的,另一个将会被转换为float类型,并且结果也是float类型,如果两个操作数中有一个是long类型的,另一个将会被转换成long类型,并且结果也是long类型,否则(操作数为:byte、short、int 、char),两个数都会被转换成int类型,并且结果也是int类型。
语句 1 :(b1 + b2) 被转换为int类型 但是 b3仍为 byte ,所以出错 要么将b3转化为int 要么将(b1 + b2) 强制转换为byte类型。所以语句1错误。
语句 2:b4 、b5被声明final 所以类型是不会转换, 计算结果任然是byte ,所以 语句2正确。
语句 3:(b1 + b4) 结果仍然转换成int 所以语句 3 错误。
语句 4 : (b2 + b5) 结果仍然转换为int , 所以语句4错误。