广告
返回顶部
首页 > 资讯 > 后端开发 > Python >了解java中对象基础Object类
  • 844
分享到

了解java中对象基础Object类

2024-04-02 19:04:59 844人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录一、Object简述1、显式扩展2、引用与对象二、基础方法1、getClass2、toString3、equals与hashCode4、thread相关5、clone6、fina

一、Object简述

源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面。

所以在Java中有一句常说的话,一切皆对象,这话并不离谱。

1、显式扩展

结论验证

既然Object作为所有类的父级别的类,则不需要在显式的添加继承关系,Each01编译期就会提示移除冗余。


public class Each01 extends Object {
    public static void main(String[] args) {
        System.out.println(new Each01().hashCode()+";"+new ObjEa02().hashCode());
    }
}
class ObjEa02 {}
class ObjEa03 extends ObjEa02{}

这里Each01与ObjEa02对象实例都有Object类中的hashCode方法,这里对既有结论的验证。

编译文件

再从JVM编译层面看下字节码文件,是如何加载,使用javap -c命令查看编译后的文件,注意jdk版本1.8;


javap -c Each01.class
Compiled from "Each01.java"
public class com.base.object.each.Each01 {
  public com.base.object.each.Each01();
    Code:
       0: aload_0
       1: invokespecial #1 // Method java/lang/Object."<init>":()V
       4: return
}

javap -c ObjEa02.class 
Compiled from "Each01.java"
class com.base.object.each.ObjEa02 {
  com.base.object.each.ObjEa02();
    Code:
       0: aload_0
       1: invokespecial #1 // Method java/lang/Object."<init>":()V
       4: return
}

javap -c ObjEa03.class 
Compiled from "Each01.java"
class com.base.object.each.ObjEa03 extends com.base.object.each.ObjEa02 {
  com.base.object.each.ObjEa03();
    Code:
       0: aload_0
       1: invokespecial #1 // Method com/base/object/each/ObjEa02."<init>":()V
       4: return
}

invokespecial命令:可以查看Jvm的官方文档中的指令说明,调用实例化方法,和父类的初始化方法调用等,这里通过三个类的层级关系,再次说明Object超类不需要显式继承,即使显式声明但编译后源码依旧会清除冗余。

2、引用与对象

通常把下面过程称为:创建一个object对象;


Object object = new Object() ;

细节描述:声明对象引用object;通过new关键字创建对象并基于默认构造方法初始化;将对象引用object指向创建的对象。

这一点可以基于Jvm运行流程去理解,所以当对象一旦失去全部引用时,会被标记为垃圾对象,在垃圾收集器运行时清理。

接受任意数据类型对象的引用

既然Object作为Java中所有对象的超类,则根据继承关系的特点,以及向上转型机制,Object可以接受任意数据类型对象的引用,例如在集合容器或者传参过程,不确定对象类型时可以使用Object:


public class Each02 {
    public static void main(String[] args) {
        // 向上转型
        Object obj01 = new Each02Obj01("java") ;
        System.out.println(obj01);
        // 向下转型
        Each02Obj01 each02Obj01 = (Each02Obj01)obj01;
        System.out.println("name="+each02Obj01.getName());
    }
}
class Each02Obj01 {
    private String name ;
    public Each02Obj01(String name) { this.name = name; }
    @Override
    public String toString() {
        return "Each02Obj01{" +"name='" + name +'}';
    }
    public String getName() { return name; }
}

这里要强调一下这个向上转型的过程:

Object obj01 = new Each02Obj01("java") ;
通过上面流程分析,这里创建一个父类引用obj01,并指向子类Each02Obj01对象,所以在输出的时候,调用的是子类的toString方法。

二、基础方法

1、getClass

在程序运行时获取对象的实例类,进而可以获取详细的结构信息并进行操作:


public final native Class<?> getClass();

该方法在泛型,反射,动态代理等机制中有很多场景应用。

2、toString

返回对象的字符串描述形式,Object提供的是类名与无符号十六进制的哈希值组合表示,为了能返回一个信息明确的字符串,子类通常会覆盖该方法:


public String toString() {
    return getClass().getName()+"@"+Integer.toHexString(hashCode());
}

在Java中,打印对象的时候,会执行String.valueOf转换为字符串,该方法的底层依旧是对象的toString方法:


public void println(Object x) {
    String s = String.valueOf(x);
}
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

3、equals与hashCode

  • equals:判断两个对象是否相等;
  • hashCode:返回对象的哈希码值;

