个人简介
- 大家好,我是翰慧腾。一名正在努力学JAVA的大一小白,本文章为初学的笔记,希望各位多多指教。💙
- 欢迎点赞+收藏+留言💜
- 想要和得到中间还有一步叫做到🧡
一、Object类
- 任何一个类要么默认继承了Object类,要么间接继承了Object类,Object类是java中祖宗类,因此,Object类中的方法是可以供任何类使用的。
- Object类常用方法
1.toString方法
下图是Object类中toString方法API文档
Object类中的toString方法,代码如下
package Stickto;
public class toString {
public static void main(String[] args) {
aa s=new aa("小明",19);
String ss=s.toString();//aa类默认继承Object类,可以直接调用该类中的toString方法
System.out.println(ss);
System.out.println(s);//toString方法可以省略,但效果完全一样
}
}
class aa{
String name;
int age;
public aa(){
}
public aa(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
输出结果:
显而易见,未重写toString方法之前,调用toString方法会输出一个地址值。此处的toString方法是可以省略的,直接输出对象名也是同样的输出。在实际开发中我们并不需要地址值,而是需要对象对应的值,因此,就要对toString方法进行重写。
重写toString方法代码如下:
package Stickto;
public class toString {
public static void main(String[] args) {
aa s=new aa("小明",19);
String ss=s.toString();
System.out.println(ss);
System.out.println(s);
}
}
class aa{
String name;
int age;
public aa(){
}
public aa(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override//对Object类中的toString方法进行重写,可以自定义调用toString方法后的输出内容
public String toString() {
return "aa [name=" + name + ", age=" + age + "]";
}
}
结果:
2.equals方法
Object类中equals方法API文档:
该方法默认比较的是对象的地址是否相同 ,但是在实际开发中比较两个两个对象的地址用==就可以完成。通常我们会将equals方法进行重写,来自定义比较规则。
重写toString方法代码如下:
package Stickto;
import java.util.Objects;
public class toString {
public static void main(String[] args) {
aa s=new aa("小明",19);
aa s1=new aa("小明",19);
String ss=s.toString();
System.out.println(ss);
System.out.println(s.equals(s1));//true
}
}
class aa{
String name;
int age;
public aa(){
}
public aa(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "aa [name=" + name + ", age=" + age + "]";
}
@Override
public boolean equals(Object obj) {
//检验比较的是否是同一个对象,同一个对象内容一定相等
if (this == obj)//this指的是调用该方法的对象
return true;
//检验比较的是否空值,与空值比较一定返回false
if (obj == null)
return false;
//检验比较的两个类型是否为同一个类型,若为同一个类型才可以进行内容的比较,不是同一个类型一定返回false
if (getClass() != obj.getClass())//getClass是取其类型
return false;
aa other = (aa) obj;//将object类型的obj强转类型为aa类型
return age == other.age && Objects.equals(name, other.name);//对年龄和姓名内容进行比较
}
/** Objects类中的equals方法源码如下
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}*/
}
IDE都会自动生成toString和equals方法的重写,equals方法用来比较对象的内容是否相等。
二、Objects类
- 首先不能被这个名字所误导,它和大多数类一样也继承着Object类,该类是从jdk1.7之后才有的。
1.equals方法
- Objects类中equals方法API文档
- Objects类中的equals方法源码如下
//Objects类中的equals方法源码如下 public static boolean equals(Object a, Object b) { return (a == b) || (a != null && a.equals(b)); }
- 上述代码中的重写toString方法已经用到了Objects.equals类,很多小伙伴可能会不理解,好奇为什么不用Object类的equals方法。其实这两个类中的equals方法比较的结果是一样的,但是Objects类下的该方法更安全。Object类下equals方法会有如下情况:
当调用该方法的对象为null的时候,会出现如图所示的报错。但是使用Objects类并不会出现这种情况。所以,我们通常会选择更安全的Objects类中的equals方法。(调用该方法也应该重写Object类中的equals方法)
多说无用,上代码!
package Stickto;
import java.util.Objects;
public class toString {
public static void main(String[] args) {
aa s=new aa("小明",19);
aa s1=new aa("小明",19);
System.out.println(Objects.equals(s, s1));
}
}
class aa{
String name;
int age;
public aa(){
}
public aa(String name,int age) {
this.name=name;
this.age=age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "aa [name=" + name + ", age=" + age + "]";
}
@Override
public boolean equals(Object obj) {
//检验比较的是否是同一个对象,同一个对象内容一定相等
if (this == obj)//this指的是调用该方法的对象
return true;
//检验比较的是否空值,与空值比较一定返回false
if (obj == null)
return false;
//检验比较的两个类型是否为同一个类型,若为同一个类型才可以进行内容的比较,不是同一个类型一定返回false
if (getClass() != obj.getClass())//getClass是取其类型
return false;
aa other = (aa) obj;//将object类型的obj强转类型为aa类型
return age == other.age && Objects.equals(name, other.name);//对年龄和姓名内容进行比较
}
/** Objects类中的equals方法源码如下
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}*/
}
2.isnull方法(判断变量是否为null)
API文档:
源码如下::
public static boolean isNull(Object obj) {
return obj == null;
}
上代码:
package Stickto;
import java.util.Objects;
public class isnull {
public static void main(String[] args) {
String a=null;
String b="我爱JAVA";
System.out.println(a==null);//true
System.out.println(Objects.isNull(a));//true
System.out.println(b==null);//false
System.out.println(Objects.isNull(b));//false
}
}
补充:
官方在String类已经重写了equals、toString方法。
toString方法API文档:
源码:
public String toString() {
return this;
}
代码:
package Stickto;
public class String_toString {
public static void main(String[] args) {
String a="键盘敲烂,月薪过万";
System.out.println(a.toString());
//之前输出字符串名输出对应内容就是因为String类重写了toString方法
}
}
equals方法API文档:
源码:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}
上代码:
package Stickto;
public class String_equals {
public static void main(String[] args) {
// TODO 自动生成的方法存根
String a="键盘敲烂";
String b="月薪过万";
System.out.println(a.equals(b));//false
}
}