java错题集

来源:互联网 发布:浩方对战平台mac版本 编辑:程序博客网 时间:2024/05/19 01:33

1.下列java程序的输出结果为____。  

public class Example{    String str=new String("hello");    char[]ch={'a','b'};    public static void main(String args[]){        Example ex=new Example();        ex.change(ex.str,ex.ch);        System.out.print(ex.str+" and ");        System.out.print(ex.ch);    }    public void change(String str,char ch[]){        str="test ok";        ch[0]='c';    }}
A.hello and ab
B.hello and cb
C.hello and a
D.test ok and ab
E.test ok and cb
F.test ok and c

答案是B。解析:对于这里的str ,实参传过来的是一个地址,由于该地址指向的是字符串常量,所以这里不能改变该地址里的内容。而ch[]里面的值是可以改变的。


2.对于abstract声明的类,下面说法正确的是____。

A.可以实例化
B.不可以被继承
C.子类为abstract
D.只能被继承
E.可以被抽象类继承

答案是E。解析:这里得注意一下D答案,我们知道抽象类是不能实例化的,如果抽象类不被继承好像是不能做什么事,但是我们可以声明了放在那里,对我们的程序也没什么影响,所以不是只能被继承。


3.检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。

package algorithms.com.guan.javajicu; 
public class Inc { 
    public static void main(String[] args) { 
       Inc inc = new Inc(); 
       int i = 0; 
       inc.fermin(i); 
       i= i ++; 
       System.out.println(i);
    
    } 
    void fermin(int i){ 
       i++; 
    } 
}

A.0
B.1
C.2
D.3

答案是A。解析:首先fermin函数对i是没有影响的。其次i=i++这里的讲解可以参考一下这篇文章:http://blog.csdn.net/miderph84/article/details/3390166


4.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.运行期抛出异常

答案是C。解析:被final修饰的变量不仅值不能被改变,而且它的类型也不变,所以在参加运算时类型不变,因此B不会报错;而C中b1与b2的类型为byte,在参与运算时会自动提升至int,所以右边做完运算后的类型是int,赋值给b3时应该进行强制转换,这里没有强转,所以C会编译出错。


5.写出下面的答案

public static void main(String[] args) {
// TODO Auto-generated method stub\
Integer i = 100;
Integer j = 100;
System.out.println(j==i);

i = 200;

j = 200;

System.out.println(j==i);

i = new Integer(100);

j = new Integer(100);
System.out.println(j==i);

Integer a = new Integer(1000);  int b = 1000;  System.out.println(a == b);   

}

答案是:true false false。解析:首先Integer是包装类,所以在用“==”比较时,比较的是两个对象的地址值。在jdk1.8的版本中,对于Integer i = 100;这句代码,意思是JVM在内存中分配了一块空间,里面的值为100,当第二次Integer j= 100;时JVM会先去内存中找有没有值为100的,由于已经存在了,所以并不会重新再给它分配一块内存,而是为了节约内存j指向了i的那块内存,因此这里i和j的地址值相同,所以第一个为true。那第二个为什么为false呢?因为jdk1.8中JVM认为只要这个值超过1byte(-128~+127)就会重新给它分配内存,所以此时的i和j的地址不同,结果为false。第三个是因为直接new的两个不同的对象,所以地址不同,结果为false。第四个注意b这里是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,也就是把Integer转成int类型,所以这里进行比较的是int类型的值,所以结果即为true。

原创粉丝点击