天梯180406
1. (不定项)Which are keywords in Java?
A. null
B. true
C. sizeof
D. implements
E. instanceof
2. JAVA语言的下面几种数组复制方法中,哪个效率最高?
A. for循环逐一复制
B. System.arraycopy
C. Arrays.copyof
D. 使用clone方法
3. 代码片段:
byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);
关于上面代码片段叙述正确的是()
A. 输出结果:13
B. 语句:b6=b4+b5编译出错
C. 语句:b3=b1+b2编译出错
D. 运行期抛出异常
4. 下列语句正确的是:
A. 形式参数可被字段修饰符修饰
B. 形式参数不可以是对象
C. 形式参数为方法被调用时真正被传递的参数
D. 形式参数可被视为local variable
5. 下列说法正确的是()?
A. 对于局部内部类,只有在方法的局部变量被标记为final或局部变量是effctively final的,内部类才能使用它们
B. 成员内部类位于外部类内部,可以直接调用外部类的所有方法(静态方法和非静态方法)
C. 由于匿名内部类只能用在方法内部,所以匿名内部类的用法与局部内部类是一致的
D. 静态内部类可以访问外部类的成员变量
//---------------------分割线------------------------
DE
B
C
D
AB
答案详解:
1. DE
java中true ,false , null在java中不是关键字,也不是保留字,它们只是显式常量值,但是你在程序中不能使用它们作为标识符
2. System.arraycopy()源码。可以看到是native方法:native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。 可以将native方法比作Java程序同C程序的接口。
public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
它是个native方法,测试结果表明,
当数组很小,但存是调用次数多的话。
使用它复制数组并不比for循环手工复制数组快。
但是如果是数组比较大,那么使用System.arraycopy会比较有优势,因为其使用的是内存复制,省去了大量的数组寻址访问等时间。
Arrays.copyOf()源码,可以看到本质上是调用的arraycopy方法。,那么其效率必然是比不上 arraycopy的
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
而clone()和System.arraycopy只是从实验的结果来看是System.arraycopy的效率高。
3. Java中的byte,short,char进行计算时都会提升为int类型。
被final修饰的变量是常量,这里的b6=b4+b5可以看成是b6=10;在编译时就已经变为b6=10了
而b1和b2是byte类型,java中进行计算时候将他们提升为int类型,再进行计算,b1+b2计算后已经是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会通过,需要进行强制转换。
4. local variable 局部变量;形参只能被 final修饰,不过一般情况下,一个方法的形参不用final修饰。只有在特殊情况下,那就是:方法内部类.一个方法内的内部类如果使用了这个方法的参数或者局部变量的话,这个参数或局部变量应该是final。职位为什么内部类必须要用final修饰的变量?因为
一.Java设计者想要匿名函数或者Lambda函数内部外部保持数据一致性(知道了目的才好理解)二. 然而Java只是实现了capture-by-value形式的闭包,也就是匿名函数内部会重新拷贝一份自由变量,然后函数外部和函数内部就有两份数据。三. 那么要想实现1中的目的,只能要求两处变量不变。JDK8之前要求使用final修饰,JDK8聪明些了,可以使用effectively final的方式。总之,两边不变就行了。
5. 局部内部类,和匿名内部类对于 形参的要求相同,第四题搞清就OK。成员内部类,即是 非静态内部类。C选项错在 怎么可能用法一致呢,匿名只能用一次,局部在自己的域内可以用多次;而且匿名类用在任何允许存在表达式的地方,而局部内部类用于在任何允许出现局部变量的地方出现。