java笔试题

  • 在基本JAVA类型中,如果不明确指定,整数型的默认是什么类型?带小数的默认是什么类型?(int double)

  • 下列关于java 中的 wait()方法和 sleep()方法的区别描述错误的是?(D)

A.wait()方法属于Object类,sleep()属于Thread类
B.调用wait()方法的时候,线程会放弃对象锁
C.调用sleep()方法的过程中,线程不会释放对象锁
D.sleep()方法导致了程序暂停执行指定的时间,让出cpu给其他线程

解析:
sleep和wait的区别有:
1,这两个方法来自不同的类分别是Thread和Object
2,最主要是sleep方法没有释放锁,而wait方法释放了锁,使得敏感词线程可以使用同步控制块或者方法。
3,wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
4,sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

  • 下列说法正确的是(B)

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

解析:所谓类的方法就是指类中用static 修饰的方法(非static 为实例方法),在类方法中不能有关键字

  • try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后

答:会执行,在return前执行

  • 以下代码将打印出

public static void main (String[] args) {
String classFile = "com.jd.". replaceAll(".", "/") + "MyClass.class";
System.out.println(classFile);
}
A.com. jd
B.com/jd/MyClass.class
C./////////MyClass.class
D.com.jd.MyClass

解析:
C。由于replaceAll方法的第一个参数是一个正则表达式,而"."在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成"/"。如果想替换的只是".",那么久要写成"\.".

  • 代码片段

byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);
关于上面代码片段叙述正确的是(C)
A.输出结果:13
B.语句:b6=b4+b5编译出错
C.语句:b3=b1+b2编译出错
D.运行期抛出异常
解析:被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了
而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。
Java中的byte,short,char进行计算时都会提升为int类型。

  • Which are keywords in Java?(DE)

A.null
B.true
C.sizeof
D.implements
E.instanceof

解析

java笔试题_第1张图片
image.png

  • Java程序可以分为两类:java application 和java applet。前者是完整的应用程序,需要独立的解释器来解释运行;后者则是嵌在网页中的非独立程序,由浏览器所自带的java解释器来解释运行。

  • 关于以下application,说法正确是什么?(B)

public class Test {
static int x=10;
static {x+=5;}
public static void main(String[] args) //4
{
System.out.println("x="+x);
}
static{x/=3;};
}//9

A.4行与9行不能通过编译,因为缺少方法名和返回类型
B.编译通过,执行结果是:x=5
C.编译通过,执行结果是:x=3
D.9行不能通过编译,因为只能有一个静态初始化器

解析:静态块:用static申明,JVM加载类时执行,仅执行一次,且按声明顺序执行
构造块:类中直接用{}定义,每一次创建对象时执行
执行顺序优先级:静态块>main()>构造块>构造方法

Java初始化顺序:
1 继承体系的所有静态成员初始化(先父类,后子类)
2 父类初始化完成(普通成员的初始化-->构造函数的调用)
3 子类初始化(普通成员-->构造函数)

  • 如下代码的 输出结果是什么?(D)

public class Test {
public int aMethod() {
static int i = 0;
i++;
return i;
}
public static void main (String args[]) {
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}

A.0
B.1
C.2
D.编译失败

解析:静态变量只能在类主体中定义,不能在方法中定义

  • 对Collection和Collections描述正确的是(BD)

A.Collection是java.util下的类,它包含有各种有关集合操作的静态方法
B.Collection是java.util下的接口,它是各种集合结构的父接口
C.Collections是java.util下的接口,它是各种集合结构的父接口
D.Collections是java.util下的类,它包含有各种有关集合操作的静态方法

解析:java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

  • 下列正确的有( ACD)

A.call by value不会改变实际参数的数值
B.call by reference能改变实际参数的参考地址
C.call by reference不能改变实际参数的参考地址
D.call by reference能改变实际参数的内容

解析:引用数据类型是引用传递(call by reference),基本数据类型是值传递(call by value)

  • 下列关于Java语言中String和char的说法,正确的是(C)

A.String是Java定义的一种基本数据类型。
B.String是以“\0”结尾的char类型的数组char[]。
C.使用equals()方法比较两个String是否内容一样(即字符串中的各个字符都一样)。
D.Char类型在Java语言里面存储的是ASCII码。

解析:A 基本数据类型包括byte,short,int,long,float,double,char,boolean,所以A错。
B,C语言当中是这样,java不是, String内部是用char[]数组实现的,不过结尾不用\0。
C 对,字符串内容比较用equals方法。
D char存储的unicode码,不仅可以存储ascII码,汉字也可以。

  • 下列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都是方法中的局部变量,存放在栈区
堆区:只存放类对象,线程共享;
方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;

