Java不常见问题

来源:互联网 发布:新东方托业网络课程 编辑:程序博客网 时间:2024/05/21 16:55

1>当大家都认为a +=1就相当于a = a + 1时,有些程序可不是这样的!
byte a = 13;
a += 1; // 编译正确
a = a + 1; // 编译错误
具体理由是java中对于复合赋值符的处理是:a = (T)((a)op(i))其中T为a的类型,也就是说右边的结果强制转换为左边的类型!而a = a + 1不会这样做,与此相反:
Object obj = "tt";
obj += "123"; // 编译错误
obj = obj + "123"; // 编译正确
2>程序:
String letters = "ABC";
char[] numbers = {'1', '2', '3'};
System.out.println(letters + " easy as " + numbers);
当我们运行它的时候,我们会看到一个丑陋的格式:numbers的内存地址!怎么样让它打印出numbers的内容呢?有两种方法:
第一种:显示的转换numbers为字符串System.out.println(letters + " easy as " + String.valueOf(numbers));
第二种:隐式的利用print调用的toString()方法来转换成字符串
System.out.print(letters + " easy as ");System.out.print(numbers);
3>我们知道\u看开始的字符时表示的一个unicode字符后面紧接着四个十六进制的数字才算是良构,否则便是病构!殊不知,十六进制的病构即使出现在java的注释中,也会让类加载器拒绝加载,导致编译错误
如:// note: \u003t因为t不是十六进制的数字,会导致程序编译错误!
4>无关紧要的赋值符号会导致程序的运行错误,最为经典的一个程序是:
int j = 0;
for (int i = 0;i <100;i++) { j = j++; }这样操作以后,j的值始终不变,始终都是0
但是,我们将那多余的赋值符号去除掉,如:for(int i = 0;i <100;i++){j++;}程序可以正常打印!
5>几个趣味的死循环:
第一个:怎么让while(i <=j&&j <=i&&j!=i){}为死循环条件为:Integer i = new Integer(0);Integer j = new Integer(0);
第二个:怎么让while(i != i + 0){}变成死循环,这个简单,只要让i不是数字类型就可以了如String i = "Buy it!";
第三个:怎么让while(i = i + 1){}变成死循环,让i = i+1必须得让i足够大,所以我们可以定义double i = 1.0 / 0.0;(返回的是infinity)或者double i = Double.POSITIVE_INFINITY;或者是定义一个足够大的浮点数:dobule i = 1.0e40;
6>我原来发表的日志中有说过,finally总是会在try语句控制结束时执行,而不管是正常结束还是意外结束!
如:static boolean decision {
    try {return true;}finally{return false;}
本来运行try语句的时候return true;就应该是直接返回,但是由于上面的原则,这样的一个方法调用总是返回false的!
7>关于接口,你知道多少呢?
语言规范中描述道:如果一个catch子句要捕获一个类型为E的被检查异常,而其相对应得try子句不能抛出E的某种子类型的异常时,则会编译错误!
try {
           // if you have nothing to say, say nothing
} catch (IllegalAccessException e) {       
}finally {}
第二条规则:多个继承而来的throws子句的交集,将减少而不是增加方法允许抛出的异常的数量
public class Test implements Type3{
    public void f() {
        System.out.println("hello");
    }
    public static void main(String[] args) {
        Test t3 = new Test();
        t3.f();
    }
}
interface Type1 {
    void f() throws CloneNotSupportedException;
}
interface Type2 {
    void f() throws InterruptedException;
}
interface Type3 extends Type1, Type2 { // 接口之间的多继承
}
运行程序,我们发现并没有抛出任何被检查的异常,正如上面的规则所说,Type3对于Type1与Type2抛出的异常取交集,但是这两个接口抛出的异常并没有交集,也就是不会抛出异常了,所以编译通过并打印hello

原创粉丝点击