Object
–1,概述
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类
–2,创建对象
Object()
–3,常用方法
int hashCode()
返回该对象的哈希码值。
String toString()
返回该对象的字符串表示。
boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
–4,测试1
package cn.tedu.api;
//测试 Object工具类
public class Test1_Object {
public static void main(String[] args) {
//1,创建Object对象
Object o = new Object();//触发无参构造
//2,调用常用方法
//366712642,o对象在内存中的哈希码值
System.out.println( o.hashCode() );
//java.lang.Object@15db9742,展示对象在内存中的地址值
System.out.println( o.toString() );
// System.out.println(Integer.toHexString(366712642));
//false,比较o对象和"jack"是否相等
System.out.println( o.equals("jack") );
}
}
--5,测试2
package cn.tedu.api;
//测试 Object工具类
//总结
//1,Object是所有类的 超类/父类/基类
//2,toString()--用来展示对象的字符串--重写前展示地址值--重写后展示属性值
//3,equals()--比较两个对象是否相等--重写前比地址值--重写后比属性值
//4,工具提供的快捷方式--source--toString()--equals()...
public class Test2_Object2 {
public static void main(String[] args) {
Student s = new Student("渣渣辉",40);//触发了含参构造
//使用了Object父类的,展示了哈希码值-366712642
System.out.println( s.hashCode() );
//使用了Object父类的,展示了地址值-cn.tedu.api.Student@15db9742
System.out.println( s.toString() );
//查看属性的值
System.out.println( s.getName() );
System.out.println( s.getAge() );
//1,想要的是,直接输出s就看到s对象的属性值?
//但是,输出的是地址值,cn.tedu.api.Student@15db9742
//原因:在打印对象时,会调用了toString(),自己没提供,
//才去找到了Object提供的,默认就是要打印一个地址值.
//想要打印属性值,--需要提供重写的toString()
//到底打印什么数据?-重写前,打印地址值.重写后,打印属性值
//cn.tedu.api.Student@15db9742 -> Student [name=渣渣辉, age=40]
System.out.println(s);
Student s1 = new Student("jack",20);
Student s2 = new Student("jack",20);
//3,equals()--比较对象是否相同,相同就返回true,不同就返回false
//比较s1和s2相同吗--使用了Object提供的equals(),本来就是比较对象间的地址值
//== 比较基本类型的变量时,比较的是值本身 ,如:1==2 false 1==1 true
//== 比较 引用类型的变量时,比较的是地址值
//需求:进行比较时,不想比较地址值,而是比较属性值,--重写equals()
//如果所有属性都一样,那么就认为是相同的对象,equals返回true
//equals()到底比较什么呢?--重写前,比的是地址值,重写后,比的是属性值
System.out.println( s1.equals(s2) );
//重写前是false,因为地址值不同 -> 重写后是true,因为属性值相同
}
}
class Student{//省略了 extends Object
//构造方法--方便外界new
public Student() { }
public Student(String name, int age) {
super();//调用父类Object 的无参构造
this.name = name;
this.age = age;
}
private String name ;
private int age ;
//get()/set()--source
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;
}
//2,重写toString()--目的是不再展示地址值,而是要想展示属性值
//source -- generate toString()...ok
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
//4,重写equals()--目的是比较的不再是两个对象间的地址值,而是属性值
//source -- generate hashCode() and equals()...ok
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
// @Override
// public boolean equals(Object obj) {
// //统一类型,是学生类型再比较
// Student s = (Student)obj ;
// //判断,如果每个属性都一样,就认为是同一个对象,让equals()返回true
// if(this.name==s.name && this.age==s.age) {
// return true ;
// }
// return false;
// }
}