第一章:面向对象
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
{
}