toString
关于Object中的toString方法
SUN在Object类中设计toString方法的目的:返回java对象的字符串表示形式
在现实的开发过程中,Object中的toString方法已经不够用了,Object中的toString方法实现的结果不满意,这个方法就是要被重写的
Object中的toString方法返回:类名@java对象的内存地址经过哈希算法得出的int类型值再转化成十六进制。
输出结果可以等同看作java对象在堆中的内存地址
重点:print方法后面括号中如果是一个引用类型,会默认调用引用类型的toString方法
Date对象中的toString方法已经被重写,输出当前时间
测试方法
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建一个object类型的对象
Object o1 = new Object();
//调用toString方法
String ostr = o1.toString();
System.out.println(ostr);
//创建一个Person类型的对象
Person p1 = new Person("麦麦",18);
//调用toString类型方法
String pstr = p1.toString();
System.out.println(pstr);
//print方法后面括号中如果是一个引用类型,会默认调用引用类型的toString方法
Person p2 = new Person("zjm",18);
System.out.println(p2);
}
}
Person对象
public class Person {
String name;
int age;
//构造函数
public Person() {
super();
}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
//重写toString方法
//根据项目需求重写
//假设需求规定,显示格式:Person[name = 刘德华,age = 50]
public String toString(){
return"Person[name = " + this.name + ",age = " + this.age + "]";
}
}
equals
关于Object中的equals方法:
Object中的equals方法:
public boolean equals(Object obj){
return (this == obj);
}
"=="两边如果是基本数据类型【byte short int long double ……】,则比较内容是否相等,引用类型【String】,则比较内存地址,地址相同则是true,不同为false
Object中的equals方法比较的是两个引用的内存地址
Java对象中的equals方法的设计目的:判断两个对象是否一样
测试类:
测试一:Object中的equals方法比较的是内存地址,与内容无关。
public class test {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
//测试1:创造两个相同的对象调用equals并输出结果
//测试结果:Object中的equals方法比较的是内存地址,与内容无关。
boolean b1 = o1.equals(o2);
System.out.println(b1);//输出false
//测试二:在Star类中重写equals方法,使其能够比较变量值
Star s1 = new Star(100,"麦麦");
Star s2 = new Star(100,"麦麦");
System.out.println(s1.equals(s2));//输出true
}
}
测试类2
关于java语言中如何比较两个字符串是否一致
在java中比较两个字符串是否一致,不能用"",String为引用数据类型,不能用""。
只能调用String类的equals方法
String已经重写了Object中的equals方法,比较的是内容。
public class Test02 {
public static void main(String[] args) {
String s1 = new String("ABCD");
String s2 = new String("ABCD");
System.out.println(s1 == s2);//比较内存地址 false
//String已经重写了Object中的equals方法,比较的是内容。
System.out.println(s1.equals(s2));//true
}
}
Star类
public class Star {
int id;
String name;
//Object中的equals方法比较的是内存地址
//在现实的业务逻辑中,可能需要比较内容,
//根据需求规定重写equals方法,需求规定:若身份证号一致,名字一致,则代表是同一个人
public boolean equals(Object obj){//父类型引用指向子类型对象
if(this == obj) {//如果内存地址相同则内容也必然完全相同
return true;
}
//内存地址不同则比较内容
//需要调用子类特有属性,则要进行强制类型转换
//强制类型转换格式
if(obj instanceof Star){
Star s = (Star)obj;
if(id == s.id && name.equals(s.name)/*比较字符串*/){//String类中的equals方法已被重写,比较的是内容
return true;
}
}
return false;
}
//构造方法
public Star() {
super();
}
public Star(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
知识点总结:
Object类中的equals方法默认比较的是引用的内存地址
String类中的equals方法已被重写,比较的是内容
"=="只能比较基本数据类型
重写equals方法的格式
public class Test{
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(obj instanceof Test ){
Test t = (Test)obj;
if(this.id == t.id && this.name.equals(obj.name)){
return true;
}
}
return false;
}
}