第一章:面向对象04

第一章:面向对象

Object类

抽象类的注意事项:

  • Object 类是所有 Java 类的根基类
  • 如果在类的声明中未使用 extends 关键字指明其基类,则默认基类为 Object 类
1. 为什么需要重写Object 类的toString()方法。

toString()方法, 返回该对象的字符串表示。通常 toString 方法会返回一个“以文本方式表示”此对象的字符串,Object 类的 toString 方法返回一个字符串,该字符串由类名加标记@和此对象哈希码的无符号十六进制表示组成,Object 类 toString 源代码如下:
getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
在进行 String 与其它类型数据的连接操作时,如:
System.out.println(student);,它自动调用该对象的 toString()方法

/*
*    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    * 源代码上的toString方法的默认实现是:
    *   类名@对象的内存地址转换为十六进制的形式

*   其实SUN公司开发java语言的时候,建议所有的子类都去重写toString()方法。
*   toString方法其实应该是一个简洁的,易阅读的。
* */

public class Test01 {
    public static void main(String[] args) {
        MyTime t1 = new MyTime(1970,1,1);
        System.out.println(t1.toString());

    }
}
class MyTime{
    int year;
    int month;
    int day;
    public MyTime() {
    }
    public MyTime(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    //重写toString方法
    public String toString(){
        return this.year + "年" + this.month + "月" + this.day + "日";
    }
}
2. “==”与“equals”方法。

/**
 * 关于Object类中的equals方法
 *     public boolean equals(Object obj) {
 *         return (this == obj);
 *     }
 *     在Object中默认表示的是判断两个对象是否相等。
 *
 *   2. 以后编程当中通过 equals方法判断两个对象是否相逢
 *   3.我们需要研究一下Object类给的默认的equals方法够不够用
 *      在Object中默认表示的是判断两个对象是否相等。而我们需要判断的两个对象中的值是否相等,因此这不够用
 */
public class Test02 {
    public static void main(String[] args) {
        //判断两个基本数据类型是否相等直接使用“==”就行
        int a = 100;
        int b = 100;
        System.out.println(a == b);
        //判断两个java对象是否相等,我们该怎么办??
        MyTime1 t1 = new MyTime1(2008,8,8);
        MyTime1 t2 = new MyTime1(2008,8,8);
        //测试两个对象是否相等,能不能使用"=="??
        System.out.println(t1 == t2);

        System.out.println(t1.equals(t2));

    }
}
class MyTime1{
    int year;
    int month;
    int day;
    public MyTime1() {
    }
    public MyTime1(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }
    //当年相同,月相同,并且月相同则代表两个对象相等
    public boolean equals(Object obj) {
        if(obj instanceof MyTime1){
            MyTime1 m = (MyTime1)obj;
            if (m.year == this.year && m.month == this.month && m.day == this.day){
                return true;
            }
        }
        return false;
      }
}


3. hashCode方法方法。

/*
	hashCode方法:
		在Object中的hashCode方法是怎样的?
			public native int hashCode();

			这个方法不是抽象方法,带有native关键字,底层调用C++程序。

		hashCode()方法返回的是哈希码:
			实际上就是一个java对象的内存地址,经过哈希算法,得出的一个值。
			所以hashCode()方法的执行结果可以等同看做一个java对象的内存地址。
*/
public class Test07{
    public static void main(String[] args){
        Object o = new Object();
        int hashCodeValue = o.hashCode();

        // 对象内存地址经过哈希算法转换的一个数字。可以等同看做内存地址。
        System.out.println(hashCodeValue); //798154996

        MyClass mc = new MyClass();
        int hashCodeValue2 = mc.hashCode();
        System.out.println(hashCodeValue2); //1392838282

        MyClass mc2 = new MyClass();
        System.out.println(mc2.hashCode()); // 523429237
    }
}

class MyClass
{
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值