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
    
  • 相关阅读:
    解决ftp的pasv模式下iptables设置问题
    linux修改运行中的脚本
    shell脚本——列出质数
    转载:tomcat设置https的两种方式
    Centos缺少ifconfig命令
    转载:MySQL 数据库设计总结
    转载:HTML5视频推流方案
    转载:Linux五种方案快速恢复你的系统
    转载:HT可视化案例
    转载:21种JavaScript设计模式最新记录(含图和示例)
  • 原文地址:https://www.cnblogs.com/tigerlion/p/11179175.html
Copyright © 2011-2022 走看看