1.Object类介绍
- java.lang.Object 注意:lang包中的类无需导包可以直接使用
- 类
Object
是类层次结构的根类(最顶层的类 祖宗类)。 - 每个类都使用
Object
作为超类。任何一个类都直接或者间接的继承了Object类 - 所有对象(包括数组)都实现这个Object类的方法。
- 任何一个类都可以使用Object类中的方法
Object类的toString方法
package com.itheima.demo02toString;
import java.util.ArrayList;
import java.util.Random;
/*
String toString() 返回该对象的字符串表示。
Object类中toString方法的底层源码(了解):
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
1.getClass().getName():使用反射技术获取类的全类名(包名+类名)
"com.itheima.demo02toString.Person"
2."@"字符串的@符号,原样输出,起到分割的作用
3.hashCode():Object类的方法,可以获取对象的哈希值,哈希值是操作系统给我们返回的一个十进制的整数
4.Integer.toHexString(hashCode()):把十进制的整数转换为十六进制(0-9 a-f)
组合在一起:"com.itheima.demo02toString.Person@140e19d"==>对象在堆内存中的地址值
*/
public class Demo01ToString {
public static void main(String[] args) {
//创建Person对象
Person p1 = new Person("迪丽热巴",18);
//Person类默认继承了Object类,所以可以使用继承自Object类中的toString方法
String s = p1.toString();
System.out.println("s:"+s);//s:com.itheima.demo02toString.Person@140e19d 重写后:Person{name='迪丽热巴', age=18}
//注意:直接打印对象名,默认会调用对象的toString方法
System.out.println(p1);//com.itheima.demo02toString.Person@140e19d 重写后:Person{name='迪丽热巴', age=18}
/*
以后看一个类是否重写的toString方法,打印对象名
类重写类toString方法,打印的就不是地址值
类没有重写toString方法,打印地址值
*/
Random r = new Random();
System.out.println(r);//java.util.Random@17327b6 类没有重写toString方法
String str = new String("abc");
System.out.println(str);//abc 类重写类toString方法
ArrayList<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
System.out.println(list);//[aa, bb] 类重写类toString方法
}
}
package com.itheima.demo02toString;
//ctrl+鼠标左键:进入到类中|方法中
public class Person extends Object{
private String name;
private int age;
/*
Object类的toString方法,打印对象名,打印对象的地址值有意义吗?没有意义
重写Object类的toString方法,打印对象的属性值(name,age)
快捷键:alt+insert==>选择toString
*/
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
重点记忆
1.直接打印对象的名字,会默认调用对象的toString方法
2.Object类的toString方法,默认打印对象的地址值
3.重写toString方法快捷键 alt+insert==>toString方法打印对象的属性
Object类中的equals方法
package com.itheima.demo03equals;
public class Person {
private String name;
private int age;
/*
Object类的equals方法,默认比较两个对象的地址值,没有意义(地址值肯定不同)
重写equals方法,比较两个对象的属性值(name,age)
快捷键:alt+inert==>选择equals() and hashCode()
方法中的this:调用方法的对象p1
方法的参数o:传递的参数p2
*/
@Override
public boolean equals(Object o) {
//if语句目的:两个对象的地址相同,说是同一个对象,直接返回true,可以提高效率
if (this == o){
return true;
}
/*
o == null==>传递的参数是null,使用p1和null比较地址值肯定不同,直接返回false,可以提高效率
getClass() != o.getClass():使用反射技术,判断o(p2)是否为Person类型,不是Person类型直接返回false,可以提高效率
等价于!(o instanceof Person):判断某个对象是否属于某种数据类型
*/
/*if (o == null || !(o instanceof Person)){
return false;
}*/
if (o == null || getClass() != o.getClass()){
return false;
}
/*
Object o = p2 = new Person("李四",18);
多态: 父类的类型变量指向了子类的对象
多态弊端:不能使用子类特有的成员变量和成员方法
*/
Person person = (Person) o;
//先比较两个人的年龄是否相同,不相同直接返回false
if (this.age != person.age){
return false;
}
//this.name.equals(person.name) "张三".equals("李四"):String类重写了equals,比较的字符串的内容是否相同
return this.name != null ? this.name.equals(person.name) : person.name == null;
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package com.itheima.demo03equals;
import java.util.Random;
/*
boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。
equals方法的底层源码:
public boolean equals(Object obj) {
return (this == obj);
}
this是谁:哪个对象调用的方法,方法中的this就是哪个对象
obj:传递的参数
==:比较运算符
基本数据类型:==号比较的是值 10==20
引用数据类型:==号比较的是对象的地址值 aa11==bb22
*/
public class Demo02Equals {
public static void main(String[] args) {
Person p1 = new Person("张三",18);
Person p2 = new Person("李四",18);
System.out.println(p1);//com.itheima.demo03equals.Person@140e19d
System.out.println(p2);//com.itheima.demo03equals.Person@17327b6
//Person默认继承了Object类,所以可以使用继承自Object类的equals方法
boolean b1 = p1.equals(p1);
System.out.println("b1:"+b1);
System.out.println("----------------");
boolean b2 = p1.equals(null);
System.out.println("b2:"+b2);
System.out.println("----------------");
Random r = new Random();
boolean b3 = p1.equals(r);
System.out.println("b3:"+b3);
System.out.println("----------------");
boolean b4 = p1.equals(p2);
System.out.println("b4:"+b4);
System.out.println("----------------");
Person p3 = new Person("王五",18);
Person p4 = new Person("王五",18);
System.out.println(p3);//com.itheima.demo03equals.Person@131245a
System.out.println(p4);//com.itheima.demo03equals.Person@16f6e28
boolean b5 = p3.equals(p4);
System.out.println("b5:"+b5);//b5:true
}
}
重点记忆
1.没有重写Object类的equals方法,默认比较两个对象的地址值
2.会使用快捷键 alt+insert equals() and hashCode()重写equals方法,比较两个对象的属性
Object类中的重点
会使用快捷键:alt+insert,给类添加toString和equals方法就可以了
重点记忆
toString方法:
1.直接打印对象的名字,会默认调用对象的toString方法
2.Object类的toString方法,默认打印对象的地址值
3.重写toString方法快捷键 alt+insert==>toString方法打印对象的属性
equals方法:
1.没有重写Object类的equals方法,默认比较两个对象的地址值
2.会使用快捷键 alt+insert equals() and hashCode()重写equals方法,比较两个对象的属性
native本地方法
native修饰的方法:说明这个方法不是java语言编写的
调用的是其他语言编写的代码或者操作系统底层的代码,看不到具体的方法
Object类:
public native int hashCode();
public final native Class<?> getClass();