  • 在Java语言中,下列关于字符集编码(Character set encoding)和国际化(i18n)的问题,哪些是正确的?(CD)

A.每个中文字符占用2个字节,每个英文字符占用1个字节
B.假设数据库中的字符是以GBK编码的,那么显示数据库数据的网页也必须是GBK编码的。
C.Java的char类型,通常以UTF-16 Big Endian的方式保存一个字符。
D.实现国际化应用常用的手段是利用ResourceBundle类

解析:
A 显然是错误的,Java一律采用Unicode编码方式,每个字符无论中文还是英文字符都占用2个字节。
B 也是不正确的,不同的编码之间是可以转换的,通常流程如下:
将字符串S以其自身编码方式分解为字节数组,再将字节数组以你想要输出的编码方式重新编码为字符串。
例:String newUTF8Str = new String(oldGBKStr.getBytes("GBK"), "UTF8");
C 是正确的。Java虚拟机中通常使用UTF-16的方式保存一个字符
D 也是正确的。ResourceBundle能够依据Local的不同,选择性的读取与Local对应后缀的properties文件,以达到国际化的目的。

  • 类中声明的变量有默认初始值;方法中声明的变量没有默认初始值,必须在定义时初始化,否则在访问该变量时会出错。

boolean类型默认值是false

  • 结果是(B)

public class Example{
String str = new String("good");
char[] chs = {'a','b','c'};
public static void main(String[] args) //4
{
Example ex = new Example(); ex.change(ex.str, ex.chs);
System.out.print(ex.str+" and ");
System.out.print(ex.chs);
}
public void change(String str, char[] chs){
str= "test ok";
chs[0] = 'g';
}
}

A.good and abc
B.good and gbc
C.test ok and abc
D.test ok and gbc
解析:
首先明确 这里str和数组都是对象都是引用传递
,首先得清楚类中的str和change方法中的str都是指向堆中的new String("
good"
)对象,但是它们不是同一个东西,类似于指向同一个对象的不同的指针。首先str="test ok"
使得change()中的str指向"test ok"这个常量字符串(也可以说这个字符串对象),根本的原因就是
由于java字符串对象是不能修改的,无法像数组一样可以在原来的地址上对数组的值进行修改。
但是原来的类中的str指向的还是
new String("
good"
)这个对象,chs[0] = 'g',把原来chs[0]中的'a'改为'g'。
所以就会出现上面的结果

  • 以下关于final关键字说法错误的是(AC)

A.final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
B.final修饰的类肯定不能被继承
C.final修饰的方法不能被重载
D.final修饰的变量不允许被再次赋值

解析:
final修饰类、方法、属性!不能修饰抽象类,因为抽象类一般都是需要被继承的,final修饰后就不能继承了。
final修饰的方法不能被重写而不是重载!
final修饰属性,此属性就是一个常量,不能被再次赋值!

  • 关于sleep()和wait(),以下描述错误的一项是( D)

A.sleep是线程类(Thread)的方法,wait是Object类的方法;
B.sleep不释放对象锁,wait放弃对象锁
C.sleep暂停线程、但监控状态仍然保持,结束后会自动恢复
D.wait后进入等待锁定池,只有针对此对象发出notify方法后获得对象锁进入运行状态

解析:
Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。
共同点 :

  1. 他们都是在多线程的环境下,都可以在程序的调用处阻塞指定的毫秒数,并返回。
  2. wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
    如果线程A希望立即结束线程B,则可以对线程B对应的Thread实例调用interrupt方法。如果此刻线程B正在wait/sleep/join,则线程B会立刻抛出InterruptedException,在catch() {} 中直接return即可安全地结束线程。
    需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用 interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到 wait()/sleep()/join()后,就会立刻抛出InterruptedException 。
    不同点 :
    1.每个对象都有一个锁来控制同步访问。Synchronized关键字可以和对象的锁交互,来实现线程的同步。
    sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
    2.wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用
    3.sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
    4.sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。
    5.wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
  • 下面这三条语句

System.out.println(“is ”+ 100 + 5);
System.out.println(100 + 5 +“ is”);
System.out.println(“is ”+ (100 + 5));
的输出结果分别是? ( D)

A.is 1005, 1005 is, is 1005
B.is 105, 105 is, is 105
C.is 1005, 1005 is, is 105
D.is 1005, 105 is, is 105

解析:
1."is"说明后面的内容都会被强制转换为string,所以是最后结果是拼接起来的
2.100+5先得到105,然后与is拼接
3.先算括号内的

