12.11 第二周周测错题总结

错题一

以下程序输出结果为? String s = null; System.out.println(s);

A.不输出

B.空字符串

C.null

D.编译出错

解析:本题出自思科大数据开发工程师的笔试题。

System.out.println()括号中如果传入null,不同形式的null最终的输出也不同。如果是直接传入null:

System.out.println(null);

会在编译时报错,即无法确定传入的值是属于字符数组对象还是String对象

System.out.println()在输出结果的时候括号内的参数有两种,char[]和String(或Object)。一般必须显式指定传入的值所属的对象类别。如果传入Object或String对象:

  1.  
    Object o = null;
  2.  
    String s = null;
  3.  
    System.out.println(o);
  4.  
    System.out.println(s);

输出如下所示:

  1.  
    null
  2.  
    null

所以如果传入的null值是Object或者String对象的形式,最终的输出就是null。但如果传入的是字符数组char[]

  1.  
    char[] a = null;
  2.  
    System.out.println(a);

最终会抛出空指针异常,如下所示:

  1.  
    Exception in thread "main" java.lang.NullPointerException
  2.  
    at java.io.Writer.write(Writer.java:127)
  3.  
    at java.io.PrintStream.write(PrintStream.java:470)
  4.  
    at java.io.PrintStream.print(PrintStream.java:620)
  5.  
    at java.io.PrintStream.println(PrintStream.java:759)
  6.  
    ...

因为数组的引用指向null,所以访问该字符数组对象时就会找不到实际的char[]实例,就不会有正常输出。

可参考这个外国教授的博客 https://yourbasic.org/print-null-java/

备注:null没有长度,输出null字符串.length(),会报空指针错误。

错题二

面向对象语言比面向过程语言更为高级,更有效率。

A.对 B.错误

解析Java是编译型语言,效率比汇编语言那些底层语言C语言之类的要低。

 

错题三(没错但可能会错)

假设已经存在一个Pig类,那么如下代码无法编译通过 Pig pig = null; pig.eat();

A.是 B.不是

解析:

一个空对象也是对象,同样通过对象名引用方法或属性,但和一般对象有点不同。 1.空对象调用非静态方法会出现空指针异常,这是因为一个null对象自身的存储空间内是没有任何方法和属性的,所以任何空对象调用非静态方法或属性都会出现空指针异常;但空对象可以调用静态方法或属性,这是因为Static方法是存储在静态池当中的,一个类的所有对象共享静态池的方法;另外,我们可以理解null为空类型的对象,当必要的时候,他除了没有属性和方法之外,可以强制转换为任意类型的对象

 

错题四(没错但可能会错)

覆盖的方法和被覆盖的方法必须具有完全相同的方法名、参数列表和返回类型

A.是 B.不是

解析:看似应该选A,但是覆盖方法与被覆盖方法参数列表的顺序不必一模一样。

方法覆盖也叫方法重写。
条件一:两个类必须要有继承关系
条件二:重写之后的方法和之前的方法具有:
       相同的返回值类型(也可以子类的返回值类型小于父类的返回值类型,那样也算是重写)
       相同的方法名
       相同的形式参数列表
条件三:访问权限不能更低,可以更高(这个可以先记住)
       父类原先是public,不能低于public
       父类原先是protected,子类可以是public
条件四:重写之后的方法不能比之前的方法抛出更多的异常,可以更少.(这个先记住)
       父类子类没有异常,父类抛出异常,程序正常运行
       父类子类没有异常,子类抛出异常,程序报错:

 

错题五

如果类中的成员变量只可以被同一包访问,则使用private约束符

A.是 B.不是

解析:这题涉及到的知识点是访问控制修饰符。

如果类中的成员变量只可以被同一包访问,要使用的约束符是no modifier即default默认什么也不写或者protected。

修饰符 当前类 同一包内 子孙类(同一包) 子孙类(不同包) 其他包
public Y Y Y Y Y
protected Y Y Y Y/N N
default Y Y Y N N
private Y N N N N

 

错题六

abstract的method是可同时是static

A.是 B.不是

解析:

1、abstract是抽象的,指的是方法只有声明而没有实现,他的实现要放入声明该类的子类中实现。2、static是静态的,是一种属于类而不属于对象的方法或者属性。

abstract申明的方法是要求子类去实现的,abstract只是告诉你有这样一个接口,你要去实现。static方法是不会被覆盖的,而abstract方法正是要子类去覆盖它,所以也是没有意义的。所以,总的来说,就是java语法不允许你这样做,事实上,也没有意义这样做。

 

错题七

抽象类可以直接实例化

A.是 B.不是

解析:

抽象类不能直接通过new去实例化一个对象,那它就是不能实例化。要获取抽象类的对象,需要先用一个类继承抽象类,然后去实例化子类。也可以用匿名内部类,在抽象类中创建一个匿名的子类,继承抽象类,通过特殊的语法实例化子类的对象。

15:57:16 2021-12-11

posted on 2021-12-11 15:58  heyiyang1312  阅读(5)  评论(0)    收藏  举报

导航