public native int hashCode();
public boolean equals(Object obj) {
    return (this == obj);
}

equals判断方法需要考量实际的场景与策略,例如常见的公民注册后分配的身份ID是不能修改的,但是名字可以修改,那么就可能存在这样的场景:


EachUser eachUser01 = new EachUser(1,"A") ;
EachUser eachUser02 = new EachUser(1,"B") ;
class EachUser {
    private Integer cardId ;
    private String name ;
}

从程序本身看,这确实是创建两个对象,但是放在场景下,这的确是描述同一个人,所以这时候可以在equals方法中定义比较规则,如果ID相同则视为同一个对象:


@Override
public boolean equals(Object obj) {
    if (obj != null){
        EachUser compareObj = (EachUser)obj ;
        return this.cardId.intValue()==compareObj.cardId ;
    }
    return Boolean.FALSE ;
}

这里还要注意值类型和引用类型的区别,如果出现null比较情况,要返回false。

通常在子类中会同时覆盖这两个方法,这样做法在集合容器的设计上已经体现的淋漓尽致。

4、thread相关

  • wait:线程进入waiting等待状态,不会争抢对象
  • notify:随机通知一个在该对象上等待的线程;
  • notifyAll:唤醒在该对象上所有等待的线程;

public final native void wait(long timeout) throws InterruptedException;
public final native void notify();
public final native void notifyAll();

注意这里:native关键字修饰的方法,即调用的是原生函数,也就是常说的基于C/C++实现的本地方法,以此提高和系统层面的交互效率降低交互复杂程度。

5、clone

返回当前对象的拷贝:


protected native Object clone() throws CloneNotSupportedException;

关于该方法的细节规则极度复杂,要注意下面几个核心点:

对象必须实现Cloneable接口才可以被克隆;
数据类型:值类型,String类型,引用类型;
深浅拷贝的区别和与之对应的实现流程;
在复杂的包装类型中,组合的不同变量类型;

6、finalize

当垃圾收集器确认该对象上没有引用时,会调用finalize方法,即清理内存释放资源:


protected void finalize() throws Throwable { }

通常子类不会覆盖该方法,除非在子类中有一些其他必要的资源清理动作。

三、生命周期

1、作用域

在下面main方法执行结束之后,无法再访问Each05Obj01的实例对象,因为对象的引用each05丢失:


public class Each05 {
    public static void main(String[] args) {
        Each05Obj01 each05 = new Each05Obj01 (99) ;
        System.out.println(each05);
    }
}

这里就会存在一个问题,引用丢失导致对象无法访问,但是对象在此时可能还是存在的,并没有释放内存的占用。

2、垃圾回收机制

Java通过new创建的对象会在堆中开辟内存空间存储,当对象失去所有引用时会被标记为垃圾对象,进而被回收;

这里涉及下面几个关键点:

  • Jvm中垃圾收集器会监控创建的对象 ;
  • 当判断对象不存在引用时,会执行清理动作;
  • 完成对象清理后会重新整理内存空间;

这里存在一个很难理解的概念,即对象不存在引用的判断,也就是常说的可达性分析算法:基于对象到根对象的引用链是否可达来判断对象是否可以被回收;GC-Roots根引用集合,也可以变相理解为存活对象的集合。(详见JVM系列)

通过Object对象的分析,结合Java方方面面的机制和设计,可以去意会一些所谓的编程思想。

四、源代码地址

gitEE·地址
https://gitee.com/cicadasmile/java-base-parent
Wiki·地址
Https://gitee.com/cicadasmile/butte-java-note/wikis

到此这篇关于了解java中对象基础Object类的文章就介绍到这了,更多相关java object类内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 了解java中对象基础Object类