  • 以下关于集合类 ArrayList 、 LinkedList 、 HashMap 描述错误的是:(C)

A.HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值
B.ArrayList和LinkedList均实现了List接口
C.添加和删除元素时,ArrayList的表现更佳
D.ArrayList的访问速度比LinkedList快

解析:
Hashtable不允许 null 值(key 和 value 都不可以),HashMap允许 null 值(key和value都可以)。 ArrayList和LinkedList均实现了List接口
ArrayList基于数组实现,随机访问更快
LinkedList基于链表实现,添加和删除更快

  • 以下代码结果是什么?(C)

public class foo {
public static void main(String sgf[]) {
StringBuffer a=new StringBuffer(“A”);
StringBuffer b=new StringBuffer(“B”);
operate(a,b);
System.out.println(a+”.”+b);
}
static void operate(StringBuffer x,StringBuffer y) {
x.append(y);
y=x;
}
}

A.代码可以编译运行,输出“AB.AB”。
B.代码可以编译运行,输出“A.A”。
C.代码可以编译运行,输出“AB.B”。
D.代码可以编译运行,输出“A.B”。

解析:
这里简单地说,a,b,x,y就是四个指针。y本来指向的是b所指向的对象,但是一个“=”,y就指向了x所指向的目标即是a指向的对象,因此原来b所指向的目标并没有发生任何改变。与y不同的是,x进行的是对象操作,此时此对象在内存中是真正的本质上的改变。有点绕,但是手机打字,没发画图,不然其实很容易理解。

  • Java类Demo中存在方法func0、func1、func2、func3和func4,请问该方法中,哪些是不合法的定义?( AD)

public class Demo{
  float func0()
  {
    byte i=1;
    return i;
  }
  float func1()
  {
    int i=1;
    return;
  }
  float func2()
  {
    short i=2;
    return i;
  }
  float func3()
  {
    long i=3;
    return i;
  }
  float func4()
  {
    double i=4;
    return i;
  }
}
A.func1
B.func2
C.func3
D.func4

解析:
数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中 “ 悄然 ” 进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。
自动数据类型转换
自动转换按从低到高的顺序转换。不同类型数据间的优先关系如下:
低 ---------------------------------------------> 高
byte,short,char-> int -> long -> float -> double
运算中,不同类型的数据先转化为同一类型,然后进行运算,转换规则如
下:

操作数 1 类型 操作数 2 类型 转换后的类型
byte 、 short 、 char int int
byte 、 short 、 char 、 int long long
byte 、 short 、 char 、 int 、 long float float
byte 、 short 、 char 、 int 、 long 、 float double double

强制数据类型转换
强制转换的格式是在需要转型的数据前加上 “( )” ,然后在括号内加入需要转化的数据类型。有的数据经过转型运算后,精度会丢失,而有的会更加精确

  • 对于同一类中的两个方法 , 在判断它们是不是重载方法时 , 不考虑(C)

A.参数个数
B.参数类型
C.返回值类型
D.参数顺序

解析:
重载:类中可以创建多个方法,它们具有相同的名字,但具 有不同的参数和不同的定义。调用方法时通过传递 给它们的不同参数个数和参数类型 给它们的不同参数个数和参数类型 给它们的不同参数个数和参数类型 来决定具体使用哪个方法 , 这就是多态性。
重写 Overriding 是父类与子类之间多态性的一种表现, 在子类中定义某方法与其父类有相同的名称和参数。
重载 Overloading 是一个类中多态性 的一种表现。
重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同 也可以不相同。 无法以 返回型别 作为重载函数的区分标准。而且编译的时候只有返回值不同,会报错。及使不报错,运行时无法区分调用哪个方法

  • 在使用super 和this关键字时,以下描述正确的是(A)

A.在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
B.super()和this()不一定要放在构造方法内第一行
C.this()和super()可以同时出现在一个构造函数中
D.this()和super()可以在static环境中使用,包括static方法和static语句块

解析:
使用super()或者this()方法是必须放在构造函数的第一行
由于this函数指向的构造函数默认有super()方法,所以规定this()和super()不能同时出现在一个构造函数中。
因为staic方法或者语句块没有实例时可以使用,而此时不需要构造实例,所以不能用this()和super()

  • 下面代码的输出是什么?(A)

java笔试题_第2张图片
Paste_Image.png

A.null
B.sub
C. base

解析:
new Sub();在创造派生类的过程中首先创建基类对象,然后才能创建派生类。
创建基类即默认调用Base()方法,在方法中调用callName()方法,由于派生类中存在此方法,则被调用的callName()方法是派生类中的方法,此时派生类还未构造,所以变量baseName的值为null

  • 权限表

java笔试题_第3张图片
Paste_Image.png
  • 下面程序的输出结果是?(D)

java笔试题_第4张图片
Paste_Image.png

A.出错
B.342
C.34234
D.3423

解析:
1、try中没有抛出异常,则catch语句不执行,如果有finally语句,则接着执行finally语句,继而接着执行finally之后的语句;
2、try中抛出异常,有匹配的catch语句,则catch语句捕获,如果catch中有return语句,则要在finally执行后再执行;

