02_Object类
Java中常用的包
java.lang包 - 该包是java语言的核心包,该包里的所有内容由Java虚拟机自动导入;
- 如:java.lang.String类/System类等......
java.util包 - 该包是java语言的工具包,体面提供了大量的工具类和集合等内容
- 如:java.util.Scanner类/Random类、Arrays类等......
java.net包 - 该包是java语言的网络包,里面提供了大量的网络工信相关的类的内容
- 如:java.net.ServerSocket类/Socket类等......
java.io包 - 该包是java语言的输入输出包,里面提供了大量读写文件的相关类
- 如:java.io.PrintStream/InputStream
java.lang.reflect包 - 该包是java语言的反射包,里面提供了一些反射相关的类
基本概述
java.lang.Object类是所有层次结构的根类,任何类都是该类的直接/间接类
常用的方法
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返
回true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用
的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象
时此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象须具有相等哈希码
参数:
obj - 要与之比较的引用对象。
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
int hashCode():用于获取对象的哈希码值(内存地址或者编号)并返回
若两个对象调用equals()方法相等,则各自调用该方法得到的哈希码值也应该相等
若两个对象调用的equals()方法不相同,则各自调用该方法结果可以相同,但最好不相同
String toString 用于返回调用对象的字符串形式
默认返回的字符串是:包名、类名 @ 哈希码的无符号十六进制形式
当使用print()/println()打印引用变量的时候,会自动调用toString()方法
当使用字符串进行拼接的时候会自动调用toString方法
Student.java
//Student类封装
public class Student {
private int id;
private String name;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
if(id>0) this.id=id;
else System.out.println("学号不合理");
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重写equals方法
/* public boolean equals(Object obj){
//1.若两个对象地址相同,则内容一定相同
if (this==obj) {//this是调用对象
return true;
}
//2.若调用对象不为空参数,对象为空,内容肯定不相同
else if (obj==null) {
return false;
}
//3.若参数对象和调用对象类型一致,则由学号来决定两个对象内容是否相同
else if (obj instanceof Student) {
Student s = (Student)obj;
if (this.getId()==s.getId()) {
return true;
}
else {
return false;
}
}
//4.若是参数对象和调用对象类型不同,则内容一定不同
else {
return false;
}
}*/
}
TestSudent.java
public class TestStudent {
public static void main(String[] args){
Student s1 = new Student(1001,"zhangfei");
Student s2 = new Student(1001,"zhangfei");
System.out.println(s1+" "+s2);//可以看出内存地址不同
//equals方法默认比较对象地址
//调用equals判断两个对象是否相等,这里默认从Object类中继承过来
boolean b1=s1.equals(s2);//当前对象是s1和s2比较,所以不相等
System.out.println("b1="+b1);//b1==false,因为对象不同,所以false
System.out.println(s1==s2);//这里判断的是地址
//那么如何单单比较内容是否相同呢?重写equals方法更改比较的规则
//当重写equals方法后,则调用子类重写以后的版本
}
}
String类重写了equals方法
System.out.println("你好".equals("你好"));
//返回值为true
重写hashCode方法
//用Alt+S重写HashCode,Override implement
@Override//为了保证和euqals结果一致性,需要重写hashCode方法
public int hashCode() {
// TODO Auto-generated method stub
return getId();
}
//调用从Object类中继承的hashCode方法来获取对应的哈希码
//当Student类中重写hashCode方法后,则调用重写以后的版本
int res = s1.hashCode();
System.out.println("res="+res);
res=s2.hashCode();
System.out.println("res="+res);
重写toString方法
@Override//为了打印对象中的成员变量值,则需要重写toString方法
public String toString(){
return "学号="+getId()+",姓名="+getName();
}
String str1=s1.toString();
System.out.println(str1);
//直接输出s1默认会调用toString方法
//因为String重写了toString方法,并且重写了equals方法
System.out.println(s1);