错了好多,裂开
1. 下列代码中,哪句代码会报错()
A. byte b = 127;
B. byte b = 10; b += 1;
C. byte b = 11; b = b + 1;
D. char c = 97;
解:C
b=b+1中,是byte类型和int类型进行计算,byte自动转型成int,但是左边赋值给byte,所以会报错。应该强制转型后赋值给b。
b+=1中,存在隐式强制转型。
2. 下面代码的运行结果为:()
importjava.io.*;
importjava.util.*;
public classfoo{
public static void main (String[] args){
String s;
System.out.println("s=" +s);
}
}
A. 代码得到编译,并输出“s=”
B. 代码得到编译,并输出“s=null”
C. 由于String s没有初始化,代码不能编译通过
D. 代码得到编译,但捕获到 NullPointException异常
解:C
String s; 语句只是声明,没有在堆上创建对象,只有在new的时候,引用数据类型才会自动默认赋值。
另:基本数据类型必须初始化。
3. 在TCP/IP中,解决计算机到计算机之间通信问题的层次是 _____。
A. 网络接口层
B. 网际层
C. 传输层
D. 应用层
解:B
4. 如下程序打印的结果是什么呢?
(注:答案包括编译失败 或运行异常。请说明结果的同时注明原因,下面同上)
String str1 = "hello";
String str2 = “he”;
System.out.println(str1.compareTo(str2));
解:输出3。按照String类compareTo的源码,这两个字符串比较的结果应该是str1.length() - str2.length()的结果
compareTo():
字符串比较用compareTo()时:
长度相同,从第一位开始比较,如果相同返回0,如果不同则马上返回这两个字符的ascii值的差值。
长度不同,直接返回长度差。
Integer比较用compareTo()时:
对比数字时相同,返回0
对比数字不同时,返回-1
5. 如下程序打印的结果是什么呢?
如果在同包的某个main方法中运行Fatherfather = new Son(1000),程序的输出结果是什么?
class Father {
int i = 10;
public Father() {
System.out.println(getI());
}
public int getI() {
return i;
}
}
class Son extendsFather {
int i = 100;
public Son(int i) {
this.i = i;
}
public int getI() {
return i;
}
}
解:打印结果为0,父类方法被子类覆盖,即使在父类中调用,调用到的也是子类方法,而此时父类对象还在初始化过程中,子类对象更是还未开始初始化,其成员变量的值还是默认值。
6. 如下程序打印的结果是什么呢?
public classAnimalFarm{
public static void main(String[] args){
final String pig = "length: 10";
final String dog = "length: " +pig.length();
System.out. println("Animals are equal: "+ pig == dog);
}
}
解:false
先拼接"Animalsare equal: " + pig得到新的字符串,然后再比较==
7. 如下程序打印的结果是什么呢?
class Dog {
public static voidbark() {
System.out.print("woof ");
}
}
class Basenji extends Dog {
public static voidbark() {
}
}
public class Bark {
public static voidmain(String args[]) {
Dog woofer = newDog();
Dog nipper = newBasenji();
woofer.bark();
nipper.bark();
}
}
解:woof woof
静态方法不能被覆盖,所以两次方法调用实际上调用的都是父类,Dog类中定义的静态方法,所以输出两次woof
8. 如下程序打印的结果是什么呢?
public class Test{
public static void main(String[]args){
int[]x={0,1,2,3};
for(int i=0;i<3;i+=2){
try{
system.out.println(x[i+2]/x[i]+x[i+1]);
}catch(ArithmeticExceptione){
System.out.println("errorl");
}catch(Exception e){
System.out.println("error2");
}
}
}
}
解:error1 error2
a. 当i值为0时,执行第一次for循环,此时try块中输出语句中输出的计算表达式是在 求 2 / 0 + 1,很显然,发生除0异常,输出error1
b. 紧接着执行第二次循环,此时i值为2,try块的输出语句中计算的是 x[4] / x[2] + x[3], 此时x[4]数组越界,于是输出error2
9. 如下程序打印的结果是什么呢?
public class TestMain {
static {
System.out.println("C");
}
{
System.out.println("B");
}
public TestMain(){
System.out.println("A");
}
public static voidmain(String[] args) {
TestMain testMain = new TestMain();
}
}
解:C B A
静态代码块先于构造代码块,构造代码块先于构造方法
10. 如下程序打印的结果是什么呢?
public class Bground extendsThread{
public static voidmain(String[] args){
Bground bground=newBground();
bground.run();
}
public void start(){
for (int i = 0; i< 10; i++) {
System.out.println("Bground.start()"+i);
}
}
}
解:正常结束没有任何输出
因为在Thread子类中,没有覆盖父类的run方法,而是覆盖了父类的start()方法
所以,在Thread子类对象上调用的run方法,实际是Thread类中定义的run方法。而根据Thread类的run方法源码,什么都不会输出
11. 如下程序打印的结果是什么呢?
public class Reluctant {
private ReluctantinternalInstance = new Reluctant();
publicReluctant() throws Exception {
throw newException("I'm not coming out");
}
public static voidmain(String[] args) {
try {
Reluctant b = newReluctant();
System.out.println("Surprise!");
} catch (Exceptionex) {
System.out.println("Itold you so");
}
}
}
解:Stackoverflow error
首先,执行main方法中的创建对象的语句Reluctant b = newReluctant();
但是,在创建对象的过程中,会执行成员变量的初始化语句privateReluctant internalInstance = new Reluctant(); ,于是又会创建Reluctant对象,于是又执行a,a执行完了,又执行b... 如此周而复始
于是,就出现了一个递归。
12. java中父类中定义的哪些方法没有多态效果,为什么?
解:考虑到多态发生的条件是,
1)继承
2)方法覆盖
3)父类引用指向子类实例
所以哪些方法(行为),实现不了多态效果呢?不能在子类中被覆盖的方法
父类中的private方法(不能被子类覆盖)
父类中的构造方法(不能被子类继承)
父类中的静态方法(不能被子类覆盖)
父类中被final修饰的方法(不能被子类覆盖)
13. "=="和equals方法有何异同?
解:== 对于基本数据类型的数据而言,比较的是内容,对于引用数据类型的数据而言,比较的引用变量,所指向的内存地址。
equals方法是Object类的方法,其默认实现是比较两个对象的内存地址是否相同,若想:要比较量对象的内容是否相同,则需要在子类中覆盖Object的equals方法
14. 字符流和字节流最主要的区别是什么?如何理解字符流=字节流+编码表?
解:字节流和字符流最主要的区别是,流中数据的逻辑单位不同,字节流中数据的逻辑单位是二进制的字节数据,而字符流中,数据的逻辑单位是单个字符。
字符数据在内存中还是以二进制(字符的在编码表中对应的编码值)的形式保存和传输
而对于二进制的字节数据的写和读,字节流就已经能够很好的完成了
但为了保证字符流中的数据是一个一个的完整字符,所以字符流在字节流的基础上,添加了编解码器,即在使用底层字节流写数据前,先利用编码器,对字符数据进行编码得到字符数据对应的二进制编码序列,然后利用底层字节流传输它们,同时,在读取数据的时候,先用解码器,将由底层字节流传输的字节数据,解码成一个一个的字符。
所以字符流的功能实现是字节流 + 编码表(基于编码表的编解码操作)
15. 同步和异步有何异同,在什么情况下分别使用他们?
解:异步简单来说就是,线程之间,各自独立运行,互不影响,就好像线程之间“同时”,在各自做自己的事情,简单来说,就是我走你也走
同步和异步相对,同步是指线程之间不能在各自为政,自己运行自己的,而是在某些情况下等待其他线程。简单来说,就是我走你不走。
线程天生就是异步执行的,而当多线程异步访问同一个共享数据的时候,为了保证共享数据访问的正确性,必须保证同时只有一个线程,能访问并修改共享变量的值,这意味着,如果一个线程正在,访问某共享变量,则其他所有要访问该共享变量的线程都需要等待,直到,该线程访问完毕。

图源自 twi:_TAkE_666




