• 【第一阶段:java基础】第7章:面向对象编程中级-3(P319-P333):Object类详解、断点调试


    本系列博客是韩顺平老师java基础课的课程笔记,B站:课程链接,吐血推荐的一套全网最细java教程,获益匪浅!

    Object类详解

    equals方法

    • 经典面试题:== 和 equals的对比:
    • ==
      • 既可以判断基本类型,也可以判断引用类型
      • 如果判断基本类型,则判断的是值是否相等
      • 如果判断引用类型,则判断的是地址是否相等,即判断是不是同一个对象
    • equals
      • equals是object类的方法,只能判断引用类型
      • 子类中往往会重写这个方法,用于判断内容是否相等。比如interger.equals就是判断值是否相等 string.equals判断两个字符串是否一样,而不是判断地址了。
      • 如果子类没有重写这个方法,它相当于==,用来判断两个对象是否相等

    hashCode方法

    • 返回该对象的哈希码值,支持此方法是为了提高哈希表的性能(这个在后面的课程会学到)
    • 细节
      • hashCode提高具有哈希结构的容器的效率
      • 两个引用,如果指向的是同一个对象,则哈希值是一样的;如果指向不同的对象,则哈希值不一样
      • 哈希值只要是根据地址来计算的,但是不能将哈希值等价于地址
      • 在后面要介绍的集合中,hashCode如果需要的话,也会重写

    equals方法与hashCode方法的关系

    • equals()相等时,hashCode()不一定相等
      • equals()没有被重写时,说明两个对象的引用相同,则hashCode()相等
      • equals()被子类重写时,说明引用可能不相同(内容相同),则hashCode()不相等
    • hashCode()相等, equals()不一定相等
      • 当哈希冲突时,两个对象的hashCode()相等,但是equals()不相等
      • 当哈希不冲突时,两个对象的hashCode()相等,equals()相等

    toString方法

    • 返回该对象的字符串表示,默认返回全类名(包名+类名)+@+哈希值的十六进制
    • 在需要打印或者拼接对象时,会重写toString方法
    • 当直接输出一个对象时,toString方法会被默认调用

    finalize方法

    • 当对象被回收时,系统自动调用该方法的finalize方法,子类可以重写该方法,做一些释放资源的操作
    • 什么时候被回收? 当某个对象没有任何引用时,jvm就认为这个对象是个垃圾对象,会使用垃圾回收机制来销毁这个对象,在销毁该对象之前,会先调用finalize方法
    • 程序员可以重写该方法的finalize,写一些自己的业务逻辑代码(比如释放资源:断开数据库链接,关闭打开的文件等)
    • 垃圾回收机制的调用,是有系统来决定的(即哟自己的GC算法),也可以通过system,gc()主动出发垃圾回收机制
    • 老韩提示:在实际的开发中,几乎不会运用finalize,更多是为了应付面试官

    断点调试

    • 重要提示:在断点调试的过程中,是运行状态,是以对象的运行类型来执行的。
    • 小技巧
      • 断点可以在debug过程中,动态地下断点
      • 可以在自己的代码,也可以在系统的代码上下断点
    • 快捷键
      • F7: 跳入方法内
      • F8: 逐行执行代码
      • shift F8:跳出方法
      • F9: resume:执行到下一个断点

    本章作业

    第一题

    定义一个person类{name job age},初始化person对象组,有3个person对象,并按照age 从大到小进行排序(冒泡排序)

    public class Main {
        public static void main(String[] args) {
    
            Person person1 = new Person("张三",18,"工人");
            Person person2 = new Person("李四",15,"老板");
            Person person3 = new Person("王五",30,"经理");
            Person[] perosns= {person1,person2,person3};
            //冒泡排序开始 外层比较n-1次
            Person personTemp = null; // 只需要一个空指针就行了
            for (int i = 0; i < perosns.length-1; i++) {
                //注意是从大到小排序
                for (int j = 0; j <perosns.length-1-i ; j++) { //暂时先这样写着,后面再思考
                    if(perosns[j].getAge()<perosns[j+1].getAge()){
                        //交换 小的数据往后面移动
                        personTemp=perosns[j];
                        perosns[j]=perosns[j+1];
                        perosns[j+1]=personTemp;
                    }
                }
            }
            System.out.println(perosns[0].getAge()+" "+perosns[1].getAge()+" "+perosns[2].getAge());
        }
    }
    
    class Person{
        private String name;
        private int age;
        private String job;
    
        public Person(String name, int age, String job) {
            this.name = name;
            this.age = age;
            this.job = job;
        }
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    
        public String getJob() {
            return job;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    第二题

    写出四种访问修饰符已经他们的权限(公->受-默->私)
    在这里插入图片描述

    第三题

    在这里插入图片描述

    // 感觉这个题其实出的不太好呀
    public class Main {
        public static void main(String[] args) {
            Teacher teacher = new Professor("韩顺平", 18, "教授");
            teacher.introduce();
        }
    }
    
    public class Teacher {
        private String name;
        private int age;
        private String post;
    
        public Teacher(String name, int age, String post) {
            this.name = name;
            this.age = age;
            this.post = post;
        }
         void introduce(){
            System.out.println("名字:"+name+" 年龄:"+age+" 职称:"+post);
        }
    }
    
    public class Professor extends Teacher {
        private double salary=1.3;
    
        public Professor(String name, int age, String post) {
            super(name, age, post);
        }
    
        public void introduce(){
            super.introduce();
            System.out.print(" 薪资"+this.salary);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    第四题

    在这里插入图片描述

    第五题

    在这里插入图片描述

    第六题

    在这里插入图片描述

    第七题

    在这里插入图片描述

  • 相关阅读:
    力扣刷题-数组-螺旋矩阵
    [二进制学习笔记]Ubuntu20.04关闭开启ASLR
    Vue3 学习-组件通讯(二)
    shell脚本中export命令未生效,原因详解
    基于SqlSugar的开发框架循序渐进介绍(8)-- 在基类函数封装实现用户操作日志记录
    C语言——三子棋游戏
    一些自己收集的秒杀设计的重要知识点
    Java内存模型介绍
    基于51单片机的智能红外遥控防雨晾衣架 雨滴光强检测系统proteus仿真原理图PCB
    【JavaScript】DOM查询(子节点、父节点、兄弟节点)源码详解
  • 原文地址:https://blog.csdn.net/qq_39328436/article/details/127760211