美文网首页
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