java试题复盘——11月25日

上:

11下列表述错误的是?(D

A、int是基本类型,直接存数值,Integer是对象,用一个引用指向这个对象。
B、在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
C、封装的主要作用在于对外隐藏内部实现细节,可以增强程序的安全性

 

D、finaljava中的修饰符,可以修饰类、接口、抽象类、方法和属性。

 

解析:

抽象类:子类继承重写
final:不允许重写
此处矛盾
 
 

16默认RMI采用的是什么通信协议?  C

A、HTTP

B、UDP/IP

C、TCP/IP

D、Multicast

 

解析:

RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这是一次远程通讯的革命,为远程通信开辟新的里程碑。

RMI的开发步骤

先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote
开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject
通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象

 

最后客户端查找远程对象,并调用远程方法。
 
 

17Given:

1

2

3

4

5

6

7

8

9

    //point X

public class Foo {

    public static void main(String[] args) throws Exception {

 

        PrintWriter out = new PrintWriter(

            new java.io.OutputStreamWriter(System.out), true);

        out.printIn(“Hello”)

    }

}

 

Which statement at PointX on line I allows this code to compile and run?    A

A、import java.io.PrintWriter;

B、include java.io.PrintWriter;

C、import java.io.OutputStreamWriter;

D、include java.io.OutputStreamWriter;

E、no statement is needed.

 
 
解析:
思路:
首先排除include和最后一个
其次:
    1.PrintWriter
    2.OutputStreamWriter
注意:
    在创建OutputStreamWriter的时候,使用的是类的全名称。所以不需要使用import

 

18 对于abstract声明的类,下面说法正确的是 E

A、可以实例化

B、不可以被继承

C、子类为abstract

D、只能被继承

 

E、可以被抽象类继承

 

解析:

A、抽象类不能实例化,因为有抽象方法未实现
B、可以被继承。派生类可以实现抽象方法
C、子类可以是抽象的,也可以非抽象的
D、只能被继承说法太肯定,不正确
E、可以被抽象类继承,也可以被非抽象类继承

 

 

解析:

 

 

服务器端,首先是服务器初始化Socket,然后是与端口进行绑定(blind()),端口创建ServerSocket进行监听(listen()),然后调用阻塞(accept()),等待客户端连接。与客户端发生连接后,会进行相关的读写操作(read(),write()),最后调用close()关闭连接。

 

 

21ParentChild定义如下:

class  Parent{

2.         public  float  aFun(float a, float b) { }

}

class  Child  extends  Parent{

}

将以下哪种方法插入行5是不合法的。(  A  

A、float aFun(float  a,  float  b){ }

B、public int aFun(int a, int b) { }

C、public float aFun(float  p,  float q){ }

 

D、private int aFun(int a,  int  b){ }

 

解析:

重写原则(两同两小一大):

1、两同:方法名相同,形参列表相同。

2、两小:子类方法返回值类型应比父类方法返回值类型更小或相等,子类方法声明抛出的异常类应比父类方法声明抛出的异常更小或相等。

3、一大:子类方法的访问权限应比父类方法的访问权限更大或相等。

4、尤其指出:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。

 


A选项是重写,但是默认访问修饰符比父类小,插入第五行编辑器会报错。(默认包访问权限 > public)
B、D不是重写。因为形参列表和返回值类型不同,不满足“两同两小”。所以写在第五行以普通方法对待,插入第五行没有错误。
C选项满足重写的各项条件,是正确的重写,所以插入第五行没有错误。

 

 

22关于匿名内部类叙述正确的是? (B)

 

A、匿名内部类可以继承一个基类,不可以实现一个接口
B、匿名内部类不可以定义构造器
C、匿名内部类不能用于形参

 

D、以上说法都不正确

 

解析:

匿名内部类的创建格式为: new 父类构造器(参数列表)|实现接口(){
                                             //匿名内部类的类体实现
                                        }

 

  1. 使用匿名内部类时,必须继承一个类或实现一个接口
  2. 匿名内部类由于没有名字,因此不能定义构造函数
  3. 匿名内部类中不能含有静态成员变量和静态方法

 

25、下列关于JAVA多线程的叙述正确的是(BC)(多选)

A、 调用start()方法和run()都可以启动一个线程
B、 CyclicBarrier和CountDownLatch都可以让一组线程等待其他线程
C、 Callable类的call()方法可以返回值和抛出异常
D、 新建的线程调用start()方法就能立即进行运行状态

 

 解析:

A. start()方法来启动线程,真正实现了多线程运行,调用了run()方法;run()方法当作普通方法的方式调用。

B. CyclicBarrier让一组线程等待其他线程;CountDownLatch让一组线程等待某个事件发生。
C. Callable能够抛出checked exception。
D. start()方法让thread进去可运行状态(runnable),等待获取CPU的使用权。

 

 

27、

关于下面一段代码,以下说法正确的是: (ACD)(多选)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

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,锁住的不是同一个对象

 

 

解析:同步普通方法锁的是this也就是当前对象,同步静态方法锁的是类对象,也就是Class对象

 

 

29、局部内部类可以用哪些修饰符修饰?(CD)(多选)

A、 public

B、 private

C、 abstract

D、 final

 

 

34、ArrayList和LinkList的描述,下面说法错误的是? D

A、 LinkedeList和ArrayList都实现了List接口

B、 ArrayList是可改变大小的数组,而LinkedList是双向链接串列

C、 LinkedList不支持高效的随机元素访问

D、 在LinkedList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在ArrayList的中间插入或删除一个元素的开销是固定的

 

解析:

D的说法反了...

Arraylist的内存结构是数组,当超出数组大小时创建一个新的数组,吧原数组中元素拷贝过去。其本质是顺序存储的线性表,插入和删除操作会引发后续元素移动,效率低,但是随机访问效率高

LinkedList的内存结构是用双向链表存储的,链式存储结构插入和删除效率高,不需要移动。但是随机访问效率低,需要从头开始向后依次访问

 

 

37、下面程序的输出是:(D)

1

2

3

4

5

String x="fmn";

x.toUpperCase();

String y=x.replace('f','F');

y=y+"wxy";

System.out.println(y);

A、 FmNwxy

B、 fmnwxy

C、 wxyfmn

D、 Fmnwxy

 

解析:

String x="fmn";  “fmn”是在常量池里的不可变对象。

x.toUpperCase();   在堆中new一个"FMN"对象,但无任何引用指向它。
String y=x.replace('f','F'); 在堆中 new一个"Fmn"对象,y指向它。
y=y+"wxy"; 在堆中 重新new一个"Fmnwxy"对象, 修改y指向,现在y指向它。

 

 

39、以下程序的运行结果是:(   C )

1

2

3

4

5

6

7

8

9

10

 TreeSet<Integer> set = new TreeSet<Integer>();

 TreeSet<Integer> subSet = new TreeSet<Integer>();

 for(int i=606;i<613;i++){

 if(i%2==0){

 set.add(i);

 }

 }

 subSet = (TreeSet)set.subSet(608,true,611,true);

 set.add(629);

 System.out.println(set+" "+subSet);

 

A、 编译失败

B、 发生运行时异常

C、 [606, 608, 610, 612, 629] [608, 610]

D、 [606, 608, 610, 612, 629] [608, 610,629]

 

解析:

subset(form,true,to,true)是Treeset的非静态方法,该方法返回从form元素到to元素的一个set集合,两个boolean类型是确认是否包含边境值用的。

 

 

41、Java程序中的类名称必须与存放该类的文件名相同。 B

A、 对

B、 错

 

 解析:

声明为public类型的类名必须与文件名相同,默认权限的可以不同
并且内部类的类名一般与文件名不同

 

 

 

43、以下代码执行的结果显示是多少(B)?

public class Demo{

    public static void main(String[] args){

        System.out.print(getNumber(0));

        System.out.print(getNumber(1));

        System.out.print(getNumber(2));

        System.out.print(getNumber(4));

    }

    

    public static int getNumber(int num){

        try{

            int result = 2 / num;

            return result;

        }catch (Exception exception){

            return 0;

        }finally{

            if(num == 0){

                return -1;

            }

            if(num == 1){

                return 1;

            }

        }

    }

}

A、 0110

B、 -1110

C、 0211

D、 -1211

 

解析:

finally一定会在return之前执行,但是如果finally使用了return或者throw语句,将会使trycatch中的return或者throw失效

 

 

 

45、于访问权限,说法正确的是? (A )

A、 类A和类B在同一包中,类B有个protected的方法testB,类A不是类B的子类(或子类的子类),类A可以访问类B的方法testB
B、 类A和类B在同一包中,类B有个protected的方法testB,类A不是类B的子类(或子类的子类),类A不可以访问类B的方法testB
C、 访问权限大小范围:public > 包权限 > protected > private
D、 访问权限大小范围:public > 包权限 > private > protected

 

 

 

 

 

 

 

46、在 Java 中,属于整数类型变量的是(C)

A、 single
B、 double
C、 byte
D、 char

 

 解析:

Java中的四类八种基本数据类型

第一类:整数类型  byte short int long

第二类:浮点型  float double

第三类:逻辑型    boolean(它只有两个值可取true false)

第四类:字符型  char

 

 

48、

static String str0="0123456789";

static String str1="0123456789";

String str2=str1.substring(5);

String str3=new String(str2);

String str4=new String(str3.toCharArray());

str0=null;

假定str0,...,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为(C)

A、 5

B、 10

C、 15

D、 20

 

 解析:

substring实际是new,5字符
str3和4也都是new,每个5字符
分别都会创建新的对象
常量池是PermGen的
因此应该是一共15字符

 

 

 

 下:

 

 

17 关于ASCII码和ANSI码,以下说法不正确的是(D)?

A.  标准ASCII只使用7个bit
B.  在简体中文的Windows系统中,ANSI就是GB2312
C.  ASCII码是ANSI码的子集
D.  ASCII码都是可打印字符

 

解析:

A、标准ASCII只使用7个bit,扩展的ASCII使用8个bit。
B、ANSI通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。不同 ANSI 编码之间互不兼容。在简体中文Windows操作系统中,ANSI 编码代表 GBK 编码;在繁体中文Windows操作系统中,ANSI编码代表Big5;在日文Windows操作系统中,ANSI 编码代表 Shift_JIS 编码。
C、ANSI通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符,即ASCII码
D、ASCII码包含一些特殊空字符

 

 

22 下列关于容器集合类的说法正确的是? C

A.  LinkedList继承自List
B.  AbstractSet继承自Set
C.  HashSet继承自AbstractSet
D.  WeakMap继承自HashMap

 

解析:

这道题其实只要把java集合框架给看了,就一目了然了。

首先这道题很多人都对接口以及抽象实现类认识混乱。
A.LinkedList是继承自AbstractSequentialList(抽象类,实现了List接口)的,并且实现了List接口。所以A错误。
B.AbstractSet是实现了Set接口的,本身是一个抽象类。继承自AbstractCollection(抽象类,实现了Collection接口)。所以B错误。
C.HashSet是继承自AbstractSet,实现了Set接口。所以C正确。
D.WeakMap不存在于java集合框架的。只有一个叫做WeakHashMap(继承自AbstractMap)。
最后附上java集合框架图。

 

 

 

 

23 关于HashMap和Hashtable正确的说法有(AC)

A.  都实现了Map接口
B.  Hashtable类不是同步的,而HashMap类是同步的
C.  Hashtable不允许null键或值
D.  HashMap不允许null或值

 

解析:

1、继承不同。public class Hashtable extends Dictionary implements Map

 public class HashMap extends AbstractMap implements Map

2、Hashtable 中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。

3、Hashtable中,key和value都不允许出现null值。

在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。

4、两个遍历方式的内部实现上不同。

Hashtable、HashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。

5、哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。

6、Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数 

 

 

 

24 关于JSP生命周期的叙述,下列哪些为真?  AC

A.  JSP会先解释成Servlet源文件,然后编译成Servlet类文件
B.  每当用户端运行JSP时,jsp init()方法都会运行一次
C.  每当用户端运行JSP时,jsp service()方法都会运行一次
D.  每当用户端运行JSP时,jsp destroy()方法都会运行一次

 

解析:

init方法:负责初始化Servlet对象。在Servlet的整个生命周期类,init()方法只被调用一次。
destroy方法:销毁Servlet对象,释放占用的资源,Servlet要被卸载时调用

 

 

25 下面有关servlet的层级结构和常用的类,说法正确的有?  ABCD

A.  GenericServlet类:抽象类,定义一个通用的、独立于底层协议的Servlet。
B.  大多数Servlet通过从GenericServlet或HttpServlet类进行扩展来实现
C.  ServletConfig接口定义了在Servlet初始化的过程中由Servlet容器传递给Servlet得配置信息对象
D.  HttpServletRequest接口扩展ServletRequest接口,为HTTP Servlet提供HTTP请求信息

 

26 下面哪些写法能在 java8 中编译执行(AD)

A.  dir.listFiles((File f)->f.getName().endsWith(“.Java”));
B.  dir.listFiles((File f)=>f.getName().endsWith(“.Java”));
C.  dir.listFiles((_.getName().endsWith(“.Java”)));
D.  dir.listFiles( f->f.getName().endsWith(“.Java”));

 

 解析:

Lanbda表达式的主要作用就是代替匿名内部类的繁琐语法, 它由三部分组成:

(1) 形参列表。形参列表允许省略形参类型。如果形参列表中只有一个参数,甚至连形参列表的圆括号也可以省略。
(2) 箭头(→)。必须通过英文中画线和大于符号组成。
(3)代码块。如果代码块只包含一条语句,Lambda表达式允许省略代码块的花括号,那么那条语句就不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。Lambda表达式需要返回值,而它的代码块中仅有一套省略了return的语句。Lambda表达式会自动返回这条语句的值。

 

 

27  jvm中垃圾回收分为scanvenge gc和full GC,其中full GC触发的条件可能有哪些 ?  CDE

A.  栈空间满
B.  年轻代空间满
C.  老年代满
D.  持久代满
E.  System.gc()

 

 解析:

 

 

 

垃圾收集机制:新生代、老年代、持久代
1,新生代:(1)所有对象创建在新生代的Eden区,当Eden区满后触发新生代的Minor GC,将Eden区和非空闲Survivor区存活的对象复制到另外一个空闲的Survivor区中。(2)保证一个Survivor区是空的,新生代Minor GC就是在两个Survivor区之间相互复制存活对象,直到Survivor区满为止。
2,老年代:当Survivor区也满了之后就通过Minor GC将对象复制到老年代。老年代也满了的话,就将触发Full GC,针对整个堆(包括新生代、老年代、持久代)进行垃圾回收。
3,持久代:持久代如果满了,将触发Full GC。

 

 

33 为了使包ch4在当前程序中可见,可以使用的语句是(A)

A.  import ch4.*;
B.  package ch4.*;
C.  ch4 import;
D.  ch4 package;

 

解析:

package ch4;
将你这个类放在了/ch4这个文件夹下面
要使用的话
import ch4.*;导入这个类

 

 

 

36 以下不是修饰符final的作用的是( C)。

A.  修饰常量
B.  修饰不可被继承的类
C.  修饰不可变类
D.  修饰不可覆盖的方法

 

 

解析:

final的作用:

    1. 修饰变量,变量的引用地址不可变,但是地址中的内容可以变。
    2. 修饰方法,方法不可被重写,但是还是可以重载
    3. 修饰类,类不可继承。

不可变类,说的是一个类一旦被实例化,就不可改变自身的状态。常见的比如String和基本数据类型的包装类,对于这种不可变类,一旦在进行引用传递的时候,形参一开始就和实际参数指向的不是一个地址,所以在方法中对形参的改变,并不会影响实际参数。

 

 

 

37 如果一个list初始化为{5,3,1},执行以下代码后,其结果为(B)?
nums.add(6);
nums.add(0,4);
nums.remove(1);

A.  [5, 3, 1, 6]
B.  [4, 3, 1, 6]
C.  [4, 3, 6]
D.  [5, 3, 6]

 

解析:

初始化为{5,3,1}

nums.add(6)后list为{5,3,1,6}
nums.add(0,4)是在0号索引上添加数字4得到list为{4,5,3,1,6}
nums.remove(1)是将1号索引上的5进行remove得到list为{4,3,1,6}

 

 

 

42 下列哪些功能可以通过Cookie来实现?( ABC)

A.  记录访问者的信息
B.  在页面之间传递信息
C.  自动识别用户
D.  对数据库进行操作

 

 解析:

A 项,访问者的信息一般都可以处理成 kv 键值对的形式,故可以保存在 Cookie 中,正确。

B 项,通过设置 Cookie 的 path 等属性,可以在特定域名或 URI 下共享 Cookie 信息,正确。
C 项,通过在 Cookie 中保存用户uid、服务器会话sid等方法,可以记录用户登录状态,正确。
D 项,Cookie 是保存在用户浏览器上的小文本文件,不是数据库,也没有提供操作数据库的 API,故此项错误。

 

 

48 下列代码,页面打开后能够弹出alert(1)的是? ABC

A.  <iframe src=”javascript: alert(1)”></iframe>
B.  <img src=”” onerror=”alert(1)”/>
C.  IE下<s style=”top:expression(alert(1))”></s>
D.  <div onclick=”alert(1)”></div>

 

解析:

A 加载页面的时候触发;

B onerror   事件 当图片不存在时,将触发;
C 在ie 7下会连续弹出, IE5及其以后版本支持在CSS中使用expression,用来把CSS属性和Javascript表达式关联起来,这里的CSS属性可以是元素固有的属性,也可以是自定义属性。就是说CSS属性后面可以是一段Javascript表达式,CSS属性的值等于Javascript表达式计算的结果。 在表达式中可以直接引用元素自身的属性和方法,也可以使用其他浏览器对象。这个表达式就好像是在这个元素的一个成员函数中一样。参考资料 http://www.blueidea.com/tech/site/2006/3705.asp
D 不可以,因为div里没有内容,盒子的宽度为0所以点击不了的;

 

 

 

 

50 下面这个JS程序的输出是什么:A

 

A.  0 1 0
B.  0 1 2
C.  0 0 0
D.  0 0 2

 

 

 解析:

这道题考察闭包引用类型对象的知识点:

1.一般来说函数执行完后它的局部变量就会随着函数调用结束被销毁,但是此题foo函数返回了一个匿名函数的引用(即一个闭包),它可以访问到foo()被调用产生的环境,而局部变量i一直处在这个环境中,只要一个环境有可能被访问到,它就不会被销毁,所以说闭包有延续变量作用域的功能。这就好理解为什么:

 
1
2
f1();//0
f1();//1

2.我一开始认为f1和f2都=foo()是都指向了同一个function引用类型,所以顺理成章就会答错认为:

 
1
f2();//2

但其实foo()返回的是一个匿名函数,所以f1,f2相当于指向了两个不同的函数对象,所以结果也就顺理成章的变为:

 
1
f2();//0

 

 

 

 

 

 

 

 

 

 

posted @ 2019-11-25 22:10  不会fly的pig  阅读(555)  评论(0编辑  收藏  举报