天天看点

java初学者必看:你必须理解的五大问题?

文档整理,方便查看,转载自 http://upgoing.blog.51cto.com/2112939/420972

这个系列里的问题,是每个java学习者都应该明白的。除非你只是感兴趣,学java玩玩。如果你认为自己已经超越初学者了,却还是不懂,那建议你重新开始学。 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello world!”。这样模糊的回答通常是概念不清的根源。如果要准确的回答,一半的人大概回答错误。 我们是声明了另外一个只能指向String对象的引用,名为string,并没有第二个对象产生,string还是指向原来那个对象,也就是,和s指向同一个对象。 int a=10; 但不好理解的地方是: 则a==b将返回false。 看一下Object对象的equals方法是如何实现的: Object对象默认使用了==操作符。所以如果你自创的类没有覆盖equals方法,那你的类使用equals和使用==会得到同样的结果。同样也可以看出,Object的equals方法没有达到equals方法应该达到的目标:比较两个对象内容是否相等。因为答案应该由类的创建者决定,所以Object把这个任务留给了类的创建者。 没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。请看下列代码: s所指向的对象是否改变了呢?从本系列第一篇的结论很容易导出这个结论。我们来看看发生了什么事情。在这段代码中,s原先指向一个String对象,内容是"Hello",然后我们对s进行了+操作,那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。 private String s; s = "Initial Value"; } 后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为String对象不可改变,所以对于内容相同的字符串,只要一个String对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的String类型属性s都指向同一个对象。 先来看一下Java中有哪些种类的变量。 3. 方法的参数 float类型变量默认初始值为0.0f char类型变量默认初始值为0(ASCII码) 问题五:final关键字到底修饰了什么?不变",但是由于对象型变量的本质是“引用”,使得“不变”也有了两种含义:引用本身的不变,和引用指向的对象不变。 引用指向的对象不变:!"); <span times="" new="" roman';="" mso-spacerun:="" 'yes'"="" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; font-size: 10.5pt; ">理解 final 问题有很重要的含义。许多程序漏洞都基于此 ――final 只能保证引用永远指向固定对象,不能保证那个对象的状态不变。在多线程的操作中,一个对象会被多个线程共享或修改,一个线程对对象无意识的修改可能会导致另一个使用此对象的线程崩溃。一个错误的解决方法就是在此对象新建的时候把它声明为 final ,意图使得它 “ 永远不变 ” 。其实那是无用的。