2020-2-20 牛客试题复盘

1、下面哪个修饰符修饰的变量是所有同一个类生成的对象共享的( C)

A、public
B、private
C、static
D、final

解析:

static修饰某个字段时,肯定会改变字段创建的方式(每个被static修饰的字段对于每一个类来说只有一份存储空间,而非static修饰的字段对于每一个对象来说都有一个存储空间)
static属性是属于类的,所以对象共同拥有,所以既可以通过类名.变量名进行操作,又可以通过对象名.变量名进行操作
 
 
 
2、对于以下代码段,4个输出语句中输出true的个数是( C   )。

class A{}

class B extends A{}

class C extends A{}

class D extends B{}

A obj = new D();

System.out.println(obj instanceof B);

System.out.println(obj instanceof C);

System.out.println(obj instanceof D);

System.out.println(obj instanceof A);

A、1
B、2
C、3
D、4

解析:

    A
|        |
B     C
|
D
D属于B,D属于A,但D不属于C。

3、有一个源代码,只包含import java.util.* ; 这一个import语句,下面叙述正确的是?   ( C)

A、只能写在源代码的第一句
B、可以访问java/util目录下及其子目录下的所有类
C、能访问java/util目录下的所有类,不能访问java/util子目录下的所有类
D、编译错误

解析:

导入java.util.*不能读取其子目录的类,因为如果java.util里面有个a类,java.util.regex里面也有个a类,我们若是要调用a类的方法或属性时,应该使用哪个a类呢。

4、如下代码的输出是   B

