1、 给出下面一段代码的打印信息,并说明”==” 与 “equals”的区别(6分)
public class Test
{
public static void main(String[] args)
{
int a = 10;
int b = 10;
float c =10.0f
Integer ain = new Integer(10);
Integer bin = new Integer(10);
Float cfl = new Float(10.0f);
System.out.println(“a == b is “ + (a == b));
System.out.println(“a == c is “ + (a == c));
System.out.println(“ain == bin is “ + (ain == bin));
System.out.println(“ain == cfl is “ + (ain == cfl));
System.out.println(“ain.equals(bin) is “ + (ain.equals(bin)));
System.out.println(“ain.equals(cfl) is “ + (ain.equals(cfl)));
}
}
编译System.out.println(“ain == cfl is “ + (ain == cfl));时出错,基本数据类型与对象类型不能用==比较
equals 方法在非空对象引用上实现相等关系:
对于任何非空引用值 x,x.equals(x) 都应返回 true。
对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
= = 比较基本数据类型时,是比较对象个的实际值;比较对象类型时是比较个对象的hasCode值是否相等;
2、 写出一个懒汉式Singleton出来(5分)
public class Singleton {
private Singleton(){}
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,可以直接访问
public static Singleton getInstance() {
return instance;
}
}
3、 String s = new String(“zte”);创建了几个String Object?(4分)
2个String Object
一个是参数”zte”
还有一个是通过构造函数生成与该参数相同的字符序列的新的String Object
4、 short s1 = 1;s1 = s1 + 1;
short s1 = 1;s1 += 1;
上面两行,那一行有错,有什么错 (4分)
第一行有错;编译时出错s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1 =(short)(s1 + 1) 。short s1 = 1; s1 += 1正确。
5、 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对 (4分)
equals被重写时,通常有必要重写 hashCode 方法,相等对象必须具有相同的hashCode,但具有相同的hashCode的对象不一定相等。如果两个对象对同一个对象使用equals方法都得到true值,则可根据传递性得到这两个对象也相同的结论,所以他们应该拥有相同的hashcode。
6、 swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上 (4分)
swtich能用在byte上不能用在long和String上
swtich只能用在char byte short int 上
7、 指出下面这段代码存在的问题,并给出解决方案(7分)
public class MyThread implements Runnable
{
int i = 0;
public void run()
{
processData();//只对数据进行处理
refreshUI();//刷新相应显示
}
}
2个方法在并没有被定义, processData()方法只对数据进行处理而refreshUI()方法刷新相应显示;类MyThread继承了Runnable接口,也就是说数据进行处理和刷新显示在一个线程中处理,那实现多线程就没有任何意义了,数据处理是先进行的,如果在数据处理过程中发生不可捕获的异常而中断,数据不会刷新显示,可能会造成数据的丢失等
应该多开启一个个线程给刷新显示,如果数据处理的线程中断也不会影响数据的丢失
8、 指出下面定义的类中三个函数同步的对象,以及使用时的注意事项(6分)
public class MyClass
{
public synchronized void fun1()
{
//…
}
public void fun2()
{
synchronized(this)
{
//…
}
}
public void fun3()
{
synchronized(obj)
{
//…
}
}
}
答:public synchronized void fun1()
{
//…
}
同步的是fun1()这个方法
在该类内部同步,一旦新实例化对象后,不能保证两个实例化对象之间能够同步。
public void fun2()
{
synchronized(this)
{
//…
}
}
同步的是代码块,把该类本身作为同步对象,在该类内部有效,一旦新实例化对象后,不能保证两个实例化对象之间能够同步。
public void fun3()
{
synchronized(obj)
{
//…
}
}
同步的实代码块,必须要保证obj对象是同一个才能同步
9、 给出下面一段代码的两个函数的返回值,说明原因(4)
public class MyClass
{
public int fun1()
{
try{
return 1;
}
catch(Exception ex)
{
return 2;
}
}
public int fun2()
{
try{
return 3;
}
finally
{
return 4;
}
}
}
第一个函数返回 1,第二个函数返回 4 。
第一个函数会先执行 try 中的语句,出错的话才会执行 catch 中的语句。
第二个函数在执行 try 中的语句时,直接return 4;
10、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 (5分)
是值传递。Java 编程语言只由值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的。
11、接口是否可继承接口 抽