2018-2-19 牛客试题复盘

1、下面程序的运行结果是  B

String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);

A、true
B、false
C、exception
D、无输出

解析:
String str1 = "hello";这里的str1指的是方法区的字符串常量池中的“hello”,编译时期就知道的; 
String str2 = "he" + new String("llo");这里的str2必须在运行时才知道str2是什么,所以它是指向的是堆里定义的字符串“hello”,所以这两个引用是不一样的。

2、以下程序运行的结果为 ( A  )

public  class Example  extends Thread{

@Override

    public void run(){

        try {

            Thread.sleep(1000);

        } catch (InterruptedException e){

            e.printStackTrace();

        }

        System. out .print( "run" );

    }

    public static void main(String[] args){

        Example example= new Example();

        example.run();

        System. out .print( "main" );

    }
}
 
A、run main
B、main run
C、main
D、run

E、不能确定

解析:

因为Example的run方法里面休眠了100ms,在当今电脑计算性能过剩的时代,如果是多线程启动,main方法肯定会打印出了main。

为啥是runmain而不是mainrun呢?

  1. 因为启动线程是调用start方法。
  2. 把线程的run方法当普通方法,就直接用实例.run()执行就好了。

没有看到start。所以是普通方法调用。

3、用户不能调用构造方法,只能通过new关键字自动调用。(B)

A、正确
B、错误

解析:

  1. 在类内部可以用户可以使用关键字this.构造方法名()调用(参数决定调用的是本类对应的构造方法)
  2. 在子类中用户可以通过关键字super.父类构造方法名()调用(参数决定调用的是父类对应的构造方法。)
  3. 反射机制对于任意一个类,都能够知道这个类的所有属性和方法,包括类的构造方法。

4、子类要调用继承自父类的方法,必须使用super关键字。 B

A、正确
B、错误

解析:

1、子类构造函数调用父类构造函数用super
2、子类重写父类方法后,若想调用父类中被重写的方法,用super
3、未被重写的方法可以直接调用。

5、下面关于程序编译说法正确的是(C)

A、java语言是编译型语言,会把java程序编译成二进制机器指令直接运行
B、java编译出来的目标文件与具体操作系统有关
C、java在运行时才进行翻译指令
D、java编译出来的目标文件,可以运行在任意jvm上

解析:

A:.java编译成的是字节码,再被各系统的jvm翻译成本系统可以识别的机器码,这就是java一次编程多平台应用的跨平台性

B:java源文件生成的是class文件,与系统无关

C:注意字节码和机器码不是一回事 java程序在运行时字节码才会被jvm翻译成机 器码,所以说java是解释性语言

D:注意jvm的版本,好比人穿裤子,一条裤子能被任何人穿上吗

6、Java网络程序设计中,下列正确的描述是(AD)

A、Java网络编程API建立在Socket基础之上
B、Java网络接口只支持tcP以及其上层协议
C、Java网络接口只支持UDP以及其上层协议
D、Java网络接口支持IP以上的所有高层协议

7、下面哪些可能是重载的基本条件(ABD)(注意:是可能为重载的基本条件)

A、参数的类型不同
B、参数的顺序不同
C、函数的返回值类型不同
D、参数的个数不同

解析:

重载的概念是:

方法名称相同,参数个数、次序、类型不同

因此重载对返回值没有要求,可以相同,也可以不同

但是如果参数的个数、类型、次序都相同,方法名也相同,仅返回值不同,则无法构成重载

8、在java中重写方法应遵循规则的包括(BC)

A、访问修饰符的限制一定要大于被重写方法的访问修饰符
B、可以有不同的访问修饰符
C、参数列表必须完全与被重写的方法相同
D、必须具有不同的参数列表

解析:

方法的重写(override)两同两小一大原则
方法名相同,参数类型相同
子类返回类型小于等于父类方法返回类型,
子类抛出异常小于等于父类方法抛出异常,
子类访问权限大于等于父类方法访问权限。
 
注:A选项错误,是因为只有大于,没说明等于。
 
 
 
9、Java1.8版本之前的前提,Java特性中,abstract class和interface有什么区别(D )
A、抽象类可以有构造方法,接口中不能有构造方法
B、抽象类中可以有普通成员变量,接口中没有普通成员变量
C、抽象类中不可以包含静态方法,接口中可以包含静态方法
D、一个类可以实现多个接口,但只能继承一个抽象类。

