zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    [bug] C:warning: implicit declaration of function ‘getline’
    [Java] 内部类
    [架构] 数据库技术选型
    [bug] Maven修改pom文件后jdk版本回退
    [物联网] 电气 & 工控
    [bug] mysql 忘记密码
    [物联网] 电路分析
    机器学习sklearn(二十五): 模型评估(五)量化预测的质量(二)分类指标
    机器学习sklearn(二十四): 模型评估(四)量化预测的质量(一)scoring 参数: 定义模型评估规则
    机器学习sklearn(二十三): 模型评估(三)交叉验证:评估估算器的表现(三) 交叉验证迭代器
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11179175.html
Copyright © 2011-2022 走看看