软件构造一些易错知识点(1)

    技术2024-07-18  72

    1.final 关键词 .final 关键词:修饰的变量无法改变引用。 所以如果用final 修饰不可变类型,则无法再次赋值。

    final int a = 5; a = 10; //错误

    2.考虑下面代码

    public class Person { ... private Date birth; public Person(...) { ... } public Date getBirth() { return birth; } ...

    如果在客户端我们想要获取某人出生的生日,就可能会因某些操作改变内部状态,因为存在内部信息泄露。 可改为:

    public class Person { ... private Date birth; public Person(...) { ... } public Date getBirth() { return new Date(birth.toString()); //防御式拷贝 } ... }

    3.重写与重载 重写方法与父类名字、参数列表、返回值类型完全相同,在运行阶段判断到底用哪个方法; 重载与父类具有同样的名字,但有不同的参数列表或返回值类型 ,在编译阶段判断到底用哪个方法。 4.==与.equals()

    在java中,“==”主要有两个作用 1)对基础数据类型:比较的是他们的值是否相等,比如两个int类型的变量,比较的是变量的值是否一样。 2)对引用数据类型:比较的是引用的地址是否相同,即是否指向同一个区域。

    在java中,.equals()的作用 .equals()方法在Object中就有,其作用与“==”的 2)一样,比较的是引用的地址是否相同,即是否指向同一个区域。

    这样看来.equals()似乎没有存在的意义。 然而在一些类型中,比如String,Integer,Date中重写了.equals(),此时.equals()的作用发生改变,比较的是内容是否相同而非之前的比较引用。

    5.自动装箱与拆箱 下面代码合法:

    Integer a = 1;//装箱 int b = a;//拆箱

    考虑下面代码

    Integer a = 1; Integer b = 1; Integer c = 1000; Integer d = 1000; System.out.println(a == b); System.out.println(a.equals(b)); System.out.println(c == d); System.out.println(c.equals(d));

    似乎结果应为false,true,false,true。(引用不同,内容相同,引用不同,内容相同)。 然而实际运行true,true,false,true。 原因: 数值在-128 ~ 127之间,同一个值的所有封装共用同一个对象,这发生在AutoBoxing(装箱)过程中。 如果要避免这种情况,可以:

    Integer a = new Integer(1); Integer b = new Integer(1); System.out.println(a == b);//此时引用不同,结果为false
    Processed: 0.016, SQL: 9