您的位置:首页 > 编程语言 > Java开发

java中常被忽略的几个问题

2014-07-02 15:52 148 查看
下面是自己根据Java六大问题你都懂了吗?自己归纳的,仅供参考,如果想看详细的请点击超级链接:

1、"=="和equals方法究竟有什么区别?

== 操作符是专门来比较变量的内存地址是否相等而不是对象本身,而equals是比较对象的内容。不过要注意的是,如果你要看清楚该类的equals方法底层是否也用了==操作符,不要想当然。

2、final关键字

final关键字,都知道如果修饰变量,该变量不能被修改,也就是不能改变,但是由于对象型变量的本质是"引用",使得"不变"也有了两种含义:引用本身的不变,和引用指向的对象不变。

例子:

引用本身的不变:

  final StringBuffer a=new StringBuffer("immutable");

  final StringBuffer b=new StringBuffer("not immutable");

  a=b;//编译期错误

引用指向的对象不变:

  final StringBuffer a=new StringBuffer("immutable");

  a.append(" broken!");//编译通过

可见,final只对引用的"值"有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译期错误。至于它所指向的对象的变化,final是不负责的。这很类似==操作符:==操作符只负责引用的"值"相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。

** final只对引用变量的内存地址有约束力,对其对象内容的变化不具有约束力,这点类似于==操作符 **

3、 对于String s = "Hello World!"的理解

这个语句生命的是一个指向对象的引用,名为“s”,可以指向类型为String的任何对象,目前指向“Hello World!” 这个String类型的对象

** 我们只是声明了一个只能指向String对象的引用变量所以,如果在刚才那句语句后面,如果再运行一句:String string = s;我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。

4、string到底变了没有

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码:

  String s = "Hello";

  s = s + " world!";

string的内容并没有改变,而是在内存中重新开辟了一个位置存放Hello World然后将s指向新的内容,所以不是内容变化了,而是s不在指向原来的那个对象了,而是指向了另一个String对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: