• 【Java】Object 类


    目录

    Object 类

    直接继承与间接继承

    示例代码:

    控制输出对象原理

    toString()

    示例代码:

    重写Object父类中的toString()方法

    String字符串原理

    示例代码:

    String类中的equals()

    示例代码:


    Object 类

    Object 是类的层次结构根,每个类都可以将 Object 作为超类,所有类都是直接或间接的继承 Object 类。

    构造方法:public Object()

    问题:回想面向对象中,为什么说子类的构造方法默认访问的是父类的无参构造方法?

    ∵ 它们的顶级父类(Object类中)只有无参构造方法


    Object 类 有哪些方法呢?

    Object类 中有一个无参构造方法

    1. clone()——克隆方法(复制对象)

    2. equals(Object obj)——比较两个对象是否相等

    3. finalize()——jvm的垃圾回收机制(jdk11已过时)

    4. getClass()——获取该对象的class

    5. hashCode()——HashMap集合

    6. toString()——返回对象的字符串表示形式

    7. notify()、notifyAll()、wait()、wait(long timeoutMillis)、wait(long timeoutMillis, int nanos)——这些是 多线程 synchronized 多线程之间的通讯


    直接继承与间接继承

    示例代码

    Parent.java

    1. package com.api.Demo02;
    2. public class Parent {
    3.    // Parent 间接的形式继承了 Object类
    4. }

    Student.java 

    1. package com.api.Demo02;
    2. public class Student extends Parent{
    3.    // Student直接的形式继承了Parent
    4. }

    Test01.java

    1. package com.api.Demo02;
    2. public class Test01 {
    3.    public static void main(String[] args) {
    4.        // 多态机制 通过父类引用 指向 子类对象
    5.        Object student = new Student();
    6.   }
    7. }

    image-20231007205033503


    控制输出对象原理

    toString()

    示例代码:

    Student.java

    1. package com.api.Demo02;
    2. public class Student extends Parent{
    3.    // Student直接的形式继承了Parent
    4.    private String name;
    5.    private int age;
    6.    public String getName() {
    7.        return name;
    8.   }
    9.    public void setName(String name) {
    10.        this.name = name;
    11.   }
    12.    public int getAge() {
    13.        return age;
    14.   }
    15.    public void setAge(int age) {
    16.        this.age = age;
    17.   }
    18. }

    Test02.java

    1. package com.api.Demo02;
    2. public class Test02 {
    3.    public static void main(String[] args) {
    4.        Student stu = new Student();
    5.        stu.setName("mayikt");
    6.        stu.setAge(22);
    7.        System.out.println(stu); //输出该类的完整路径地址(包名+类的名称@...)com.api.Demo02.Student@4554617c
    8.        System.out.println(stu.getClass().getName() + "@" + Integer.toHexString(stu.hashCode()));
    9.        // 上面这行代码是下面的toString()方法里的 return
    10.        /**
    11.         * 底层是如何实现的?
    12.         * ============================================================================
    13.         * public void println(Object x) {
    14.         *         String s = String.valueOf(x);
    15.         *         synchronized (this) {
    16.         *             print(s);
    17.         *             newLine();
    18.         *         }
    19.         *     }
    20.         * ============================================================================
    21.         * public static String valueOf(Object obj) {
    22.         *         return (obj == null) ? "null" : obj.toString();
    23.         *     }
    24.         * ============================================================================
    25.         * public String toString() {
    26.         *         return getClass().getName() + "@" + Integer.toHexString(hashCode());
    27.         *     }
    28.         * ============================================================================
    29.         * 1.String.valueOf(x)
    30.         * String.valueOf 底层是如何实现的呢?
    31.         * 通过三元表达式判断,该对象是否为null,如果是null 则返回一个空字符串 否则 调用obj.toString
    32.         * 2.toString() 底层如何实现?
    33.         * getClass().getName()获取该类的完整路径地址 @ hashCode()值 转换成字符串
    34.         */
    35.   }
    36. }

    重写Object父类中的toString()方法

    在Student类中重写toString()

    Student.java 加上如下代码

    1.    @Override
    2.    public String toString() {
    3.        return "Student{" +
    4.                "name='" + name + '\'' +
    5.                ", age=" + age +
    6.                '}';
    7.   }

    Test02.java

    1. package com.api.Demo02;
    2. public class Test02 {
    3.    public static void main(String[] args) {
    4.        Student stu = new Student();
    5.        stu.setName("mayikt");
    6.        stu.setAge(22);
    7.        System.out.println(stu); //com.api.Demo02.Student@4554617c(未重写toString()之前的)
    8.        System.out.println(stu); //Student{name='mayikt', age=22}(重写toString()之后的)
    9.        System.out.println(stu.getClass().getName() + "@" + Integer.toHexString(stu.hashCode()));
    10.        //com.api.Demo02.Student@4554617c
    11.        System.out.println(stu.toString());//Student{name='mayikt', age=22}
    12.   }
    13. }

    综上:Object 类中的 toString() 目的 就是给我们对象重写的,输出对象中所有程序的属性值


    String字符串原理

    • String 对象用于保存字符串,也就是一组字符序列;

    • 字符串常量对象是用双引号括起来的字符序列;

    • 字符串的字符使用Unicode 字符编码,一个字符(不区分字母还是汉字)占2个字节

    • String 类比较常用的构造器

      • String s1 = new String()

      • String s2 = new String(String original)

      • String s3 = new String(char[] c)

      • String s4 = new String(char[] c, int startIndex, int count)

      • String 实现了Serializable,说明String可以串行化

      • String 实现了 Comparable 接口,说明String 对象可以比较

      • String 是final 不可以被继承,不可以被修改(内存地址不可以修改,内容是可以修改的)底层实际上通过char数组实现


    示例代码:

    Test01.java

    1. package com.api.Demo03;
    2. public class Test01 {
    3.    public static void main(String[] args) {
    4.        // JDK8 String 底层基于 char[] 实现的
    5.        // JDK9 String 底层基于 byte[] 实现的
    6.        String str = "mayikt";
    7.        char c = 'm';
    8.        /**
    9.         * char 只能保存单个字符
    10.         * String保存多个字符——保存字符串
    11.         * String 底层如何实现的呢?保存字符串——底层是基于数组实现
    12.         */
    13.        char[] value = {'m', 'a', 'y', 'i', 'k', 't'};
    14.        System.out.println("这是使用 char[] 封装存放的字符串: " + value); //这样只能输出内存地址
    15.        System.out.print("这是使用 char[] 封装存放的字符串: ");
    16.        System.out.println(value);
    17.   }
    18. }

    Stirng的底层

    image-20231010202222982


    String类中的equals()

    示例代码:

    Test02.java

    1. package com.api.Demo03;
    2. public class Test02 {
    3.    public static void main(String[] args) {
    4.        String str1 = "mayikt1";
    5.        String str2 = "mayikt2";
    6.        boolean result1 = str1.equals(str2);
    7.        System.out.println(result1); //false
    8.        String str3 = "mayikt";
    9.        String str4 = "mayikt";
    10.        boolean result2 = str3.equals(str4);
    11.        System.out.println(result2); //true
    12.        String str5 = null;
    13.        System.out.println(str1.equals(str5));//false
    14. //       System.out.println(str5.equals(str1));//报错,NullPointerException 空指针
    15.        // equals 比较时 左边 如果是为 null, 报错, 空指针
    16.   }
    17. }

    下一篇文章: 三种不同的方式实现用户登录

  • 相关阅读:
    等保三级密码复杂度是多少?多久更换一次?
    2022 极术通讯-2021中国云数据中心考察报告发布,Arm服务器促进多元算力发展
    java计算机毕业设计ssm企业日常事务管理系统sl5xl(附源码、数据库)
    【Vue渲染】 条件渲染 | v-if | v-show | 列表渲染 | v-for
    APP开发_ js 控制手机是否显示状态栏
    开源项目 PM 浅谈如何设计官网
    GBase 8c V3.0.0数据类型——几何操作符
    Spring Security——基于前后端分离项目的使用(安全框架)
    web网页设计期末课程大作业:旅游网页主题网站设计——中国风的温泉酒店预订网(13页)HTML+CSS+JavaScript
    国庆作业1
  • 原文地址:https://blog.csdn.net/qq_57268251/article/details/133755806