马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、对象比力:==与equals的博弈
在Java的天下里,判定两个对象是否“相称”是一个经典且易肴杂的话题。核心在于区分“所在”与“内容”。
==运算符:本质上是比力内存所在。对于根本数据范例(如int、double),它比力的是数值本身;但对于引用数据范例(对象),它判定的是两个引用是否指向堆内存中的同一个位置。纵然两个对象的内容完全同等,只要它们是分别new出来的, == 的效果就是 false 。
equals方法:这是 Object 类提供的一个方法,操持初志是用来比力对象的内容。默认环境下, Object 类中的 equals 方法内部实现的实在就是 == (比力所在)。因此,为了实现内容比力(比方判定两个字符串的内容是否雷同,大概两个用户对象的信息是否同等),我们必要重写(Override)equals方法。
条记重点:字符串的比力肯定要用 equals !由于字符串在Java中非常特别,直接比力内容才是业务逻辑的常态。
二、对象的“自我先容”:toString方法
当我们直接打印一个对象(比方 System.out.println(cat) )时,控制台输出的通常是一串艰涩难懂的字符(如 com.example.Cat@1b6d3586 )
这是由于打印对象时,Java默认调用了该对象的 toString() 方法。 Object 类提供的默认实现返回的是对象的哈希码(所在的某种表现),这对阅读并不友爱。
最佳实践:Java官方保举我们重写 toString() 方法。通过重写,我们可以将对象的属性信息格式化为易读的字符串(比方 Cat{name='小白', color='白色'} )。在IntelliJ IDEA等开辟工具中,可以通过快捷键自动天生这个方法,极大地方便了调试和日志输出。
三、范例判定神器:instanceof关键字
在多态和继承体系中,我们经常会遇到父类引用指向子类对象的环境(比方 Animal a = new Cat(); )。此时,如果我们想知道这个 a 引用到底是指向一只猫照旧一只狗,就必要用到 instanceof 关键字。
语法格式: 对象 instanceof 类名
作用:判定左边的对象是否是右边类的实例(大概是其子类、实现类的实例)。如果是,返回 true ;否则返回 false 。这在向下转型(Downcasting)之进步行安全查抄时尤为紧张,能有用克制 ClassCastException 。
四、Java内存分析与参数通报
明白Java的内存模子是把握参数通报机制的关键。
内存地域:Java内存重要分为栈(Stack)和堆(Heap)。
栈:存放局部变量、方法调用的上下文。特点是速率快,数据随方法竣事而烧毁。
堆:存放通过 new 创建的对象实例。特点是空间大,由垃圾接纳器管理。
参数通报机制:
根本数据范例:通报的是值。方法内部修改参数,不会影响外部的原始变量(由于只是拷贝了一份副本)。
引用数据范例:通报的是所在(即引用的副本)。方法内部通过所在修改对象的属性,会直接影响外部的原始对象;但如果在方法内部让引用指向一个新的对象(改变了所在指向),则不会影响外部引用原来指向的对象。
总结:Java中只有值通报。对于对象而言,通报的值是“指向堆内存的所在”。明白这一点,就能看懂为什么方法能修改对象的属性,却改变不了对象本身的引用指向。
免责声明:如果侵犯了您的权益,请联系站长及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金. |