![]()
package hobject;
public class Person {
String name;
int age;
public Person(){}
public Person(String name,int age){
this.name = name;
this.age = age;
}
//重写toString方法
//根据项目的需求而定
//根据规定,显示格式:Person[name=刘德华,age=50]
public String toString(){
return "Person[name="+name+",age="+age+"]";
}
}
package hobject;
/*
* 关于object中的toString方法
* SUN在Object类中设计toString方法的目的:返回java对象的字符串表示形式
*
* 在现实的开发过程中,object里边的toString方法已经不够用了
* 因为Object的toString方法实现的结果不满意
*
* Object中的toString方法就是要被重写的
*
* SUN是这样实现toString方法的:
*
* public String toString(){
* return getClass.getName() + "@" + Integer.toHexString(hashCode);
* }
*
* Object中的toString方法返回:
* 类名@java对象的内存地址经过哈希算法得出的int类型值再转换为十六进制
* 这个输出结果可以等同看作java对象在堆内存的内存地址
*/
public class Test01 {
//关于Object中的toString方法
public static void main(String[] args) {
//创建一个Object类型的对象
Object o1 = new Object();
//调用toString方法
String oStr = o1.toString();
System.out.println(oStr); //java.lang.Object@7150bd4d
//创建一个Person类型的对象
Person p1 = new Person("刘德华",50);
//调用toString方法
String pStr = p1.toString();
System.out.println(pStr);
//hobject.Person@152b6651
//重写后:Person[name=刘德华,age=50]
Person p2 = new Person("啊哈",1);
System.out.println(p2.toString()); //Person[name=啊哈,age=1]
//print方法后面的括号中如果是一个引用类型,
//会默认调用引用类型的toString方法
System.out.println(p2); //Person[name=啊哈,age=1]
}
}
package hobject2;
public class Star {
//身份证号
int id;
//姓名
String name;
//构造方法
public Star(){
}
public Star(int id, String name){
this.id = id;
this.name = name;
}
/*
* Object中的equals方法比较的是内存地址
* 在现实的业务逻辑当中,不应该比较内存地址,应该比较内容
* 所以Object中的equals方法也要重写
* 根据需求规定重写equals方法
* 需求规定:如身份证号一致,且名字也一致,则代表是同一个人
* sl.equals(s2);
*/
public boolean equals(Object obj){
//如果两个地址完全相同,肯定相同
if(this == obj) return true;
//括号里面Object没有id这个属性
//父类型引用指向子类型对象,需要强制类型转换
if(obj instanceof Star){
Star s = (Star)obj;
if(s.id == id && s.name.equals(name)){
return true;
}
}
return false;
}
}
package hobject2;
/*
* 关于Object中的equals方法
*
* Object中的equals方法:
*
* public boolean equals(Object obj){
* return(this == obj);
* }
*
* c1.equals(o2); o1是this,o2是obj
* == 两边如果是引用类型,则比较内存地址,
* 地址相同则是true,反之则false
*
* Object中的equals方法比较的是两个引用的内存地址
*
* Java对象中的equals方法的设计目的:判断两个对象是否一样
*/
public class Test01 {
public static void main(String[] args){
Object o1 = new Object();
Object o2 = new Object();
boolean b1 = o1.equals(o2);
System.out.println(b1); //false
Star s1 = new Star(100, "小明");
Star s2 = new Star(100, "小明");
Star s3 = new Star(110, "小明");
System.out.println(s1.equals(s2)); //false,重写完就是true
System.out.println(s2.equals(s3)); //false
}
}
package hobject2;
/*
* 关于java语言中如何比较两个字符串是否一致
*
* 在java中比较两个字符串是否一致,不能用"=="
* 只能调用 String类的equals方法
*/
public class Test02 {
public static void main(String[] args) {
String s1 = new String("ABC");
String s2 = new String("ABC");
System.out.println(s1 == s2); //false
//String已经重写了Object中的equals方法,比较的是内容
System.out.println(s1.equals(s2)); //true
}
}
package ifinalize;
/*
* 关于Object中的finalize方法
*
* finalize方法什么时候调用?
*
* 1.finalize方法每个java对象都有
*
* 2.f1nalize方法不需要程序员去调用,由系统自动调用
*
* 3.java对象如果没有更多的引用指向它,则该java对象成为垃圾数据,
* 等待垃圾回收器的回收,垃圾回收器在回收这个java对象之前会自动调用
* 该对象的finalize方法
* finalize方法是该对象马上就要被回收了,例如:需要释放资源,则可以在该方法中释放
*/
public class finalize {
public static void main(String[] args) {
Person p1 = new Person();
p1 = null; //没有引用指向它,等待回收
//程序员只能“建议”垃圾回收器回收垃圾
System.gc(); //ifinalize.Person@5f186fab马上就要被回收了
}
}
package ifinalize;
public class Person {
//重写Object中的finalize方法
public void finalize() throws Throwable{
System.out.println(this + "马上就要被回收了");
//垃圾回收也不一定会回收,可以让引用指向别的对象
Person p = this;
}
}
package jhashCode;
public class Test01 {
public static void main(String[] args) {
//hashCode方法返回的是该对象的哈希码值
//java对象的内存地址经过哈希算法得出的int类型的数值
Test01 t = new Test01();
System.out.println(t.hashCode()); //1901116749
}
}