热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java常用类(一):根父类——Object

一、Object类的概述java.lang.Object类是Java语言中的根类,即所有类的父类,所有的类都直接或间接的继承Object类。在对象实例化的时候,最终的父类就是Obj

一、Object 类的概述

  java.lang.Object 类是 Java 语言中的根类,即所有类的父类,所有的类都直接或间接的继承 Object 类。

  在对象实例化的时候,最终的父类就是 Object。

  如果在类的声明中未使用extends关键字指明其父类, 则默认父类为java.lang.Object类

  Demo:

1 public class MyClass{
2 // ...
3 }
4
5 等价于
6 public class MyClass extends Object{
7 ...
8 }

 

 

  

  Object类中方法:

  

 

 

 


二、Object方法

  1、构造方法

public Object()

  2、registerNatives 方法

private static native void registerNatives(); //私有的本地方法
static {
  registerNatives();
}

  3、getClass 方法

public final native Class getClass();

        该方法是为了获取此 Object 的运行类。(反射时详细学习)


  4、hashCode 方法

public native int hashCode();

      该方法是为了获取该的 hashCode(哈希) 值;


  5、equals 方法

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

    该方法是用于确认两个对象是否“相同”。


  6、clone 方法

protected native Object clone() throws CloneNotSupportedException;

    创建并返回此对象的一个副本。


  7、toString 方法

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

    该方法用于打印此对象的“全类名@此对象在内存中地址值(十六进制)”;


  8、notify、notifyAll、wait、等方法与线程相关

public final native void notify();  //唤醒在此对象监视器上等待的单个线程。
public final native void notifyAll();  //唤醒在此对象监视器上等待的所有线程。

 //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或 者超过指定的时间量前,导致当前线程等待。
public final native void wait(long timeout) throws InterruptedException;
//用于让当前线程失去操作权限,当前线程进入等待序列
public final void wait() throws InterruptedException {
wait(0);
}
 //在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout <0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos <0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}

  9、finalize

protected void finalize() throws Throwable { }

     当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。


三、方法详解

  1、registerNatives 方法

      native 关键字与 registerNatives 方法


  2、== 操作符与 equals 方法 (常见面试题)


  3、toString() 方法

    (1)toString()方法在Object类中定义, 其返回值是String类型, 返回类名和它的引用地址;

    (2)在进行String与其它类型数据的连接操作时, 自动调用toString()方法;

Date now=new Date();
System.out.println(“now=”+now); 相当于
System.out.println(“now=”+now.toString());

  

    (3)可以根据需要在用户自定义类型中重写toString()方法如String 类重写了toString()方法, 返回字符串的值;

s1=“hello”;
System.out.println(s1);//相当于System.out.println(s1.toString());

  

    (4)基本类型数据转换为String类型时, 调用了对应包装类的toString()方法:

int a=10; System.out.println(“a=”+a);

    面试题:

1 public void test() {
2 char[] arr = new char[] { 'a', 'b', 'c' };
3 System.out.println(arr);// abc
4 int[] arr1 = new int[] { 1, 2, 3 };
5 System.out.println(arr1);// [I@15db9742
6 double[] arr2 = new double[] { 1.1, 2.2, 3.3 };
7 System.out.println(arr2);// [D@6d06d69c
8 }

 

    解析:下面的两个 println(Object x) 方法的形参是 Object,方法体内就是打印地址值;而当参数是  char 数组时,就调用对应的 println(char x[]) 方法,对该数组进行遍历输出。

      

 

 

 


  4、clone() 方法

      clone:对象的克隆(拷贝)


  5、finalize() 方法

    当垃圾回收器确定不再有对该对象的引用时,由垃圾回收器在对象上调用该方法。该方法只会被调用一次。

    Demo:

1 public class FinalizeTest {
2 public static void main(String[] args) {
3 Person p = new Person("Peter", 12);
4 System.out.println(p);
5 p = null;//此时对象实体就是垃圾对象,等待被回收。但时间不确定。
6 System.gc();//强制性释放空间
7 }
8 }
9
10 class Person{
11 private String name;
12 private int age;
13
14 public Person(String name, int age) {
15 super();
16 this.name = name;
17 this.age = age;
18 }
19 public String getName() {
20 return name;
21 }
22 public void setName(String name) {
23 this.name = name;
24 }
25 public int getAge() {
26 return age;
27 }
28 public void setAge(int age) {
29 this.age = age;
30 }
31 //子类重写此方法,可在释放对象前进行某些操作
32 @Override
33 protected void finalize() throws Throwable {
34 System.out.println("对象被释放--->" + this);
35 }
36 @Override
37 public String toString() {
38 return "Person [name=" + name + ", age=" + age + "]";
39 }
40 }

 

    补充:垃圾回收机制关键点


垃圾回收机制只回收JVM堆内存里的对象空间。

对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力

现在的JVM有多种垃圾回收实现算法,表现各异。

垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。

可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。

程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。

垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。

永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。


 


四、Objects 方法

    上面重写 equals 方法中,使用了 java.util.objects 类,下面对这个类进行了解。

     在 JDK7 添加了一个 Objects 工具类,它提供了一些方法来操作对象,它由一些静态的使用方法组成,这些方法是 null-save(空指针安全的) 或 null-tolerant(容忍空指针的),用于计算对象的 hashcode、返回对象的字符串表示形式、比较两个对象。

  在比较两个对象的时候,Object 的 equals 方法容易抛出空指针异常,而 Object 类中的 equals 方法优化了这个问题。

  方法如下

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

   源码

public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}

  有兴趣的可以仔细研读一下源码。


五、
六、

推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 多维数组的使用
    本文介绍了多维数组的概念和使用方法,以及二维数组的特点和操作方式。同时还介绍了如何获取数组的长度。 ... [详细]
  • 深入理解Kafka服务端请求队列中请求的处理
    本文深入分析了Kafka服务端请求队列中请求的处理过程,详细介绍了请求的封装和放入请求队列的过程,以及处理请求的线程池的创建和容量设置。通过场景分析、图示说明和源码分析,帮助读者更好地理解Kafka服务端的工作原理。 ... [详细]
author-avatar
mobiledu2502936967
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有