美文网首页
Java之Object

Java之Object

作者: 是归人不是过客 | 来源:发表于2020-09-11 22:22 被阅读0次

    Object类是java类的根基类

    Object类中的toString()方法:

    1、SUN在object类中设计toString的目的:返回java对象的字符串的表现形式。

    在现实的开发过程中,Object里边的toStirng方法已经不够用了,因为Objecty的toString方法实现的结果

    不满意,所以Object中的很多方法被重写了。

    2、Object中的toString方法返回:类名@java对象的内存地址经过哈希算法得出int类型值再转换成16进

    制,这个输出结果可以等同的看作java对象在堆中内存地址

    举个栗子:

    public class Test{
        public static void main(String [] args) {
           Object o1 = new Object();
           String str = o1.toString();
           System.out.println(str); // java.lang.Object@123772c4
           
           Person p1 = new Person("HL", 0);
           
           String pStr = p1.toString();
           System.out.println(pStr); // tranc.Person@7d6f77cc
           
           Person p2 = new Person("gl", 50);
           System.out.println(p2.toString());
           System.out.println(p2); // 结果同上
           // 注意:print方法后面括号,如果是一个引用类型,会默认调用给引用类型的toStirng()方法
           
        }
    }
    
    class Person{
        String name;
        int age;
        
        Person(String name,int age){
            this.name = name;
            this.age = age;
        }
        
        // person默认继承Object类,所以可以重写toString方法
        // 根据项目要的需求而定
        // 需求规定, 现实格式:person【name = "hl",age = 50】
        public String toString() {
            return "person[name = " + this.name + ",age=" + this.age + "]";
            
        }
    }
    

    输出:

    java.lang.Object@123772c4
    person[name = HL,age=0]
    person[name = gl,age=50]
    person[name = gl,age=50]
    

    Object类中的equals()方法:

    equals方法:
    
        实现:
        public boolean equals (Object obj){
        return (this == obj);
        }
    
        equals方法比较的是两个引用中的内存地址
        
        java类中的equals方法的设计目的:判断两个对象是否一样
    

    举个栗子:

    public class Test{
        public static void main(String [] args) {
           Object o1 = new Object();
           Object o2 = new Object();
           
           boolean b = o1.equals(o2);
    //        根据源杩:return (o1 == o2) 
    //        ==号两边,内存地址相等,返回true,不相等,返回false
           
           System.out.println(b); // false
           
           Star s1 = new Star(100,"hl");
           Star s2 = new Star(100,"hl");
           Star s3 = new Star(101,"hl");
           System.out.println(s1.equals(s2)); // false
           // 我们发现,在现实的业务逻辑中,不应该比较内存地址,而是应该比较内容
           //所以,equals需要重写  public boolean equals(Star s) 
           System.out.println(s1.equals(s3));
        }
    }
    class Star{
        int id;
        String name;
        
        // Constructor
        public Star(int id,String name) {
            this.id = id;
            this.name = name;
        }
    //  法一:
    //  public boolean equals(Star s) {
    //      if(this.id == s.id && this.name == s.name) {
    //          return true;
    //      }else {
    //          return false;
    //      }
    //  }
    //  法二:
        public boolean equals(Object obj) {
            if(this == obj) return true; // 如果地址都相等,那么内容一定相等
            if(obj instanceof Star) { // nstanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false。
                Star s = (Star)obj;
                if(this.id == s.id && this.name == s.name ){
                    return true;
                }else {
                    return false;
                }
            }else {
                return false;
            }
        }
    }
    

    输出:

    false
    true
    false
    

    补充、重要: 关于java语言中如何比较两个字符串是否一致

    在java中比较两个字符串是否一致,不能使用”==“,严禁

    字符串是引用数据类型,不是基本数据类型,所以只能调用String类中的equals

    举个栗子:

    public class Test2 {
        public static void main(String args[]) {
            String s1 = new String("123");
            String s2 = new String("123");
            
            System.out.println(s1 == s2); // false
            
            //String已经重写了Object中的equals方法,比较的是内容
            System.out.println(s1.equals(s2)); // true
        }
    }
    

    输出:

    false
    true
    

    Object类中的finalize()方法:

    和垃圾回收器紧密联系在一起

    1、finalize方法,每个java对象都有

    2、finalize方法,不需要程序员调用,由系统自动调用

    3、java对象如果没有更多的引用指向它,则该java对象成为垃圾数据,等待垃圾回收器的回收,垃圾回收器在回收这个对象之前会自动调用该对象的finalize方法

    finalize方法是该对象马上要被回收了,例如:需要释放资源,则可以在该方法中释放

    举个栗子

    public class Test{
        public static void main(String [] args) {
             Person p1 = new Person();
             
             p1 = null; // 无引用指向,等待回收
             
             // 程序员只能“建议” 垃圾回收回收垃圾 
             System.gc(); // 运行垃圾回收器
        }
    }
    class Person{
        protected void finalize() throws Throwable{
            System.out.println(this + "马上就要被回收了");
    //      让引用再次重新指向该对象,该对象不是垃圾,不会被回收!
    //      Person p = this;
        }
    }
    

    输出:

    tranc.Person@345a315e马上就要被回收了
    

    相关文章

      网友评论

          本文标题:Java之Object

          本文链接:https://www.haomeiwen.com/subject/tegbektx.html