Java Object类和包装类深入解读

目录
  • 查看源代码方法
  • Object类
    • 定义及应用
    • 1. toString()
    • 2. equals( )
  • 包装类
    • 定义及应用
    • 装箱和拆箱
    • 自己实现包装类
    • 通过包装类让Object类接收基本数据类型
    • 包装类的对象比较
    • 包装类和String的相互转换

查看源代码方法

在IDEA中双击 shift 键,可以搜索相关类名,查看源代码

点击Structure ,左侧用橙色床框住的部分是类的结构,结构包含所有的方法、属性、内部类的声明。结构中带绿色小锁的图标表示 public 权限,钥匙图标就是继承权限(protected),红色锁的图标就是 private 权限。右边是源码。

Object类

定义及应用

Object类是所有类的默认父类,不需要使用 extends 显示继承,因此 Object 类的所有方法(private 除外),所有类的对象都能使用。因此所有对象都可以通过Object来接收

示例:

        Object obj1 = "test";
        Object obj2 = new Student("小陈",18);
        Object obj3 = 123;

在Java中对Object类做了扩充,使它不仅是所有类的父类,只要是引用数据类型,都可以向上转型为Object类,包括数组和接口也就是说, Object 类是引用数据类型的最高参数统一化

接下来我们来了解Object类中两个常用的方法

1. toString()

将任意对象转为字符串输出,打印对象内容。System.out.println()接收任意对象并输出,就是默认调用的 toString方法

运行下面代码:

class Student{
    private String name;
    private int age;
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
}
public class ObjectTest {
    public static void main(String[] args) {
        Student s1 = new Student("张三",17);
        System.out.println(s1);
    }
}

运行结果:

可以看到不是我们预期的结果,为什么呢?我们来看看 toString() 的源码

此时想要输出具体内容,就需要覆写 toString()方法:

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

//输出:Student{name='张三', age=17}

2. equals( )

比较两个对象是否相等,通常比较属性,承接上例,我们创建一个新对象和s1比较:

        Student s1 = new Student("张三",17);
        Student s2 = new Student("张三",17);
        System.out.println(s1.equals(s2));

//输出:false

s1和s2的名字和年龄都是相同的,为什么输出结果为false呢?让我们来看看equals方法的源码

有 new 就有新对象,所以s1和s2显然不是同一地址。此时Student类默认使用的是Object类提供的equals方法,对于Object类而言,它不知道子类有哪些属性 ,所以比较的是对象的地址。

如果我们想要比较属性值就要覆写equals方法:

  public boolean equals(Object obj){
        //当前对象和传入的obj比较
        //1.判断 obj 是否为空
        if (obj == null){
            return false;
        }
        //2.判断obj是否就是自己,就是地址相同
        if (obj == this){
            return true;
        }
        //3.判断obj是否是该类的对象,比如传入一个字符串,它不是Student类型,无法比
        if (!(obj instanceof Object) ){
            return false;
        }
        //4.此时obj一定是Student类的对象,而且两个对象不是同一个地址
        //向下转型还原为Student,比较对象属性
        Student stu = (Student) obj;
        return this.name.equals(stu.name)&& this.age == stu.age;
    }
}

equals方法的覆写非常重要!!!一定要掌握,代码中应用到的 instanceof 和 向下转型的知识链接如下,感兴趣的可以去看看哦

详解Java面向对象编程之多态

包装类

定义及应用

包装类就是将8种数据类型封装为类:


对象包装类(Object雷的直接子类)

Boolean、Character

数值型包装类(Number类的直接子类)

Byte、Short、Integer、Long、Float、Double

以 Integer  类为例应用:

 public static void main(String[] args) {
        //将int -> 类
        Integer data = new Integer(10);
        //value就是将包装类的内容取出来
        int a = data.intValue();
        System.out.println(a);
    }

//输出:10

装箱和拆箱

装箱:将基本类型变为包装类对象

拆箱:将包装类对象中的数值还原为基本类型

在上述示例中:

在我们实际操作时,反复的拆装箱是很麻烦的,在Java中为我们提供了自动装箱、拆箱

代码示例:

    public static void main(String[] args) {
        Integer a = 20;
        int b = a+2;
        System.out.println(b);
    }

//输出:22

可以看到,a是Integer类的对象,但它可以直接和整型数据做运算,实际上,   Integer a = 20;就是自动装箱, int b = a+2;就是自动拆箱过程。所以在用法上,包装类和基本类型没有区别。但是一定要记住,基本数据类型的默认值是0,包装类的默认值为null

那么我们什么时候使用包装类,什么时候使用基本数据类型呢?阿里编码规约做如下规定:

  • 在类中定义成员变量,必须使用包装类声明
  • 在方法中,大量进行算术运算使用基本类型

自己实现包装类

public class IntDemo {
    //保存具体的整型值
    private int data;
    public IntDemo(int data){
        this.data = data;
    }
    public int intValue(){
        return this.data;
    }

