面向对象学习20 - Object类
java.lang.Object类
java.lang.Object类是类层次结构的根类,即所有其他类的父类。每个类都使用Object作为超类。
Object类型的变量于除Object以外的任意应用数据类型的对象都存在多态引用。
Object类的概述
Object类的说明
因为Object类是其他所有类的根类,所有该类中声明的结构(属性、方法等)就具有通用性
Object类中没有声明属性,提供了一个空参的构造器。
学习时关注Object类中的方法
常用方法
.equals() .toString()
需要了解的方法
.clone() .finalize()
.clone()
新创建一个对象,该对象的值与使用该方法的对象相同,地址不同,即通过该方法可以初始化一个新对象,值与原有对象相同
.finalize()
此方法调用的时机:当GC(垃圾回收器)要回收此对象时,调用如下方法:
//子类重写方法,可在释放前进行某些操作
@Deprecated(since = "9")
此方法在JDK版本9已经过时了,不过还可以使用
该方法存在的问题是,其本质上是在对象被回收前稍微让对象在停留一下,
如果有两个对象同时使用该方法时,可能会不断在两个方法之间反复要求对象停留
.equals()
适用性:任何引用数据类型
public class UserTest{
    public static void main(String[] args){
        User u1 = new User("Tom",12);
        User u2 = new User("Tom",12);
        System.out.println(u1.equals(u2));//flase
    }
}
public boolean equals(Object obj){//上面例子中出现的equals方法的代码
    return(this == obj);
}
**子类使用说明**
自定义的类在没有重写Object中equals()方法的情况下,调用的就是
Object类中的equals方法,含义是比较两个对象的地址是否相同
**字符串使用equals方法**
对于像String、File、Date和包装类等,他们都重写了Object类中的equals方法,
用于比较两个对象的实体内容是否相等。
自定义类如果调用equals方法一般也得重写
```java
@Override
public boolean equals(Object obj){
    if(this == obj){
        return ture;
    }else if(obj instanceOf User){
        User user = (User)obj;
        return this.age == user.age && this.name.equals(User.name);
    }
    ruturn flase;
}
也可以自动实现
Alt + insert -> equals()and hashCode()
开发中使用说明:
实际开发中,针对于自定义的类,常常会判断两个对象是否equals(),而此时主要是判断两个对象的属性值是否相等。
所以:经常重写Object类中的equals()方法。
可以手动重写也可以使用编译器自动重写。
区分==和equals():
==:这是一个运算符
1.使用范围:基本数据类型、引用数据类型
2.基本数据类型:判断数据的值是否相等
3.引用数据类型:比较两个引用变量的地址值是否相等
.equals():这是一个方法
1.使用范围:只能使用在引用数据类型上
2.具体使用:分为是否重写方法
自定义的类在没有重写Object中equals()方法的情况下,调用的就是
Object类中的equals方法,含义是比较两个对象的地址是否相同
对于像String、File、Date和包装类等,他们都重写了Object类中的equals方法,
用于比较两个对象的实体内容是否相等。
自定义类如果调用equals方法一般也得重写
重写时要关注于这个地方的判断标准,哪些成员变量相等意味着相等。
toString()
class User{
    String name;
    int age;
    public User(){
        this.name = name;
        this.age = age;
    }
}
public class ToStringTest{
    public static void main(String[] args){
        User u1 = new User("Tom" , 12);
        System.out.println(u1.toString());//地址值
        String s1 = new String("Hello");
        System.out.println(s1.toString());//Hello
    }
}
toString()的使用:
Object类中的toString()的定义:
public String toString(){
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
使用场景
平时我们在调用System.out.println()打印对象引用变量时,其实就调用了对象的toString().
子类使用说明:
自定义的类:自己没重写的时候,就是返回使用该方法的属性的地址的字符串
像String、File、Date或包装类等Object的子类都重写了toString()方法
调用时,返回实体内容
习惯上,开发中对自定义的类,在使用toString()方法时,也希望显示实体内容而非地址值
这时,就需要对toString()方法进行重写。
手动重写演示
@Override
public String toString(){
    return "User{name = " + name + ",age = " + age + "}";
}
自动重写
Alt + insert -> toString()
案例:
定义两个类,父类GeometricObject代表几何形状,子类Circle表示圆形。
写一个测试类,创建两个Circle对象,判断其颜色是否相等,
利用equals()方法判断其半径是否相等;利用toString()方法输出半径。
//省略了成员变量的get、set方法
public class GeometricObject{
    protected String color;
    protected double weight;
    public GeometricObject(){
        color = "white";
        weight = 1.0;
    }
    piblic GeometricObject(String color , double weight){
        this.color = color;
        this.weight = weight;
    }
}
public class circle extends GeometricObject{
    private double radius;
    public Circle(){
        color = "white";
        weight = 1.0;
        radius = 1.0;
    }
    public Circle(double radius){
        color = "white";
        weight = 1.0;
        this.radius = radius;
    }
    public Circle(String color,double weight,double radius){
        super(color,weight);
        this.radius = radius;
    }
    public double findArea(){
        return 3.14 * radius * radius;
    }
}
//重写.toString()方法
public String toString(){
    return "Circle[radius = " + radius + "]";
}
//重写.equals()方法
public boolean equals(Object obj){
    if(this == obj){
        return ture;
    }
    if(obj instanceof Circle){
        Circle c = (Circle)obj;
        return this.radius == c.radius;
    }
    return false;
}
public class CircleTest{
    public static void main(String[] args){
        Circle c1 = new Circle(2.3);
        Circle c2 = new Circle(red,20,3.4);
        System.out.println("颜色是否一致?" + c1.getColor().equals(c2.getColor()));
        System.out.println("半径是否相等?" + c1.equals(c2));
        System.out.println(c1);
        System.out.println(c1.toString());
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号