第二周

基础

1

尝试编译以下程序会产生怎么样的结果?()

1
2
3
4
5
6
7
8
9
public class MyClass {
long var;
public void MyClass(long param) { var = param; }//(1)
public static void main(String[] args) {
MyClass a, b;
a =new MyClass();//(2)
b =new MyClass(5);//(3)
}
}
  • A:编译错误将发生在(1),因为构造函数不能指定返回值
  • B:编译错误将发生在(2),因为该类没有默认构造函数
  • C:编译错误将在(3)处发生,因为该类没有构造函数,该构造函数接受一个int类型的参数
  • D:该程序将正确编译和执行
查看答案 答案:C

解析:

这道题一定要看仔细了,MyClass方法并不是构造参数,而是返回类型为void的普通方法,普通方法自然需要实例化对象然后去调用它,所以124不对,第三个是正确的,因为没有带参数的构造器,所以自然不能传一个int进去。

2

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

注:此处的继承不代表能调用

  • A:子类将继承父类的所有的数据域和方法
  • B:子类将继承父类的其可见的数据域和方法
  • C:子类只继承父类public方法和数据域
  • D:子类只继承父类的方法,而不继承数据域
查看答案 答案:A

解析:

子类可以继承父类的全部数据域和方法,但是这里继承代表的是“拥有”,即:只是拥有父类的全部数据域和方法,但不具备对某些私有数据域或私有方法的使用权(调用)。

这道题明确标注:此处的继承不代表能调用。

3

java语言的下面几种数组复制方法中,哪个效率最高?

  • A:for 循环逐一复制
  • B:System.arraycopy
  • C:Array.copyOf
  • D:使用clone方法
查看答案 答案:B

解析:

复制的效率System.arraycopy>clone>Arrays.copyOf>for循环

这里面在System类源码中给出了arraycopy的方法,是native方法,也就是本地方法,肯定是最快的。而Arrays.copyOf(注意是Arrays类,不是Array实现的,在源码中是调用System.copyOf的,多了一个步骤,肯定就不是最快的。

4

下列代码的输出结果是_

  • A:true
  • B:false
  • C:null
  • D:空字符串
查看答案 答案:B

解析:

== 优先级高于 三目运算符,先判断 true == true,此时返回为 true,

这时表达式为 boolean b = true?false:true?false:true

此时三目运算符从右向左执行,true?false:true,返回false

这时表达式为 boolean b = true?false:false;

结果为:boolean b = false ;

5

(多选)Which statement declares a variable a which is suitable for referring to an array of 50 string objects?(Java)

  • A:char a[][];
  • B:String a[];
  • C:String[] a;
  • D:Object a[50];
  • E:String a[50];
  • F:Object a[];
查看答案 答案:BCF

解析:

在java 中,声明一个数组时,不能直接限定数组长度,只有在创建实例化对象时,才能对给定数组长度。

如下,1、2、3可以通过编译,4、5不行。而String是Object的子类,所以上述BCF均可定义一个存放50个String类型对象的数组。

  1. String a[]=new String[50];

  2. String b[];

  3. char c[];

  4. String d[50];

  5. char e[50];

6

运行代码,输出的结果是()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class P {
public static int abc = 123;
static{
System.out.println("P is init");
}
}
public class S extends P {
static{
System.out.println("S is init");
}
}
public class Test {
public static void main(String[] args) {
System.out.println(S.abc);
}
}
  • A:P is init
    123
  • B:S is init
    P is init
    123
  • C:P is init
    S is init
    123
  • D:S is init
    123
查看答案 答案:A

解析:

被动引用不会出发子类初始化

1.子类引用父类的静态字段,只会触发子类的加载、父类的初始化,不会导致子类初始化

2.通过数组定义来引用类,不会触发此类的初始化

3.常量在编译阶段会进行常量优化,将常量存入调用类的常量池中, 本质上并没有直接引用到定义常量的类,因此不会触发定义常量的类的初始化。

7

下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试。

  • A:java.exe
  • B:javadoc.exe
  • C:jdb.exe
  • D:javaprof.exe
查看答案 答案:C

解析:

javac.exe是编译.java文件

java.exe是执行编译好的.class文件

javadoc.exe是生成Java说明文档

jdb.exe是Java调试器

javaprof.exe是剖析工具

class A {}
class B extends A {}
class C extends A {}
class D extends B {}
(多选)Which four statements are true ?