• Object类
1、位于java.lang包中。
2、类 Object 是类层次结构的根类,每个类都使用 Object 作为超类,所有对象(包括数组)都实现这个类的方法。
3、 因为Object是所有类的直接或间接父类,所以,Object中的所有方法,其子类都拥有。
3.1. toString() 当直接打印对象时,默认输出的是该对象的toString方法的返回值。
默认输出的对象的格式为: 类名称@哈希值 如:com.jcxy.demo01.Student@15db9742
为什么会打印出这种形式呢?原因看下面例子
定义一个学生类
package com.jcxy.demo01;
public class Student {
private int age;
private String name;
}
定义一个Test类
package com.jcxy.demo01;
public class Test {
/**测试 toString()的输出结果
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student();
System.out.println(s.toString());//打印s就相当于s.toString()
}
}
打印结果为:com.jcxy.demo01.Student@15db9742
调用的toString()在父类的源码为
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
所以打印出来的结果是类名+@+16进制的哈希值
3.1.2如果想按照自己的格式打印出学生的信息,则需要覆盖父类中的toString()方法。
重新定义学生类
package com.jcxy.demo01;
public class Student {
private int age;
private String name;
//提供无参数的构造函数。eclipse快捷键:alt + shift + s 出现界面后按 c
public Student() {
super();
// TODO Auto-generated constructor stub
}
//提供有参数的构造函数。eclipse快捷键: alt + shift + s 出现界面后按 o
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
<span style="white-space:pre"> </span>//重新定以后的父类方法
public String toString() {
return "age = "+age+"\tname = "+name;
}
//封装属性。eclipse快捷键: alt + shift + s 出现界面后按 r
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Test中测试
package com.jcxy.demo01;
public class Test {
/**测试 toString()的输出结果
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s = new Student(21,"Rose");
System.out.println(s.toString());
}
}
打印结果:age = 21 name = Rose
3.2 equals() 通过类比toString的复写形式,我们也可以重写自定义类的equals方法。
如比较两个学生是否相等,当年龄和姓名都相同时,我们认为是同一个学生。
学生类:
package com.jcxy.demo01;
public class Student {
private int age;
private String name;
//提供无参数的构造函数。eclipse快捷键:alt + shift + s 出现界面后按 c
public Student() {
super();
// TODO Auto-generated constructor stub
}
//提供有参数的构造函数。eclipse快捷键: alt + shift + s 出现界面后按 o
public Student(int age, String name) {
super();
this.age = age;
this.name = name;
}
public String toString() {
return "age = "+age+"\tname = "+name;
}
//封装属性。eclipse快捷键: alt + shift + s 出现界面后按 r
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//复写父类Object中的equals方法
public boolean equals(Object obj) {
//如果两个对象在栈中的地址值相等,则一定是同一个对象。
if(this == obj)
{
return true;
}
//判断obj是否是学生类对象
if(obj instanceof Student)
{
//如果是则向下转型,downcaseing obj转换为student类
Student s = (Student)obj;
return (this.age == s.age && this.name == s.name) ? true : false;
}
return false;
}
}
Test类
package com.jcxy.demo01;
public class Test {
/**测试 equals()的输出结果
* @param args
*/
public static void main(String[] args) {
Student s1 = new Student(21,"Rose");
Student s2 = new Student(21,"Rose");
Student s3 = new Student(22,"Rose");
Student s4 = new Student(21,"Jack");
System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s1.equals(s4));
}
}
打印结果:true
false
false
– 注意:关于Object与数组的关系:
1、对于数组元素类型为引用类型的数组来说
– Object obj = strs;//子类转换成父类。将数组整个对象转换成Object对象
– Object[] objs = strs;//将数组中的每个元素转换成对应的Object数组
2、对于数组元素类型为基本数据类型的数组来说
– Object obj2 = arrs;//子类转换成父类对象。将数组整个对象转换成Object对象
– Object[] objs2 = arrs;因为int类型没有父类。
package com.jcxy.demo01;
public class Test {
/**关于Object与数组的关系
* @param args
*/
public static void main(String[] args) {
int[] arrs = {1,2,3,4,5};
String[] strs = {"aaa","bbb","ccc","ddd"};
//子类转换成父类。将数组整个对象转换成Object对象
Object obj = strs;
//将数组中的每个元素转换成对应的Object数组
Object[] objs = strs;
//子类转换成父类对象。将数组整个对象转换成Object对象
Object obj2 = arrs;
//因为int类型没有父类。
Object[] objs2 = arrs;//报错
}
}<span style="color:#800000;">
</span>