文章目录

  • 定义
  • toString方法
  • 覆盖重写
  • equals方法
  • Objects类

定义

java.lang.Object类是Java语言的根类,也就是所有类的父类
它中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。

java.lang.Object
类 Object 是类层次结构的根(父)类。
每个类(Person,Student…)都使用 Object 作为超(父)类。
所有对象(包括数组)都实现这个类的方法。

toString方法

String toString() 返回该对象的字符串表示。
其实该字符串内容就是对象的类型+@+内存地址值。

由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。
注意7,10
//直接打印对象的名字,其实就是调用对象的toString p=p.toString();
//看一个类是否重写了toString,直接打印这个类的对象即可,
//如果没有重写toString方法那么打印的是对象的地址值

public static void main(String[] args) {Person p = new Person("张三",18);String s = p.toString();System.out.println(s);//com.itheima.demo01.Object.Person@75412c2f | abc | Person{name=张三 ,age=18}//直接打印对象的名字,其实就是调用对象的toString  p=p.toString();System.out.println(p);//com.itheima.demo01.Object.Person@5f150435 | abc | Person{name=张三 ,age=18}//看一个类是否重写了toString,直接打印这个类的对象即可,//如果没有重写toString方法那么打印的是对象的地址值Random r = new Random();System.out.println(r);//java.util.Random@3f3afe78  没有重写toString方法Scanner sc = new Scanner(System.in);System.out.println(sc);//java.util.Scanner[delimiters=\p{javaWhitespace}+..  重写toString方法ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);System.out.println(list);//[1, 2, 3]  重写toString方法
}

覆盖重写

如果不希望使用toString方法的默认行为,则可以对它进行覆盖重写。例如自定义的Person类:

public class Person {  private String name;private int age;@Overridepublic String toString() {return "Person{" + "name='" + name + '\'' + ", age=" + age + '}';}// 省略构造器   与Getter Setter
}

在IntelliJ IDEA中,可以生成toString方法:

@Override
public String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';
}

equals方法

调用成员方法equals并指定参数为另一个对象,则可以判断这两个对象是否是相同的。这里的“相同”有默认和自定义两种方式。

默认地址比较
如果没有覆盖重写equals方法,那么Object类中默认进行算符 == 运算符的对象地址比较,只要不是同一个对象,结果必然为false。
基本数据类型:比较的是值
引用数据类型:比价的是两个对象的地址值

Person类默认继承了Object类,所以可以使用Object类的equals方法
boolean equals(Object obj) 指示其他某个对象是否与此对象“相等”。
equals方法源码:public boolean equals(Object obj) {return (this == obj);}参数:Object obj:可以传递任意的对象== 比较运算符,返回的是一个布尔值 true falsethis是谁?那个对象调用的方法,方法中的this就是那个对象;p1调用的equals方法所以this就是p1obj是谁?传递过来的参数p2this==obj -->p1==p2
Person p1 = new Person("迪丽热巴",18);
Person p2 = new Person("古力娜扎",19);
Person p3 = new Person("迪丽热巴",18);
System.out.println("p1:"+p1);//p1:com.itheima.demo01.Object.Person@58ceff1
System.out.println("p2:"+p2);//p2:com.itheima.demo01.Object.Person@7c30a502

注意:上面P1,P3是用一个字符串!地址相同

p1=p2; //把p2的地址值赋值给p1
boolean b = p1.equals(p2);
System.out.println(b);//true

Object类的equals方法,默认比较的是两个对象的地址值,没有意义
所以我们要重写equals方法,比较两个对象的属性(name,age)
问题:
隐含着一个多态
多态的弊端:无法使用子类特有的内容(属性和方法)
Object obj = p2 = new Person(“古力娜扎”,19);
解决:可以使用向下转型(强转)把obj类型转换为Person