package Test;
public class Test {
    private static void test(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            try {
                if (arr[i] % 2 == 0) {
                    throw new NullPointerException();
                else {
                    System.out.print(i);
                }
            finally {
                System.out.print("e");
            }
        }
    }
 
    public static void main(String[]args) {
        try {
            test(new int[] {012345});
        catch (Exception e) {
            System.out.print("E");
        }
    }
 
}
 
A、编译出错
B、eE
C、Ee
D、eE1eE3eE5
E、Ee1Ee3Ee5

解析:

由于arr[0] =0,所以在进入 test()方法里面会在第一个if 上抛出一个 NullPointerException,接着会执行 finally 的语句, (finally语句先于 return 和 throw语句执行),输出一个'e,然后回到 main方法中,由于捕捉到异常,所以进入到catch语句中,然后打印一个'E',所以最终结果为"eE".

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

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

 解析:

由于构造器的名字必须与类名相同,而匿名类没有类名,所以匿名类不能有构造器。

匿名内部类的创建格式为: new 父类构造器(参数列表)|实现接口(){
                                             //匿名内部类的类体实现
                                        }
  1. 使用匿名内部类时,必须继承一个类或实现一个接口
  2. 匿名内部类由于没有名字,因此不能定义构造函数
  3. 匿名内部类中不能含有静态成员变量和静态方法

6、下面代码的运行结果为:(C)

import java.io.*;
import java.util.*;
public class foo{
public static void main (String[] args){
String s;
System.out.println("s=" + s);
}
}
 
A、代码得到编译,并输出“s=”
B、代码得到编译,并输出“s=null”
C、由于String s没有初始化,代码不能编译通过
D、代码得到编译,但捕获到 NullPointException异常

7、下列关于if-else if选择结构的说法正确的是    BD

A、多个else if块之间的顺序可以改变,改变之后对程序的执行结果没有影响
B、if块之间的顺序可以改变,改变之后可能对程序的执行结果有影响
C、多个else if块之间的顺序不可以改变,改变后程序编译不通过
D、多个else if块之间的顺序可以改变,改变后程序编译可以通过

8、下列方法中哪个是线程执行的方法? (A)

A、run()
B、start()
C、sleep()
D、suspend()

解析:

start是启动线程对象,使之从新建状态转入就绪状态;

sleep让线程睡眠一段时间,在此期间线程不消耗CPU资源;

suspend使线程挂起,暂停执行, 如果想恢复线程,必须由其他线程调用 resume方法。

9、下面关于静态方法说明正确的是  B

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

解析:

A:不能使用this调用本类的类方法(即静态方法);具体原理不清楚(望指点),个人理解为this指向的是实例对象,此时未实例化,故不能使用
B: 正确
C:在静态方法中,不只可以调用本类的静态方法,也可以使用【类名.静态方法名】调用其他类的静态方法
D:可以调用实例方法,使用【new 类名().实例方法名】调用

10、下面哪个不属于HttpServletResponse接口完成的功能?C

A、设置HTTP头标
B、设置cookie
C、读取路径信息
D、输出返回数据

 解析:

A:设置HTTP头标  
1
response.setHeader("Refresh","3"); //三秒刷新页面一次
B:设置cookie
1
2
Cookie c1 = new Cookie("username","only");
response.addCookie(c1);
C(错误):读取路径信息,request读取路径信息
1
2
3
4
5
从request获取各种路径总结
request.getRealPath("url"); // 虚拟目录映射为实际目录
request.getRealPath("./");    // 网页所在的目录
request.getRealPath("../"); // 网页所在目录的上一层目录
request.getContextPath();    // 应用的web目录的名称
 
D:输出返回数据
1
HttpServleteResponse.getOutputStream().write();
 

11、下面哪个不对?   C

A、RuntimeException is the superclass of those exceptions that can be thrown during the normal operation of the Java Virtual Machine.
B、A method is not required to declare in its throws clause any subclasses of RuntimeExeption that might be thrown during the execution of the method but not caught
C、An RuntimeException is a subclass of Throwable that indicates serious problems that a reasonable application should not try to catch.
D、NullPointerException is one kind of RuntimeException

解析:

运行时异常: 都是RuntimeException类及其子类异常,如NullPointerException(空指针异常)、IndexOutOfBoundsException(下标越界异常)等,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。

       运行时异常的特点是Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。
非运行时异常 (编译异常): 是RuntimeException以外的异常,类型上都属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常,一般情况下不自定义检查异常。

12、下列Java代码中的变量a、b、c分别在内存的____存储区存放。   C

class A {
    private String a = “aa”;
    public boolean methodB() {
        String b = “bb”;
        final String c = “cc”;
    }
}
 
A、堆区、堆区、堆区
B、堆区、栈区、堆区
C、堆区、栈区、栈区
D、堆区、堆区、栈区
E、静态区、栈区、堆区
F、静态区、栈区、栈区

解析:

A是类中的成员变量,存放在堆区。

B、C都是方法中的局部变量,存放在栈区。

13、下列说法正确的有(ACD )

A、环境变量可在编译source code时指定
B、在编译程序时,所能指定的环境变量不包括class path
C、javac一次可同时编译数个Java源文件
D、javac.exe能指定编译结果要置于哪个目录(directory)

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

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

解析:

final的作用:
    1. 修饰变量,变量的引用地址不可变,但是地址中的内容可以变。
    2. 修饰方法,方法不可被重写,但是还是可以重载
    3. 修饰类,类不可继承。
 
不可变类,说的是一个类一旦被实例化,就不可改变自身的状态。常见的比如String和基本数据类型的包装类,对于这种不可变类,一旦在进行引用传递的时候,形参一开始就和实际参数指向的不是一个地址,所以在方法中对形参的改变,并不会影响实际参数。
 
 
 
 
15、有以下一个对象:
public class DataObject implements Serializable{
    private static int i=0;
    private String word=" ";
    public void setWord(String word){
        this.word=word;
    }
    public void setI(int i){
        Data0bject. i=I;
     }
}
创建一个如下方式的DataObject:
DataObject object=new Data0bject ( );
object. setWord("123");
object. setI(2);
将此对象序列化为文件,并在另外一个JVM中读取文件,进行反序列化,请问此时读出的Data0bject对象中的word和i的值分别为:  D
A、"", 0
B、"", 2
C、"123", 2
D、"123", 0

解析:

序列化保存的是对象的状态,静态变量属于类的状态,因此,序列化并不保存静态变量。所以i是没有改变的。

16、关于异常的编程,以下描述错误的是:( A )

A、在有除法存在的代码处,为了防止分母为零,必须抛出并捕获异常
B、int i=Integer.parseInt(”123a”);将产生NumberFormatException
C、int a[]=null; a[0]=1; 将产生NullPointerException
D、输入输出流编程中,读和写时都要抛出IOException

17、从运行层面上来看,从四个选项选出不同的一个。  B

A、JAVA
B、Python
C、objectC
D、C#

解析:

Python  只有它是动态语言
动态语言的定义:动态编程语言   是   高级程序设计语言   的一个类别,在计算机科学领域已被广泛应用。它是一类   在 运行时可以改变其结构的语言   :例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力。众所周知的   ECMAScript   (   JavaScript   )便是一个动态语言,除此之外如   PHP   、   Ruby   、   Python   等也都属于动态语言,而   C   、   C++   等语言则不属于动态语言。

18、从内存实现或者反射的角度来看,关于继承的说法正确的是(A)。

注:此处的继承不代表能调用
A、子类将继承父类的所有的数据域和方法
B、子类将继承父类的其可见的数据域和方法
C、子类只继承父类public方法和数据域
D、子类只继承父类的方法,而不继承数据域

解析:

在一个子类被创建的时候,首先会在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类的对象。所以所谓的继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象确实拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。

19、java8中,忽略内部接口的情况,不能用来修饰interface里的方法的有( AC)

A、private
B、public
C、protected
D、static

解析:

Java8的接口方法可以有如下定义
only public, abstract, default, static and strictfp are permitted
 

20、以下哪种JAVA的变量表达式使得变量a和变量b具有相同的内存引用地址(  AB)

A、String a = "hello"; String b = "hello";
B、Integer a; Integer b = a;
C、int a = 1; Integer b = new Integer(1);
D、int a = 1; Integer b = 1;

解析:

内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。
int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法
==
A对  指向常量池里的"hello"。
B对  题中没说声明的a是局部变量。
C错  int a =1;并不指向堆中,它只有值,没有引用地址,Integer b =new Integer(1);指向堆中地址为1的位置。
D错  原因同C

原文地址:https://www.cnblogs.com/buhuiflydepig/p/12335130.html