    public static void main(String[] args) {
        //将int -> 类
        IntDemo demo = new IntDemo(10);
        int data = demo.intValue();
        System.out.println(data+1);
    }
}

//输出结果:11

通过包装类让Object类接收基本数据类型

我们已经知道Object类可以接收所有引用类型,可遇到基本数据类型就行不通了,包装类就完美解决了这一问题。

使用Object类接收,将上例的主方法做如下修改:

    public static void main(String[] args) {
        //将int -> 类
        IntDemo demo = new IntDemo(10);
        Object obj = demo;
        IntDemo demo1 = (IntDemo) obj;
        int data = demo1.intValue();
        System.out.println(data+1);
    }

//输出:11

包装类的对象比较

统一使用 equals 方法

        Integer a = 10;
        Integer b =10;
        System.out.println(a .equals(b) );

//输出:true

包装类和String的相互转换

① 包装类 --> String :使用String.valueOf()

② String --> 包装类 :使用包装类的parse***()

代码实现:

      public static void main(String[] args) {
        //Integer -> String
       Integer x = new  Integer(200);
        String y = String.valueOf(x);
        System.out.println(y);

        //String-> Integer
        String str ="123";
        Integer a = Integer.parseInt(str);
        System.out.println(a);
      }

//输出结果:
          200
          123

注意String转换时若字符串不是纯数字组成,运行时就是出现类型转换异常。