  • Where statement is true(A)

void waitForSignal()
{
Object obj = new Object();
synchronized(Thread.currentThread())
{
obj.wait();
obj.notify();
}
}

A.This code may throw an InterruptedException
B.This code may throw an IllegalStateException
C.This code may throw a TimeOutException after ten minutes
D.This code will not compile unless”obj.wait()”is replaced with”(Thread)obj).wait()”
E.Reversing the order of obj.wait()and obj.notify()may cause this method to complete normally

解析:
第一,记住wait必须要进行异常捕获
第二,记住调用wait或者notify方法必须采用当前锁调用,即必须采用synchronized中的对象
void waitForSignal() {
Object obj = new Object();
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
obj.notify();
}
}

  • 下列 java 程序输出结果为______。(B)

int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));

A.true,false
B.true,true
C.false,true
D.false,false
E.对于不同的环境结果不同
G.程序无法执行

解析:
本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上)
1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

  • Given the following code:

public class Test {
private static int j = 0;

private static Boolean methodB(int k) {
    j += k;
    return true;
}

public static void methodA(int i) {
    boolean b;
    b = i < 10 | methodB(4);
    b = i < 10 || methodB(8);

}

public static void main(String args[]) {
    methodA(0);
    System.out.println(j);
}

}

What is the result?(B)
A.The program prints”0”
B.The program prints”4”
C.The program prints”8”
D.The program prints”12”
E.The code does not complete.

  • 观察下面的代码

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

A.The type Listis assignable to List.
B.The type Listis assignable to List
.
C.The type Listis assignable to List.
D.The type Listis assignable to List.
E.The type Listis assignable to List.
F.The type Listis assignable to any List reference.
G.The type Listis assignable to List.

解析:

  1. 只看尖括号里边的!!明确点和范围两个概念
  2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List,List,List
  3. 如果尖括号里面带有问号,那么代表一个范围, 代表小于等于A的范围,代表大于等于A的范围,代表全部范围
  4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
  5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
  6. List和List 是相等的,都代表最大范围

  7. 7.补充:List既是点也是范围,当表示范围时,表示最大范围

    public static void main(String[] args) {
    List a;
    List list;
    list = a; //A对,因为List就是List,代表最大的范围,A只是其中的一个点,肯定被包含在内
    List b;
    a = b; //B错,点之间不能相互赋值
    List qm;
    List o;
    qm = o; //C对,List代表最大的范围,List只是一个点,肯定被包含在内
    List d;
    List downB;
    downB = d; //D对,List代表小于等于B的范围,List是一个点,在其中
    List downA;
    a = downA; //E错,范围不能赋值给点
    a = o; //F错,List只是一个点
    downA = downB; //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛
    }

    • if(x=y)会报错的

    解析:
    C语言中
    当if语句中的条件为赋值语句时,实际上是将赋值后的结果与0进行比较
    if(1) 由于1>0 所以认为是true
    java语言中,虽然也用了左值,但是不再与0比较,而是直接将0放入if()中
    但是int类型,不能转换为boolean,所以会报错

    • ava中关于继承的描述正确的是(ACD)

    A.一个子类只能继承一个父类
    B.子类可以继承父类的构造方法
    C.继承具有传递性
    D.父类一般具有通用性,子类更具体

    解析:
    在java中,子类构造器会默认调用super()(无论构造器中是否写有super()),用于初始化父类成员,同时当父类中存在有参构造器时,必须提供无参构造器,子类构造器中并不会自动继承有参构造器,仍然默认调用super(),使用无参构造器。因此,一个类想要被继承必须提供无参构造器。
    PS:方法没有继承一说,只有重载和重写

    • 下面哪些赋值语句是正确的(ABD)

    A.long test=012
    B.float f=-412
    C.int other =(int)true
    D.double d=0x12345678
    E.byte b=128

    解析:
    A和B中long和float,正常定义需要加l和f,但是long和float属于基本类型,会进行转化,所以不会报出异常。AB正确
    boolean类型不能和任何类型进行转换,会报出类型异常错误。所以C错。
    D选项可以这样定义,D正确。
    E选项中,byte的取值范围是-128—127。报出异常: cannot convert from int to byte.所以E选项错误。
    A:012默认是int类型,赋给long类型没错。 正确
    B:-412默认也是int类型,赋给float没错。 正确
    C:很明显布尔类型不能强转成其他数值类型。 错误
    D:0x12345678默认应该是int类型,赋给double没错。 正确
    E:128 > 127默认是int类型,byte默认范围是(-128 ~ 127)。错误

    你可能感兴趣的:(java笔试题)