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对象:
-
Object o = null;
-
String s = null;
-
System.out.println(o);
-
System.out.println(s);
输出如下所示:
-
null
-
null
所以如果传入的null值是Object或者String对象的形式,最终的输出就是null。但如果传入的是字符数组char[]:
-
char[] a = null;
-
System.out.println(a);
最终会抛出空指针异常,如下所示:
-
Exception in thread "main" java.lang.NullPointerException
-
at java.io.Writer.write(Writer.java:127)
-
at java.io.PrintStream.write(PrintStream.java:470)
-
at java.io.PrintStream.print(PrintStream.java:620)
-
at java.io.PrintStream.println(PrintStream.java:759)
-
...
因为数组的引用指向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) 收藏 举报
浙公网安备 33010602011771号