本文链接: https://www.lsjlt.com/news/134185.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 了解java中对象基础Object类
    目录一、Object简述1、显式扩展2、引用与对象二、基础方法1、getClass2、toString3、equals与hashCode4、thread相关5、clone6、fina...
    99+
    2022-11-12
  • 深入理解JAVA基础类库中对象Object类
    引言 Object类是所有类、数组的父类,位于java.lang 包下也就是说,Java允许把所有任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字...
    99+
    2022-11-12
  • Java基础之Object类详解
    object类的介绍 object是所有类的直接父类或者是间接父类,为什么这么说呢? 可以查询java8的API帮助文档: 可见在这样的一个类树中,所有的类的根还是Object类 ...
    99+
    2022-11-12
  • Java基础——类和对象
    目录 一、类和对象的基本概念 二、类与对象的定义与使用 1.创建类的语法: 2. 创建具体的对象:  3.范例(创建一个Person 类的对象)  三、static关键字   (一)static修饰属性(类属性、类变量) (二)static...
    99+
    2023-10-05
    java
  • Java类与对象超基础讲解
    目录什么是面向对象面向过程与面向对象类与对象的使用类与对象的使用与说明对象的初始化this的使用构造方法this可以调用本类的构造方法什么是面向对象 Java语言是一个纯面向对象的语...
    99+
    2022-11-13
  • 新手了解java 类,对象以及封装基础知识
    目录1、类2、对象3.方法的重载 什么是方法的重载4、构造器 什么是构造方法构造方法语法:构造方法特点5.this this指代当前对象,即哪个对象调用就指代哪个对象6.封装封装的作...
    99+
    2022-11-12
  • 【Java 基础篇】Java反射:深入了解Class对象
    Java是一门强类型语言,它要求在编译时知道所有的类和对象类型。然而,有时候我们需要在运行时动态地获取和操作类的信息,这就是Java反射的用武之地。本文将深入探讨Java反射,特别是与Class对象...
    99+
    2023-10-27
    java python 开发语言 ajax 网络 eclipse git 原力计划
  • C++类和对象基础详解
    目录一、类和对象的基本概念结构化程序设计面向对象的程序设计使用类的成员变量和成员函数二、类和对象基础 类成员的可访问范围构造函数(constructor)基本概念拷贝(复制)构造函数...
    99+
    2022-11-12
  • Java抽象类(基础详解)
    目录 1.概念 2.抽象类的使用 2.1抽象方法 2.2抽象类 2.3抽象类的使用 2.4注意事项 1.概念 普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法,普通方法,static方法,常量和变量等内容...
    99+
    2023-10-21
    java 开发语言
  • 【Java 基础】类和对象 & 方法重载详解
    《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 ...
    99+
    2023-10-10
    java 开发语言 后端
  • Java面向对象基础详解
    目录一、前言什么是对象?什么是类?类和对象的关系?类的定义 ?怎么创建对象?格式:创建对象的作用?Phone类下: PhoneDemo下:二、封装封装的好处?Student...
    99+
    2022-11-12
  • 【Java 基础】类和对象 & 方法重载详解
    《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 订阅专栏后添加我微信或者进交流群,...
    99+
    2023-08-21
    java 开发语言 后端
  • 你了解Java中的Object类吗
    任何一个类默认继承Object类,就算没有直接继承,最终也会间接继承。 Object类,有两种方式找到: 第一种:在源码当中找到 第二种:查阅java类库的帮助文档...
    99+
    2022-11-12
  • python基础之定义类和对象详解
    定义简单的类 面向对象是更大的封装,在一个类中封装多个方法,这样通过这个类创建出来的对象,就可以直接调用这些方法了! 定义只包含方法的类 在python中,要定义一个只包含方法的类,...
    99+
    2022-11-13
  • 零基础学Java之什么是对象和类
    这篇文章主要讲解了“零基础学Java之什么是对象和类”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“零基础学Java之什么是对象和类”吧!01、面向过程和面向对象三妹是不是要问,什么是 OOP...
    99+
    2023-06-15
  • Java 基础语法让你弄懂类和对象
    目录Java 基础语法一、类与对象的初步认知二、类和类的实例化三、类的成员1. 字段/属性/成员变量2. 方法3. static 关键字四、封装1. private 实现封装2. g...
    99+
    2022-11-12
  • Java面向对象基础知识之抽象类和接口
    抽象类(abstract): 抽象类不能创建实例,它只能作为父类被继承。抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象。从多个具有相同特征的类中抽象出一个抽象类,以这个抽...
    99+
    2022-11-12
  • 一文带你了解Java万物之基之Object类
    目录native方法getClass方法hashCode方法equals方法==和equals的区别clone方法浅拷贝和深拷贝toString方法线程方法finalize方法Jav...
    99+
    2022-11-13
  • Java中的类(基础详解)
    文章目录 可以有多个类,但只能有一个public类类 = 字段+方法类的构造函数我们没写构造函数的时候如果我们自己写了构造函数构造函数中 this 的使用 类的修饰符 / 控制符第一...
    99+
    2023-09-01
    java jvm c++
  • 带你了解Java的类和对象
    目录五丶封装(1)包的概念与创建1>概念2>创建(2)包的使用–导入包(3)封装定义–权限控制访问(4)补充些常用的包(小拓展)六丶关于static成员(1)修饰成员变量...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作