解析:

在JDK1.8之前的版本(不包括JDK1.8),接口中不能有静态方法,抽象类中因为有普通方法,故也可以有静态方法。

在JDK1.8后(包括JDK1.8),在抽象类中依旧可以有静态方法,同时在接口中也可以定义静态方法了。

10、以下JAVA程序的运行结果是什么(  D )

public static void main(String[] args) {
Object o1 =  true new Integer( 1 ) :  new Double( 2.0 );
Object o2;
if ( true ) {
              o2 =  new Integer( 1 );
else {
o2 =  new Double( 2.0 );
}
System.out.print(o1);
System.out.print( " " );         
System.out.print(o2);
}
 
A、1 1
B、1.0 1.0
C、1 1.0
D、1.0 1

解析:

三元操作符类型的转换规则:
1.若两个操作数不可转换,则不做转换,返回值为Object类型
2.若两个操作数是明确类型的表达式(比如变量),则按照正常的二进制数字来转换,int类型转换为long类型,long类型转换为float类型等。
3.若两个操作数中有一个是数字S,另外一个是表达式,且其类型标示为T,那么,若数字S在T的范围内,则转换为T类型;若S超出了T类型的范围,则T转换为S类型。

4.若两个操作数都是直接量数字,则返回值类型为范围较大者
 
符合4,所以选D.
 
 
 
11、关于Java内存区域下列说法不正确的有哪些   BC
A、程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器,每个线程都需要一个独立的程序计数器.
B、Java虚拟机栈描述的是java方法执行的内存模型,每个方法被执行的时候都会创建一个栈帧,用于存储局部变量表、类信息、动态链接等信息
C、Java堆是java虚拟机所管理的内存中最大的一块,每个线程都拥有一块内存区域,所有的对象实例以及数组都在这里分配内存。
D、方法区是各个线程共享的内存区域,它用于存储已经被虚拟机加载的常量、即时编译器编译后的代码、静态变量等数据。

解析:

A.程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的信号指示器(偏移地址),Java编译过程中产生的字节码有点类似编译原理的指令,程序计数器的内存空间存储的是当前执行的字节码的偏移地址,每一个线程都有一个独立的程序计数器(程序计数器的内存空间是线程私有的),因为当执行语句时,改变的是程序计数器的内存空间,因此它不会发生内存溢出 ,并且程序计数器是jvm虚拟机规范中唯一一个没有规定  OutOfMemoryError 异常 的区域;
 
B.java虚拟机栈:线程私有,生命周期和线程一致。描述的是 Java 方法执行的内存模型:每个方法在执行时都会床创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用直至执行结束,就对应着一个栈帧从虚拟机栈中入栈到出栈的过程。  没有类信息,类信息是在方法区中

C.java堆:对于绝大多数应用来说,这块区域是 JVM 所管理的内存中最大的一块。线程共享,主要是存放对象实例和数组
 
D.方法区:属于共享内存区域,存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

12、下列说法错误的有( ACD)

A、在类方法中可用this来调用本类的类方法
B、在类方法中调用本类的类方法时可直接调用
C、在类方法中只能调用本类中的类方法
D、在类方法中绝对不能调用实例方法

解析:

首先:
成员方法又称为实例方法
静态方法又称为类方法
其次:
a,静态方法中没有this指针
c,可以通过类名作用域的方式调用Class::fun();
d,太绝对化了,在类中申请一个类对象或者参数传递一个对象或者指针都可以调用;

13、HashSet子类依靠()方法区分重复元素。  C

A、toString(),equals()
B、clone(),equals()
C、hashCode(),equals()
D、getClass(),clone()

解析:

HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。

而Map中保存key值前,会去判断当前Map中是否含有该key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。

14、以下程序的运行结果是? A

A、foobar
B、barfoo
C、foobar或者barfoo都有可能
D、Bar
E、Foo
F、程序无法正常运行

解析:

答案是 A foobar 这道题是考线程的调用情况,线程的启动方式只能通过start这种方式启动才能真正的实现多线程的效果,如果是手动调用run方法和普通方法调用没有区别,所以这个还是按照顺序执行首先执行run方法之后,执行输出语句所以最终得到结果foobar.

15、在try的括号里面有return一个值,那在哪里执行finally里的代码? B

A、不执行finally代码
B、return前执行
C、return后执行

解析:

https://www.ibm.com/developerworks/cn/java/j-lo-finally/

16、关于访问权限说法正确 的是 ? (B )

A、外部类前面可以修饰public,protected和private
B、成员内部类前面可以修饰public,protected和private
C、局部内部类前面可以修饰public,protected和private
D、以上说法都不正确

解析:

( 1 )对于外部类而言,它也可以使用访问控制符修饰,但外部类只能有两种访问控制级别: public 和默认。因为外部类没有处于任何类的内部,也就没有其所在类的内部、所在类的子类两个范围,因此 private 和 protected 访问控制符对外部类没有意义。

( 2 )内部类的上一级程序单元是外部类,它具有 4 个作用域:同一个类( private )、同一个包( protected )和任何位置( public )。

( 3 ) 因为局部成员的作用域是所在方法,其他程序单元永远不可能访问另一个方法中的局部变量,所以所有的局部成员都不能使用访问控制修饰符修饰。

17、在一个基于分布式的游戏服务器系统中,不同的服务器之间,哪种通信方式是不可行的(A)?

A、管道
B、消息队列
C、高速缓存数据库
D、套接字

解析:

对于管道,有下面这几种类型:
①普通管道(PIPE):通常有两种限制,一是单工,即只能单向传输;二是血缘,即常用于父子进程间(或有血缘关系的进程间)。

②流管道(s_pipe):去除了上述的第一种限制,实现了双向传输。

③命名管道(name_pipe):去除了上述的第二种限制,实现了无血缘关系的不同进程间通信。
显然,要求是对于不同的服务器之间的通信,是要要求全双工形式的,而管道只能是半双工,虽然可以双向,但是同一时间只能有一个方向传输,全双工和半双工的区别可以如下图示理解:

18、关于java中的数组,下面的一些描述,哪些描述是准确的:(ACF)

A、数组是一个对象,不同类型的数组具有不同的类
B、数组长度是可以动态调整的
C、数组是一个连续的存储结构
D、一个固定长度的数组可类似这样定义:int array[100]
E、两个数组用equals方法比较时,会逐个便利其中的元素,对每个元素进行比较
F、可以二维数组,且可以有多维数组,都是在java中合法的。

解析:

这个E选项是错的。

public static void main(String[] args) { int[] a = {1,2,3,4,5};
int[] b = {1,2,3,4,5};
System.out.println(a.equals(b));
}

图片说明

进方法内部:
图片说明
明显是Object里面的equals();

19、下列说法正确的有( C)

A、class中的constructor不可省略
B、constructor必须与class同名,但方法不能与class同名
C、constructor可在一个对象被new时执行
D、一个class只能定义一个constructor

 解析:

constructor表示构造方法。

20、以下哪个类包含方法flush()?(B)

A、InputStream
B、OutputStream
C、A 和B 选项都包含
D、A  和B 选项都不包含

解析:

flush()函数强制将缓冲区中的字符流、字节流等输出,目的是如果输出流输出到缓冲区完成后,缓冲区并没有填满,那么缓冲区将会一直等待被填满。所以在关闭输出流之前要调用flush()。

21、下面有关servlet service描述错误的是?     B

A、不管是post还是get方法提交过来的连接,都会在service中处理
B、doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的
C、service()是在javax.servlet.Servlet接口中定义的
D、service判断请求类型,决定是调用doGet还是doPost方法

解析:

doGet/doPost 则是在 javax.servlet.http.HttpServlet 中实现的。

22、以下程序的输出结果为  D

class Base{
     public Base(String s){
         System.out.print( "B" );
     }
}
public class Derived  extends Base{
     public Derived (String s) {
         System.out.print( "D" );
     }
     public static void main(String[] args){
         new Derived( "C" );
     }
}
 
A、BD
B、DB
C、C
D、编译错误

解析:

子类构造方法在调用时必须先调用父类的,由于父类没有无参构造,必须在子类中显式调用,修改子类构造方法如下即可:
public Derived(String s){
    super ( "s" );
    System.out.print( "D" );
}












猜你喜欢

转载自www.cnblogs.com/buhuiflydepig/p/12330674.html