java学习初探6之Object类,java学习初探object
分享于 点击 19632 次 点评:66
java学习初探6之Object类,java学习初探object
1.Object类
toString
package since;
/*
* Object中toString方法
* 返回该对象的字符串表示。
*
* 在现实开发中,Object中toString方法不够用,因为Object的toString的实现结果不满意。
*
* Object中的toString方法就要被重写的。
*
* SUN是这样实现toString方法的:
* public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
* 类名@java对象的内存地址经过哈希算法得出的int类型值再转换成十六进制
*
*/
public class Test01 {
public static void main(String[] args) {
Object object=new Object();
String o=object.toString();
System.out.println(o);//java.lang.Object@15db9742
Person person=new Person("张三",40);
System.out.println(person.toString());//Person[name=张三,age=40]
//print方法后面括号中如果是一个引用类型,默认调用引用类型的toString方法
System.out.println(person);//Person[name=张三,age=40]
}
}
class Person{
String name;
int age;
public Person(String name,int age) {
this.name=name;
this.age=age;
// TODO Auto-generated constructor stub
}
//重写toString,根据项目需求而定
//显示格式:Person[name=刘德华,age=50]
public String toString(){
return "Person[name="+name+",age="+age+"]";
}
}
equals
package since;
/*
* 关于Object中equals方法实现方法
*
* public boolean equals(Object obj) {
return (this == obj);
}
o1.equals(o2); o1是this,o2是obj
==两边如果是引用类型,则比较内存地址,地址相同是true,不同为false
*/
public class Test02 {
public static void main(String[] args) {
Object o1=new Object();
Object o2=new Object();
boolean test=o1.equals(o2);
System.out.println(test);//false
Star s1=new Star(1000, "章子怡");
Star s2=new Star(1000, "章子怡");
System.out.println(s1.equals(s2));//true
}
}
class Star{
int id;//身份证号
String name;//姓名
public Star(int id,String name) {
this.id=id;
this.name=name;
}
//Object中的equals方法比较的是内存地址,
//在现实业务逻辑中,不应该比较内存地址,应该比较内容
//重写equals
//根据需求规定重写,如果身份证号和名字都一致,是同一个人
public boolean equals(Object object){
if(object instanceof Star){
Star s=(Star)object;
if(this.id==s.id&&this.name.equals(s.name)){//这里字符串equals,sun重写过,用来比较字符串内容是否相等
return true;
}else {
return false;
}
}else {
return false;
}
}
}
finalize
垃圾回收器(GC)
package since;
/*
finalize方法什么时候调用?
1.finalize方法每个java对象都有
2.finalize方法不需要程序员去调用,由系统自动调用
3.java对象如果没有更多引用指向它,则该对象成为垃圾数据,
等待垃圾回收器的回收,垃圾回收器在回收这个java对象之前会自动
调用该对象的finalize方法。
finalize方法是该对象马上就要被回收了,例如:需要释放资源,则可以在该方法中释放。
*/
public class Test04 {
public static void main(String[] args) {
People p1=new People();
p1=null;//没有引用再指向它,等待回收
//程序员只能“建议”垃圾回收器回收垃圾
System.gc();
}
}
class People{
//重写finalize方法
protected void finalize() throws Throwable {
System.out.println(this+"马上就要被回收了");
//让引用再次重新指向该对象,该对象不是垃圾,不会被垃圾回收器回收
People p=this;
}
}
hashCode()
package since;
/* hashCode方法:
* public native int hashCode();
* 其中native与底层(动态链接库)c++关联,其实上述方法是有方法实体的,更不是抽象方法
*/
public class Test05 {
public static void main(String[] args) {
//返回的是该对象的哈希码值
//java对象的内存地址经过哈希算法得到的int类型的数值
Test05 test05=new Test05();
System.out.println(test05.hashCode());//366712642
}
}
相关文章
- 暂无相关文章
用户点评