到此这篇关于Java Object类和包装类深入解读的文章就介绍到这了,更多相关Java Object类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java中Object类常用的12个方法(小结)

    目录 前言 1. getClass 方法 2. hashCode 方法 3. equals 方法 4. clone 方法 5. toString 方法 6. notify 方法 7. notifyAll 方法 8. wait(long timeout) 方法 9. wait(long timeout, int nanos) 方法 10. wait 方法 11. finalize 方法 前言 Java 中的 Object 方法在面试中是一个非常高频的点,毕竟 Object 是所有类的"老祖宗&qu

  • 了解java中对象基础Object类

    目录 一.Object简述 1.显式扩展 2.引用与对象 二.基础方法 1.getClass 2.toString 3.equals与hashCode 4.thread相关 5.clone 6.finalize 三.生命周期 1.作用域 2.垃圾回收机制 四.源代码地址 一.Object简述 源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面. 所以在Java中有一句常说的话,一切皆对象,这话并不离谱. 1.显式扩展

  • java中Object类4种方法详细介绍

    目录 Object(四大方法): hashCode()方法: equals()方法: getClass()方法: toString()方法: 总结 Object(四大方法): 文章干货满满,耐性看完~~何为Object?首先先来看看官方对Object的介绍:在这里附上Java官方的查阅工具:https://docs.oracle.com/en/java/javase/17/docs/api/index.html 由官方介绍可见,object属于Java.lang包内的一个类,而且提供了很多种方法

  • 深入理解JAVA基础类库中对象Object类

    引言 Object类是所有类.数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量.当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类. 例如: public class Dog{ ...... } 等价于: public class Dog extends Object { ...... } Object常用方法 Object 类属于java.lang包,此包下的所有类在使用时无需手动导入,系统会在

  • 你了解Java中的Object类吗

    任何一个类默认继承Object类,就算没有直接继承,最终也会间接继承. Object类,有两种方式找到: 第一种:在源码当中找到 第二种:查阅java类库的帮助文档 Object类中两个重要的方法: boolean equals (Object obj) //判断两个对象是否相等 String toString () //将对象转换成字符串形式 equals方法: 源代码: public boolean equals(Object obj) { return (this == obj); } 作

  • 深入了解Java核心类库--Objects类

    目录 1 Objects 1.1 Objects方法 1.2 Objects常用方法 1.2.1 equals(Object a, Object b) 1.2.2 isNull(Object obj) 1.2.3 nonNull(Object obj) 1.2.4 requireNonNull(T obj) 1.3 Objects源码 2 区别于Object 2.1 Object构造方法 2.2 Object其他方法 2.2.1 equals(Object obj) 2.2.2 toString

  • Java中的Object.getClass()方法解析

    目录 Java Object.getClass()方法 具体见下面的例子 Java Object.getClass()源码分析 1.栈 2.堆 3.老生代 Person类型元数据 反射机制 Java Object.getClass()方法 Object.getClass()方法,这个方法的返回值是Class类型,Class c = obj.getClass(); 通过对象c,我们可以获取该对象的所有成员方法,每个成员方法都是一个Method对象:我们也可以获取该对象的所有成员变量,每个成员变量都

  • java Object的hashCode方法的计算逻辑分析

    目录 1. 背景介绍 2. 调用过程梳理 java的Object代码 jvm的hashCode相关代码 3. 关于hashCode值的大小 4. 验证 5. 总结 1. 背景介绍 在为重写hashCode方法的时候,看到hashCode打印出的数据像是一个地址值,很是好奇. 加之最近在研读jvm源码,特此一探究竟,看看在hotspot中hashCode究竟是如何实现的. 2. 调用过程梳理 java的Object代码 public native int hashCode(); 通过官产jdk的O

  • Java Object类和包装类深入解读

    目录 查看源代码方法 Object类 定义及应用 1. toString() 2. equals( ) 包装类 定义及应用 装箱和拆箱 自己实现包装类 通过包装类让Object类接收基本数据类型 包装类的对象比较 包装类和String的相互转换 查看源代码方法 在IDEA中双击 shift 键,可以搜索相关类名,查看源代码 点击Structure ,左侧用橙色床框住的部分是类的结构,结构包含所有的方法.属性.内部类的声明.结构中带绿色小锁的图标表示 public 权限,钥匙图标就是继承权限(pr

  • Java Object类equals方法

    基本概念: Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入: Object类是所有Java类的祖先.每个类都使用 Object 作为超类.所有对象(包括数组)都实现这个类的方法.可以使用类型为Object的变量指向任意类型的对象 equals()方法:比较两个对象是否同一       如果两个对象具有相同的类型以及相同的属性值,则称这两个对象相等.如果两个引用对象指的是同一个对像,则称这两个变量同一.Object类中定义的equa

  • 深入了解Java Object类的使用

    目录 1.equals方法 ==运算符 equals 2.hashCode 3.toString 4.finalize 1.equals方法 ==运算符 比较运算符,即可以判断基本类型又可以判断引用类型 如果判断基本类型,则判断值是否相等 如果判断引用类型,则判断地址是否相等,即判断是否为同一个对象 equals 是object类的一个方法,只能判断引用类型 object - equals源码: public boolean equals(Object obj) { return (this =

  • Java Object类详解_动力节点Java学院整理

    Java作为一个庞大的知识体系,涉及到的知识点繁多,本文将从Java中最基本的类java.lang.Object开始谈起. Object类是Java中其他所有类的祖先类,没有Object类Java面向对象无从谈起.作为其他所有类的基类,Object具有哪些属性和行为,是Java语言设计背后的思维体现. Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,在编译时会自动导入.Object类没有定义属性,一共有13个方法,具体的类定义结构如下图: 1.类构造

  • Java object类及正则表达式原理解析

    equals方法 equals方法,用于比较两个对象是否相同 /* 描述人这个类,并定义功能根据年龄判断是否是同龄人 由于要根据指定类的属性进行比较,这时只要覆盖Object中的equals方法 在方法体中根据类的属性值进行比较 */ class Person extends Object{ int age ; //复写父类的equals方法,实现自己的比较方式 public boolean equals(Object obj) { //判断当前调用equals方法的对象和传递进来的对象是否是同

  • 深入Java万物之母Object类详情

    目录 前言 一.接口补充知识 二.Object类 1.重点一 2.重点二 3.重点三 4.重点四 总结 前言 在Java中,有一个很神奇的类,所有的类见了它都得恭敬的叫一声“父亲”,因为它就是Java中的万物之父,Object类,它是所有类的默认父类 ,子类不用使用extends关键字继承它,不管是JDK中的类,还是自定义的类 一.接口补充知识 1.接口和接口之间继承的,接口坚决不能继承一个类 2.如果一个类既需要继承一个类,又需要实现多个接口时先使用extends继承一个类,再使用implem

  • 一文带你了解Java中的Object类及类中方法

    目录 1. Object类介绍 2. 重写toString方法打印对象 3. 对象比较equals方法 4. hashCode方法 1. Object类介绍 Object是Java默认提供的一个类.Java里面除了Object类,所有的类都是存在继承关系的.默认会继承Object父 类.即所有类的对象都可以使用Object的引用进行接收. 范例:使用Object接收所有类的对象 class Person{} class Student{} public class Test { public s

  • Java基础之Object类详解

    object类的介绍 object是所有类的直接父类或者是间接父类,为什么这么说呢? 可以查询java8的API帮助文档: 可见在这样的一个类树中,所有的类的根还是Object类 在IDEA中新建一个类,系统会默认继承Object类 public class Pet extends Object{ } 那么Dog继承了Pet类的属性和行为方法,还会继承Object类的属性和行为方法了吗?这一点是肯定的,Pet类作为Object类的子类,Dog类作为Pet类的子类,所以说Object是Dog类的间

  • Java 语言中Object 类和System 类详解

    Object是java所有类的基类,是整个类继承结构的顶端,也是最抽象的一个类.大家天天都在使用toString().equals().hashCode().waite().notify().getClass()等方法,或许都没有意识到是Object的方法,也没有去看Object还有哪些方法以及思考为什么这些方法要放到Object中. 一.Java Object类简介-所有类的超类 Object 是 Java 类库中的一个特殊类,也是所有类的父类.也就是说,J ava 允许把任何类型的对象赋给

随机推荐