暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【Java笔记】SE阶段测试错题集

半猫Coder 2021-03-02
269

错了好多,裂开




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():

    1. 字符串比较用compareTo()时:

      1. 长度相同,从第一位开始比较,如果相同返回0,如果不同则马上返回这两个字符的ascii值的差值。

      2. 长度不同,直接返回长度差。

    2. Integer比较用compareTo()时:

      1. 对比数字时相同,返回0

      2. 对比数字不同时,返回-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={0123};

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);

              }

       }

}


解:正常结束没有任何输出

    1. 因为在Thread子类中,没有覆盖父类的run方法,而是覆盖了父类的start()方法

    2. 所以,在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

    1. 首先,执行main方法中的创建对象的语句Reluctant b = newReluctant();

    2. 但是,在创建对象的过程中,会执行成员变量的初始化语句privateReluctant internalInstance = new Reluctant(); ,于是又会创建Reluctant对象,于是又执行a,a执行完了,又执行b... 如此周而复始

    3. 于是,就出现了一个递归。




12. java中父类中定义的哪些方法没有多态效果,为什么


解:考虑到多态发生的条件是,

1)继承

2)方法覆盖

3)父类引用指向子类实例

所以哪些方法(行为),实现不了多态效果呢?不能在子类中被覆盖的方法

    1. 父类中的private方法(不能被子类覆盖)

    2. 父类中的构造方法(不能被子类继承)

    3. 父类中的静态方法(不能被子类覆盖)

    4. 父类中被final修饰的方法(不能被子类覆盖)




13. "=="和equals方法有何异同?


解:== 对于基本数据类型的数据而言,比较的是内容,对于引用数据类型的数据而言,比较的引用变量,所指向的内存地址。


equals方法是Object类的方法,其默认实现是比较两个对象的内存地址是否相同,若想:要比较量对象的内容是否相同,则需要在子类中覆盖Object的equals方法




14. 字符流和字节流最主要的区别是什么?如何理解字符流=字节流+编码表?


解:字节流和字符流最主要的区别是,流中数据的逻辑单位不同,字节流中数据的逻辑单位是二进制的字节数据,而字符流中,数据的逻辑单位是单个字符。

    1. 字符数据在内存中还是以二进制(字符的在编码表中对应的编码值)的形式保存和传输

    2. 而对于二进制的字节数据的写和读,字节流就已经能够很好的完成了

    3. 但为了保证字符流中的数据是一个一个的完整字符,所以字符流在字节流的基础上,添加了编解码器,即在使用底层字节流写数据前,先利用编码器,对字符数据进行编码得到字符数据对应的二进制编码序列,然后利用底层字节流传输它们,同时,在读取数据的时候,先用解码器,将由底层字节流传输的字节数据,解码成一个一个的字符。

所以字符流的功能实现是字节流 + 编码表(基于编码表的编解码操作)




15. 同步和异步有何异同,在什么情况下分别使用他们?


解:异步简单来说就是,线程之间,各自独立运行,互不影响,就好像线程之间“同时”,在各自做自己的事情,简单来说,就是我走你也走

同步和异步相对,同步是指线程之间不能在各自为政,自己运行自己的,而是在某些情况下等待其他线程。简单来说,就是我走你不走。

线程天生就是异步执行的,而当多线程异步访问同一个共享数据的时候,为了保证共享数据访问的正确性,必须保证同时只有一个线程,能访问并修改共享变量的值,这意味着,如果一个线程正在,访问某共享变量,则其他所有要访问该共享变量的线程都需要等待,直到,该线程访问完毕。





图源自 twi:_TAkE_666


文章转载自半猫Coder,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论