• Java基础教程——Object类


    Object类

    Object类是Java所有类类型的父类(或者说祖先类更合适)
    《Thinking in Java(Java编程思想)》的第一章名字就叫“everything is Object”,一切皆为对象。


    toString()方法:自我描述

    任何类,都默认继承Object,所以都有toString()方法:

    public class Test {
    	public static void main(String[] args) {
    		Test a = new Test();
    		System.out.println(a.toString());
    		System.out.println(a);
    	}
    }
    

    我们在打印一个对象时,默认就调用了这个类的toString()方法,即使这个类的定义中没有toString()的代码,也会从Object中继承这个方法。


    Object类中toString()方法的定义为:

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    

    默认得到的字符串是“类名@hashCode”。

    hashCode是一个计算出来的值,有些地方说这个是对象的地址,这种说法不严谨,但问题不大。
    可以不严谨地认为这个字符串代表了对象的地址。

    重写toString,实现自定义的“自我描述”

    class Person {
    	public Person(String name) {
    		this.name = name;
    	}
    	private String name;
    	@Override
    	public String toString() {
    		return getClass().getName() + "{" + name + "}";
    	}
    }
    public class TestToString {
    	public static void main(String[] args) {
    		Person a = new Person("孙行者");
    		System.out.println(a.toString());
    	}
    }
    

    结果:

    Person{孙行者}
    

    实际应用举例:

    toString()可以自动生成:点击鼠标右键→source→Generate toString()

    public class Monkey {
    	private int id;
    	private String type;
    	private String name;
    	// 访问器略
    	@Override
    	public String toString() {
    		return "Monkey [id=" + id + ", type=" + type + ", name=" + name + "]";
    	}
    }
    

    equals方法和==

    Object类中的equals方法和==运算符没有区别(两个对象引用相等才认为相等):

        public boolean equals(Object obj) {
            return (this == obj);
        }
    

    String类重写了equals方法,所以内容相等就判为相等。

    具体参见String章节

    自定义类时,可以重写equals方法,提供自定义的判等标准:

    // 例:两个类name相同,即认为相等
    public class TestOverwriteEquals {
    	public static void main(String[] args) {
    		Food f1 = new Food("大米");
    		Food f2 = new Food("大米");
    		System.out.println("==:" + (f1 == f2));
    		System.out.println("equals:" + f1.equals(f2));
    	}
    }
    class Food {
    	public Food(String name) {
    		this.name = name;
    	}
    	private String name;
    	@Override
    	public boolean equals(Object obj) {
    		if (obj != null && obj.getClass() == Food.class) {
    			Food f = (Food) obj;
    			if (f.name.equals(this.name)) {
    				return true;
    			}
    		}
    		return false;
    	}
    }
    

    运行结果

    ==:false
    equals:true
    
  • 相关阅读:
    Python调用ansible API系列(三)带有callback的执行adhoc和playbook
    Python调用ansible API系列(二)执行adhoc和playbook
    Python调用ansible API系列(一)获取资产信息
    kube-proxy的功能
    Kubernetes集群部署史上最详细(二)Prometheus监控Kubernetes集群
    Kubernetes集群部署史上最详细(一)Kubernetes集群安装
    Celery异步调度框架(二)与Django结合使用
    【WPF on .NET Core 3.0】 Stylet演示项目
    [译]基于ASP.NET Core 3.0的ABP v0.21已发布
    .NET Conf 2019日程(北京时间)
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11179175.html
Copyright © 2020-2023  润新知