二十、Java基础之Object类

/*
一、关于object中的toString方法
1. 定义:toString返回该对象的字符串的表示

2. 在现实的开发中,Object 中的方法已经不够用了,
因为Object汇总的toString方法显示的结果不满意
   Object中的toSting方法就是要被重写的

3.SUN中是这样实现的toString方法:
public String toString(){
return getclass().getName()+"@"+Intege.toHexString(hashCode());
}
Object中的toString方法的放回:类名@java对象的内存地址经过哈希算法得出的int类型值再转换成十六进制
这个输出结果可以等同看做java对象在内存中的地址


*/
public class ToString {

    public static void main(String[] args){

        //创建一个Object类型对象
        Object o=new Object();

        //调用toString方法
        String oStr=o.toString();
        System.out.println(oStr);//java.lang.Object@4554617c

        //创建一个Person对象
        Person p=new Person("小黄",12);

        //调用toString方法
        String pStr=p.toString();
        System.out.println(pStr);

        Person p2=new Person("hahaha",22);
        //print后面括号中如果是一个引用类型,会默认引用类型的toString方法
        System.out.println(p2.toString());//Person[name=hahaha,age=22]
        System.out.println(p2);//Person[name=hahaha,age=22]

    }
}

class Person{

    String name;
    int age;

    Person(){}

    Person(String name,int age){
        this.name=name;
        this.age=age;

    }

    //重写toString方法
    //根据项目的需求而定
    //项目规定,显示格式:Person[name=AAA,age=50]
    public String toString(){
        return "Person[name="+name+",age="+age+"]";
    }
}
/*
二、关于Object中的equals方法
sun中:
public boolean equals(Object obj) {
return (this == obj);
}
o1.equals(o2);o1是this,o2是obj
==两边如果是引用类型,则比较内存地址,地址相同则true,反之false
Object中的equals方法比较的是两个引用的内存地址
java对象中的equals方法设计的目的:判断两个对象是否一样。

*/

public class equalsMethod {

    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,"小明");
        System.out.println(s1==s2);//false
        System.out.println(s1.equals(s2));//true

    }
}

class Star{
    //身份证号
    int id;

    //姓名
    String name;

    //Constructor
    public Star(int id,String name){
        this.id=id;
        this.name=name;
    }
    //Object中的euqals方法比较的是内存地址
    //在现实业务中,不应该比较内存地址,应该比较内容,
    //所以Object中的equals方法也需要重写
    //根据需求规定重写equals方法:如果身份证号一致,并且名字一致,则表示一个人
    public boolean equals(Object obj) {
        if(obj instanceof Star){
            //强制类型转换
            Star s=(Star)obj;
            if(s.id==id && s.name.equals(name)){
                return true;
            }
        }
        return false;
    }
}
/*
三、在java比较两种字符串是否一致
不能使用“==”

只能调用String类的equals方法
*/
public class TestStringAndString {

    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
    }
}
/*
四、关于Object中的finalize方法:
fianlize方法什么时候调用?
1.finalize方法每个java对象都有;
2.fianlize方法不需要程序员去调用,有系统自动调用
3.java对象如果没有更多的引用指向它,则该java对象,成为垃圾数据,
等待垃圾回收器的回收,垃圾回收器在回收这个java对象之前会自动启动调用该对象的finalize
*/
public class TestFinalize {

    public static void main(String[] args){

        A a=new A();

        a=null;

        //程序员只能建议垃圾回收器回收垃圾
        System.gc();//Object类.A@25900a5a马上就被要回收了!

    }
}

class A{
    //重写Object中的finalize方法
    public void finalize() throws Throwable{
        System.out.println(this+"马上就被要回收了!");
    }

    //让引用再次重新指向该对象,该对象不是垃圾数据,不会被垃圾回收器回收!
    A a= this;
}
/*
五、关于hashCode
*/
public class TestHashCode {

    public static void main(String[] args){

        TestHashCode t=new TestHashCode();
        System.out.println(t.hashCode());//1163157884
    }
}

 

posted @ 2018-12-15 13:25  旅行没有终点  阅读(200)  评论(0编辑  收藏  举报