1. Object类
[Java八大常用类:包装类、String类、StringBuffer和StringBuilder类、Date和DateFormat类、calendar类、Jdk8的日期类、Math类和Random类、枚举](https://blog.csdn.net/qq_43446733/article/details/124782050?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167898487116800227438444%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167898487116800227438444&biz_id=0&utm_medium=distribute.pc_search_result.n one-task-blog-2alltop_positive~default-1-124782050-null-null.142%5Ev74%5Einsert_down1,201%5Ev4%5Eadd_ask,239%5Ev2%5Einsert_chatgpt&utm_term=Java%E5%B8%B8%E7%94%A8%E7%B1%BB&spm=1018.2226.3001.4187)
由官方介绍可见,Object属于
Java.lang
包内的一个类,而且提供了很多种方法, Object 是类层次结构的根类。每个类都以 Object 作为超类。所有对象(包括数组)都实现这个类的方法。 简单的说 Object类就是所有类的父类,包括我们所写的类,我们在使用类的时候就会利用 Object类中的方法,因为所有的父类都自动的继承了这个类,所以我们在日常学习和开发中见不到 Object这个类。子类拥有 Object类的所有方法,并且可以对这些方法进行重写,以满足我们的业务需求。
1.1 getClass()
返回此 Object 运行时的类,获取对象的真实类的全名称。比如:在使用多态时,父类引用变量,使用getClass()方法就可以看到真实的类:
应用场景:
- 查看当前使用该方法的对象,到底是哪个类;
- 在使用多态时,当代码多的时候使用 getClass()方法可以方便、快捷的知道 指向的是哪个子类。
package com.lCommonClasses.obj;
public class Object1 {
public void eat(){
System.out.println("吃");
}
}
class HashTest extends Object1{
@Override
public void eat() {
System.out.println("吃水果");
}
}
class Test{
public static void main(String[] args) {
Object1 obj1 = new HashTest();// 使用多态
Object1 obj2 = new Object1();
obj1.eat(); // 子类重写了父类的eat(),使用的是子类的方法
/**1.getClass():查看obj1归属于哪个 class*/
// 结果,class com.lClass.HashTest
System.out.println(obj1.getClass());
// 结果,class com.lClass.Object1
System.out.println(obj2.getClass());
}
}
1.2 hashcode()
hashcode作用是获取哈希码,也称为散列码;它实际上是返回一个 int整数。
哈希码的作用是:确定该对象在哈希表中的索引位置。
package com.lCommonClasses.obj;
public class Object1 {
public static void main(String[] args) {
HashTest hash1 = new HashTest(8);
HashTest hash2 = new HashTest(8);
/**1.调用hashCode()方法:
* 结果,460141958:这个数也就是哈希码,也称为散列码*/
System.out.println(hash1.hashCode());
}
}
1.3 equals()
package com.lCommonClasses.obj;
public class Object1 {
public static void main(String[] args) {
HashTest hash1 = new HashTest(8);
HashTest hash2 = new HashTest(8);
/**2.调用equals()方法:
* 没有重写equals方法前为false;重写之后为true*/
System.out.println(hash1.equals(hash2));
}
}
源码很简单,就是两个==号,但是我们知道类的引用类型的数据。用两个等于号去判断两个引用类型,其实是判断两者的内存地址是否相同,当一个类去new
一个新对象时,是在堆内存内开辟了一个新的空间;创建两个或者多个类的时候,每个类肯定有属于自己的空间,所有也有一个独一无二的地址,这就是为什么这个判断不成立的原因。
但是比较对象的引用对于我们在实际开发中没有意义,我们一般还是要重写该方法,比如去判断两者的参数是否相等:
package com.lClass;
public class HashTest {
private int age;
public HashTest() {}
public HashTest(int age) {this.age = age;}
public int getAge() {return age;}
public void setAge(int age) {this.age = age;}
/* 重写equals方法。如果HashTest生成的对象,它们传入的age等参数相等,
就可以用equals()判断两者一致,此时equals就不再是去判断两者的地址是否相同*/
@Override
public boolean equals(Object obj) {
HashTest h = (HashTest) obj; //多态
if(this.age == h.getAge()) {
return true;
}
return false;
}
}
1.3.1 == 和 equals 的区别
1)== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同 一个对象。
- (基本数据类型== 比较的是值,引用数据类型 == 比较的是内存地址)
2)equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:
- 若该类没有重写equals() 方法。当通过 equals() 比较该类的两个对象时, 等价于通过“==”比较这两个对象。
- 若该类重写了 equals() 方法。(一般,我们都覆盖 equals() 方法 将两个对象 的内容相等;)若它们的内容相等,则返回 true (即,认为这两个对象相等)
1.3.2 hashCode()与equals()的相关规定
如果两个对象相等,则hashcode一定也是相同的,对两个对象分别调用equals方法都返回true;
两个对象有相同的hashcode值,它们也不一定是相等的。
因此,equals 方法被重写过,则 hashCode 方法也必须被重写,hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象 指向相同的数据)
1.4 toString()
返回一个字符串来标识当前对象,就是 类名+符号@+对象的哈希码值
class Test{
public static void main(String[] args) {
Object1 obj1 = new HashTest();//使用多态
Object1 obj2 = new Object1();
/**4.toString():但是这个返回值视乎没什么意义,
* 所以为了返回值有更多的意义,我们可以重写这个方法*/
System.out.println(obj1);
System.out.println(obj1.toString());
System.out.println(obj2.toString());
}
}
其他方法:
clone()
notify()
wait()
1.5 Object转换为int类型
class Test{
public static void main(String[] args) {
/**5.将Object类型转换为int类型*/
Object obj = "-416464";
try{
Integer.parseInt(obj.toString());
} catch (NumberFormatException e) {
System.out.println("输入不是 int类型");
}finally {
System.out.println("obj="+obj);
}
}
}
1.6 String转换为int类型
class Test{
public static void main(String[] args) {
/**6.将String类型转换为int类型
两个结果不同:false;true;
底层是:-128 ~ 127时,两者相同,超出范围后就不同*/
String str= "129";
System.out.println(Integer.parseInt(str) == Integer.parseInt("129"));// String -> int,再比较
System.out.println(Integer.valueOf(str) == Integer.valueOf("129"));// String -> Integer,再比较
//当数值超出范围后,用`equals()方法`
if (Integer.valueOf(str).equals(Integer.valueOf("129"))){
System.out.println("true");
}else{
System.out.println("false");
}
}
}