J a v a O b j e c t 类 常 用 A P I \huge{Java\space Object类常用API} Java Object类常用API
API
首先解释一下什么是
A
P
I
API
API。
A
P
I
(
A
p
p
l
i
c
a
t
i
o
n
P
r
o
g
r
a
m
m
i
n
g
i
n
t
e
r
f
a
c
e
)
API(Application Programming interface)
API(ApplicationProgramminginterface):应用程序编程接口。
简单来说就是人家
J
a
v
a
Java
Java,已经写了很多的库函数啦,你就不用自己写了,到需要用的时候直接调用就可以了。
所以理解
A
P
I
API
API就直接当作函数看待就可以了。
Object类
什么是
O
b
j
e
c
t
Object
Object类?
在
J
a
v
a
Java
Java的设定之中,
O
b
j
e
c
t
Object
Object类是
J
a
v
a
Java
Java其他所有类的父类或者祖先类。如果一个类定义的时候没有明确指出所继承的父类或者实现的接口类,那么它的父类就是
O
b
j
e
c
t
Object
Object类。如果一个类指出了实现的接口或者继承的父类,那么
O
b
j
e
c
t
Object
Object类就是它实现接口类的父类或者是它继承父类的父类,也就是说
O
b
j
e
c
t
Object
Object类是这个类的祖先类(有点绕,不过理清楚就是当前类在第三层,
O
b
j
e
c
t
Object
Object类在第一层的关系)
❗❗综上:
J
a
v
a
Java
Java中的任意类不是默认继承了
O
b
j
e
c
t
Object
Object类,就是间接继承了
O
b
j
e
c
t
Object
Object类
Object类的API
O b j e c t Object Object类作为所有类的父类,肯定有很多的常用的方法来为子类对象进行使用啦!
①. toString()方法
t
o
S
t
r
i
n
g
(
)
toString()
toString()方法的意义就是用字符串来描述指定的信息。
注意:
O
b
j
e
c
t
Object
Object类中的最初版本的
t
o
S
t
r
i
n
g
(
)
toString()
toString()方法返回的是当前传入对象的地址信息!
示例:
//这个打印的结果就是直接打印的s这个对象在内存中的地址
Student s = new Student("阿诚", '男', 19);
System.out.println(s);
//下面的打印结果是s中的信息
//因为String类中的toString方法是重写的Object类中的方法
//rs中保存的就是s中的信息的字符串形式
Student s = new Student("阿诚", '男', 19);
String rs = s.toString();
System.out.println(rs);
也可以在打印对象信息的时候直接使用对象,省略 t o S t r i n g ( ) toString() toString()。
//这两行代码的作用效果是一模一样的
//因为打印对象的时候Java会自动在后面补充一个toString()
//无论写不写这个toString()都是有的
System.out.println(s.toString());
System.out.println(s);
❗❗❗toString()存在的意义
上面描述也知道了
t
o
S
t
r
i
n
g
(
)
toString()
toString()最初版本就是返回对象的存储地址,但是在实际的情景中,要使用对象的地址的场景真的非常的少,所以最初版本的
t
o
S
t
r
i
n
g
(
)
toString()
toString()方法使用的也非常的少。
可以说
t
o
S
t
r
i
n
g
(
)
toString()
toString()方法的存在基本上就是为了让子类重写,从而根据子类的需求返回子类的信息。
②. equals()方法
e
q
u
a
l
s
(
)
equals()
equals()方法的最初版本是比较两个对象的地址是否相同。
但是有个问题,如果需要比较非基本数据类型的数据的地址是否相同,可以直接使用==
进行判断,这时还是使用equals()
方法反而有点麻烦,而且在实际开发中更多的是需要判断两个对象的内容是否一致,这样应该如何利用最初版本的equals()
方法呢?
先看几个实例。
情况一:
//当前的Student类没有对equals()方法进行重写
//所以调用的时候就是默认的Objet类的equals()方法
Student s1 = new Student("周雄", '男', 19);
Student s2 = new Student("周雄", '男', 19);
// equals默认是比较2个对象的地址是否相同,子类重写后会调用子类重写的来比较内容是否相同。
//容易知道,下面两种情况比较都是两对象地址是否相同
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
运行结果:
情况二:
在Student
类中对最初版本的equals()
方法进行重写。
//Student类的成员变量
private String name;
private char sex;
private int age;
/**
自己重写equals,自己定制相等规则。
两个对象的内容一样就认为是相等的
s1.equals(s2)
比较者:s1 == this
被比较者: s2 ==> o
*/
@Override
public boolean equals(Object o){
// 1、首先判断o是不是学生类型
if(o instanceof Student){
Student s2 = (Student) o;
// 2、判断2个对象的内容是否一样。
if(this.name.equals(s2.name) &&
this.age == s2.age && this.sex == s2.sex){
return true;
}else {
return false;
}
//❗这里这个equals()方法调用的是String类中的equals()方法
//比较的是两个字符串的内容是否相同
//与当前重写的函数虽然名字相同但是实际上不是一个函数
return this.name.equals(s2.name) && this.age == s2.age
&& this.sex == s2.sex ;
}else {
// 学生只能和学生比较,否则结果一定是false
return false;
}
}
/**
定制相等规则。
这个重写的equals()方法在IDEA中可以自动生成
生成步骤:右键 -> generate -> equals() and hashCode()
两个对象的内容一样就认为是相等的
s1.equals(s2)
比较者:s1 == this
被比较者: s2 ==> o
*/
@Override
public boolean equals(Object o) {
// 1、判断是否是同一个对象比较,如果是返回true。
if (this == o) return true;
// 2、如果o是null返回false 如果o不是学生类型返回false ...Student != ..Pig
if (o == null || this.getClass() != o.getClass()) return false;
// 3、说明o一定是学生类型而且不为null
Student student = (Student) o;
return sex == student.sex && age == student.age && Objects.equals(name, student.name);
}
重写了 e q u a l s ( ) equals() equals()方法再次运行之前的代码:
Student s1 = new Student("周雄", '男', 19);
Student s2 = new Student("周雄", '男', 19);
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
运行结果:
这次Student
类中的
e
q
u
a
l
s
(
)
equals()
equals()方法就是用于判断两个学生对象的内容是否相同了。
❗❗❗equals()方法存在的意义
同 t o S t r i n g ( ) toString() toString()方法一样, e q u a l s ( ) equals() equals()方法存在的意义也就是让子类重写来满足子类的特殊要求的,因为最初版本的 e q u a l s ( ) equals() equals()方法的使用场景实在是太少了。
Objects类
O
b
j
e
c
t
s
Objects
Objects类就是一个工具类,里面存放了很多的功能用于让别人进行调用。
回顾一下调用重写
e
q
u
a
l
s
(
)
equals()
equals()方法的格式:
a1.equals(a2)
调用的格式写诗是这么写没错,但是有一个隐含的问题,如果a1
这个对象本身就是null
怎么办?肯定不能调用null
的
e
q
u
a
l
s
(
)
equals()
equals()方法,一定报错!
O b j e c t s Objects Objects中也有 e q u a l s ( ) equals() equals()方法,而且这方法是重写过可以判断对象内容的,下面这样调用:
Objects.equals(a1,a2)
这样调用的话,无论是a1
还是a2
谁是null
都无所谓都可以进行判断。这种写法更加安全❗
O b j e c t s Objects Objects类的常见方法如下:
1. euqals()方法
System.out.println(s1.equals(s2));
// 留下了隐患,可能出现空指针异常。
System.out.println(Objects.equals(s1, s2));
// 更安全,结果也是对的!
J a v a Java Java中 O b j e c t s Objects Objects类的中的 e q u a l s ( ) equals() equals()方法源码:
Objects:
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
就是先判断地址是不是相等,然后在进行
e
q
u
a
l
s
(
)
equals()
equals()方法比较
❗❗源码中可以知道后面调用了传入类型对应的
e
q
u
a
l
s
(
)
equals()
equals()方法,所以传入的类型本身必须已经重写过
e
q
u
a
l
s
(
)
equals()
equals()方法了!
2. isNULL()方法
判断一个对象是否是null
,如果是返回true
,否则返回false
。
示例:
String s1 = null;
String s2 = new String("应长天");
System.out.println(Objects.isNull(s1)); // true
System.out.println(s1 == null); // true
System.out.println(Objects.isNull(s2)); // false
System.out.println(s2 == null); // false