public class Person {    private String name;private int age;@Overridepublic boolean equals(Object obj) {// 如果对象地址一样,则认为相同if (this == obj)return true;// 如果参数为空,或者类型信息不一样,则认为不同if (o == null || getClass() != o.getClass())return false;// 转换为当前类型Person person = (Person) obj;// 要求基本类型相等,并且将引用类型交给java.util.Objects类的equals静态方法取用结果return age == person.age && Objects.equals(name, person.name);}
}

也可以生成。

Objects类

在刚才IDEA自动重写equals代码中,添加了一个Objects工具类,
在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法
就优化了这个问题。方法如下:

public static boolean equals(Object a, Object b)`:判断两个对象是否相等。

public static void main(String[] args) {String s1 = "abc";//String s1 = null;String s2 = "abc";//boolean b = s1.equals(s2); // NullPointerException null是不能调用方法的,会抛出空指针异常//System.out.println(b);/*Objects类的equals方法:对两个对象进行比较,防止空指针异常public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));}*/boolean b2 = Objects.equals(s1, s2);System.out.println(b2);

小结:

进阶01Object类相关推荐

  1. Selenium2(WebDriver)总结(五)---元素操作进阶(常用类)

    Selenium2(WebDriver)总结(五)---元素操作进阶(常用类) 1.Alert类 Alert是指windows弹窗的一些操作,需要new一个Alert类 driver.switchTo ...

  2. Python面向对象进阶及类成员

    再次了解多继承 先来一段代码 #!/usr/bin/env python # _*_ coding:utf-8 _*_ class A:    def bar(self):        print( ...

  3. 进阶面向对象——类的成员

    类的成员可以分为三大类:字段.方法.属性.      @:所有成员中,只有普通字段的内容保存在对象中,即:根据此类创建了多少对象,在内存中就有多少普通字段.而其他的成员都是保存在类中的,即:无论对象的 ...

  4. c++进阶---IO类的详细介绍(一)

    IO类 c++为了更好的处理不同的种类的IO的操作,IO库中定义了庞大的类库来处理不同种类的IO操作,该类库组成如下图所示: 首先,我们先了解一下这个庞大的IO库各个类之间的关系. ios是最基本的父 ...

  5. 01-object类,常用API

    声明:此博客来自于黑马程序员学习笔记,并非商用,仅仅是为了博主个人日后学习复习用,如有冒犯,请联系qq208820388立即删除博文,最后,来跟我一起喊黑马牛逼黑马牛逼黑马牛逼 01[Object类. ...

  6. python经典类新式类_菜鸟世界 -python进阶---新式类与经典类

    1.什么是新式类,什么是经典类 #coding=utf-8 class A: pass class B(object): pass A是经典类,B是新式类,这是Python2.x 里所特有的现象,之所 ...

  7. 【python进阶】类的__slots__属性

    python作为一门动态语言,可以在对象创建后动态的添加属性和方法. 示例1:动态添加属性 class Dog(object):def __init__(self, name, age):self.n ...

  8. JavaSE进阶学习笔记-目录汇总(待完成)

    声明:此博客来自于黑马程序员学习笔记,并非商用,仅仅是为了博主个人日后学习复习用,如有冒犯,请联系qq208820388立即删除博文,最后,来跟我一起喊黑马牛逼黑马牛逼黑马牛逼 JavaSE进阶学习笔 ...

  9. Python面向对象魔法、元类简介及使用

    文章目录 一.反射实战案例 二.面向对象魔法方法 三.魔法方法笔试题 四.元类简介 五.产生类的两种方式 六.元类基本使用 七.元类进阶 一.反射实战案例 1.获取配置文件中所有大写的配置 小写的直接 ...

最新文章

  1. eclipse failed to create the java virtual machine 问题图文解析
  2. K8s如何改变美团的云基础设施?
  3. html给img添加滤镜,给图片在博客中添加滤镜效果_CSS/HTML
  4. linux cut列截取工具使用示例
  5. Linux shell的和||
  6. 矩阵中的最长递增路径
  7. (46)Xilinx ILA IP核配置(七)(第10天)
  8. python大游戏_玩游戏就能学Python?太炫酷了!
  9. learn go ifelse
  10. VS Code 快捷键设置
  11. Python爬虫学习(八)----scrapy框架
  12. 学生干部管理系统的现状分析和可行性分析
  13. 技术分析是我的唯一信仰
  14. 还有没换国旗头像的么 头像领取方法 不要再@微信官方啦
  15. 数据仓库(DW)、数据湖、数据中台的关系
  16. 字节跳动 2023 校园招聘火热开启!
  17. 【问题】[已修改但尚未保存]/bin/bash: wq:未找到命令 Shell 已返回127
  18. Python的import
  19. 为什么你得不到 90 度的温暖
  20. calendar 5 android版,calendars 5 安卓

热门文章

  1. css清除浮动的几种方法_清除浮动的几种方法
  2. 杀破狼java_终于把《杀破狼》看完了
  3. 用c语言编写五子棋用vs写,c语言写的五子棋人与人对战
  4. java 数据类型转换的一场_Java数据类型之间的转换
  5. laravel 运用
  6. WPF 入门笔记之基础
  7. iOS 一个方法首次安装滚播图 展示应用简介
  8. jQuery 的 ajax
  9. Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明
  10. 工资微软微软员工你了解么??