【韩顺平Java笔记】第8章:面向对象编程(中级部分)【314-326】

news2024/11/26 14:56:31

314. 动态绑定机制


【注】属性没有动态绑定机制


虽然B类sum被注释掉了,但是其父类A类的sum方法没被注释掉,所以调用的是A类的sum方法,A类的sum方法中有个getI()方法,根据动态绑定机制,现在这个a引用的运行类型是B类,子类B里恰好也有getI()方法,所以调用getI()的时候先从子类B找,发现子类B有getI()方法,就调用子类B的getI()方法,子类B的getI()对应的返回的是B类的属性i,属性没有动态绑定机制,所以getI()返回20.

315. 多态数组

数组的定义类型为父类类型,里面保存的实际元素类型为子类类型
应用实例:现有一个继承结构如下:要求创建 1 个 Person 对象、2 个 Student 对象和 2 个 Teacher 对象, 统一放在数组
中,并调用每个对象
say 方法. 应用实例升级:如何调用子类特有的方法,比如
Teacher 有一个 teach , Student 有一个 study
怎么调用?

Person.java

package com.Marisa.ployarr_;

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String say(){
        return "name:" + name + "\t" + "age:" + age + "\t";
    }
}

Student.java

package com.Marisa.ployarr_;

public class Student extends Person{
    private double score;

    public Student(String name, int age, double score) {
        super(name, age);
        this.score = score;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    //重写父类say方法

    @Override
    public String say() {
        return "学生:\t" + super.say() + "socre:" + score + "\t";
    }
}


Teacher.java

package com.Marisa.ployarr_;

public class Teacher extends Person{
    private double salary;

    public Teacher(String name, int age, double salary) {
        super(name, age);
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    //重写父类say方法

    @Override
    public String say() {
        return "老师:\t" + super.say() + "salary" + salary + "\t";
    }
}

PoloArray.java

package com.Marisa.ployarr_;

public class PoloArray {
    public static void main(String[] args) {
        Person[] persons = new Person[5];
        persons[0] = new Person("田所浩二", 24);
        persons[1] = new Student("德川", 26, 114514);
        persons[2] = new Student("我修院", 26, 114514);
        persons[3] = new Teacher("王爷", 114514, 114514);
        persons[4] = new Teacher("淳平", 114514, 114514);
        //循环遍历多态数组,调用say
        for (int i = 0; i < persons.length; i++) {
            //persons[i] 编译类型是Person,运行类型是根据实际情况有JVM判断
            System.out.println(persons[i].say());//动态绑定机制
        }

    }
}

运行结果:
name:田所浩二 age:24
学生: name:德川 age:26 socre:114514.0
学生: name:我修院 age:26 socre:114514.0
老师: name:王爷 age:114514 salary114514.0
老师: name:淳平 age:114514 salary114514.0

316. 多态数组2

为Student类和Teacher类加入特有方法
Student.java

package com.Marisa.ployarr_;

public class Student extends Person{
    private double score;

    public Student(String name, int age, double score) {
        super(name, age);
        this.score = score;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }

    //重写父类say方法

    @Override
    public String say() {
        return "学生:\t" + super.say() + "socre:" + score + "\t";
    }

    public void study(){
        System.out.println("学生" + getName() + "正在嗯嘛啊");
    }
}


Teacher.java

package com.Marisa.ployarr_;

public class Teacher extends Person{
    private double salary;

    public Teacher(String name, int age, double salary) {
        super(name, age);
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    //重写父类say方法

    @Override
    public String say() {
        return "老师:\t" + super.say() + "salary" + salary + "\t";
    }
    //特有的方法
    public void teach(){
        System.out.println("老师" + getName() + "正在授课");
    }
}

PoloArray.java

package com.Marisa.ployarr_;

public class PoloArray {
    public static void main(String[] args) {
        Person[] persons = new Person[5];
        persons[0] = new Person("田所浩二", 24);
        persons[1] = new Student("德川", 26, 114514);
        persons[2] = new Student("我修院", 26, 114514);
        persons[3] = new Teacher("王爷", 114514, 114514);
        persons[4] = new Teacher("淳平", 114514, 114514);
        //循环遍历多态数组,调用say
        for (int i = 0; i < persons.length; i++) {
            //persons[i] 编译类型是Person,运行类型是根据实际情况有JVM判断
            System.out.println(persons[i].say());//动态绑定机制
            //调用特有方法
            //判断运行类型是不是Student
            if(persons[i] instanceof Student){
                ((Student)persons[i]).study();//向下转型
            }
            //判断是Teacher
            else if(persons[i] instanceof Teacher){
                ((Teacher)persons[i]).teach();
            }
        }

    }
}

运行结果:
name:田所浩二 age:24
学生: name:德川 age:26 socre:114514.0
学生德川正在嗯嘛啊
学生: name:我修院 age:26 socre:114514.0
学生我修院正在嗯嘛啊
老师: name:王爷 age:114514 salary114514.0
老师王爷正在授课
老师: name:淳平 age:114514 salary114514.0
老师淳平正在授课

317. 多态参数


Employee.java

package com.Marisa.polyparameter_;

public class Employee {
    private String name;
    private double salary;

    public Employee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    //得到年工资
    public double getAnnual(){
        return 12 * salary;
    }
}

Manager.java

package com.Marisa.polyparameter_;

public class Manager extends Employee{
    private double bonus;

    public Manager(String name, double salary, double bonus) {
        super(name, salary);
        this.bonus = bonus;
    }

    public double getBonus() {
        return bonus;
    }

    public void setBonus(double bonus) {
        this.bonus = bonus;
    }

    //管理
    public void manage(){
        System.out.println("经理" + getName() + "正在管理");
    }
    //重写获取年薪方法
    //加奖金金金金金金
    @Override
    public double getAnnual() {
        return super.getAnnual() + bonus;
    }
}

Worker.java

package com.Marisa.polyparameter_;

public class Worker extends Employee{
    public Worker(String name, double salary) {
        super(name, salary);
    }

    public void work(){
        System.out.println("普通员工" + getName() + "正在工作");
    }

    //普通员工没用其他收入,则直接调用父类
    @Override
    public double getAnnual() {
        return super.getAnnual();
    }
}

Test.java

package com.Marisa.polyparameter_;

public class Test {
    public static void main(String[] args){
        Worker w1 = new Worker("我修院", 114514);
        Manager m1 = new Manager("淳平", 114514, 1919);
        Test test = new Test();
        test.showmpAnnual(w1);
        test.showmpAnnual(m1);
        test.testWork(w1);
        test.testWork(m1);
    }
    public void showmpAnnual(Employee e){
        System.out.println(e.getAnnual());//动态绑定机制
    }
    //添加testWork方法,如果普通员工,调用work方法
    //如果是经理,调用manage方法
    public void testWork(Employee e){
        if(e instanceof Worker){
            ((Worker)e).work();//向下转型操作
        }else if(e instanceof  Manager){
            ((Manager)e).manage();
        }else{
            System.out.println("不做处理……");
        }
    }
}

运行结果:
1374168.0
1376087.0
普通员工我修院正在工作
经理淳平正在管理

318. ==运算符

package com.Marisa.object_;

public class Equals01 {
    public static void main(String[] args) {
        A a = new A();
        A b = a;
        A c = b;
        //==判断两个引用是否指向同一个对象
        System.out.println(a == c);
        System.out.println(a == b);
        B bobj = a;
        System.out.println(bobj == c);
    }
}
class B{

}
class A extends B{

}


运行结果
true
true
true

319. 查看JDK源码


查看方法看视频

320. 子类重写equals

String重写的equals


Object类的equals方法

Integer类的euqals方法


==只判断对象的地址是否相等

equals经过重写后判断的是值是否相等

321. equals课堂练习1

应用实例: 判断两个 Person 对象的内容是否相等,如果两个 Person 对象的各个属性值都一样,则返回 true,反之 false。

Person.java

package com.Marisa.equals_;

public class Person {
    private String name;
    private int age;
    private char gender;

    public Person(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    //重写equals方法

    @Override
    public boolean equals(Object obj) {
        //如果两个是同一个引用(指向同一个地址,直接返回true)
        if(this == obj){
            return true;
        }
        //如果不是Person对象,返回false
        if(!(obj instanceof Person)){
            return false;
        }else{
            //是Person对象,判断值是否都相等
            Person temp = (Person)obj;//先将运行类型转换为Person
            return this.name.equals(temp.name) &&
                    this.age == temp.age &&
                    this.gender == temp.gender;
        }
    }
}

EqualsTest.java

package com.Marisa.equals_;

public class EqualsTest {
    public static void main(String[] args) {
        Person person1 = new Person("田所浩二", 24, '男');
        Person person2 = new Person("田所浩二", 24, '男');
        Person person3 = new Person("德川", 26, '男');
        System.out.println(person1.equals(person2));
        System.out.println(person1.equals(person3));
        System.out.println(person1.equals(person1));
        System.out.println(person1.equals(new String("123")));
    }
}

运行结果:
true
false
true
false

322. equals课堂练习2


输出:
false
true
false//没重写equals方法,对比的是地址
true
false

323. equals课堂练习3


输出:
true//表达式先转换到精度最大的类型即float,然后都是65.0,返回true(只有char、byte和short类型之间不能直接自动转换)
true//char转到精度更高的int,大写字母A的ASCII码是65
true//同上
false//不同的引用,地址不同
true//字符串内容相同
//不输出,类型不相同,编译器报错

324. hashCode

  1. 提高具有哈希结构的容器的效率!

  2. 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!

  3. 两个引用,如果指向的是不同对象,则哈希值一般(有可能在很大的范围内有碰撞)是不一样的

  4. 哈希值主要根据地址号来的!, 不能完全将哈希值等价于地址。

  5. 案例演示[HashCode_.java]: obj.hashCode() [测试:A obj1 = new A(); A obj2 = new A(); A obj3 = obj1]

  6. 后面在集合,中 hashCode 如果需要的话,也会重写, 在讲解集合时,老韩在说如何重写 hashCode()代码

325. toString

  1. 基本介绍
    默认返回:全类名+@+哈希值的十六进制,【查看 Object 的 toString 方法】
    子类往往重写 toString 方法,用于返回对象的属性信息
  2. 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式.
    案例演示:Monster [name, job, sal] 案例: ToString_.java
  3. 当直接输出一个对象时,toString 方法会被默认的调用, 比如 System.out.println(monster); 就会默认调用
    monster.toString()

326. finalize

  1. 当对象被回收时,系统自动调用该对象的 finalize 方法。子类可以重写该方法,做一些释放资源的操作【演示】
  2. 什么时候被回收:当某个对象没有任何引用时,则 jvm 就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来
    销毁该对象,在销毁该对象前,会先调用 finalize 方法。
  3. 垃圾回收机制的调用,是由系统来决定(即有自己的 GC 算法), 也可以通过 System.gc() 主动触发垃圾回收机制,测
    试:Car [name]
    老韩提示: 我们在实际开发中,几乎不会运用 finalize , 所以更多就是为了应付面试.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2204875.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CTF Web】Pikachu getimagesize() Writeup(文件上传+PHP+文件包含漏洞+JPEG图片马+getimagesize绕过)

不安全的文件上传漏洞概述 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判断 比如是否是指定的类型、后缀名、大小等等&#xff0c;然后将其按照设计的格式进行重…

mongodb 数据迁移,亲测成功!

mysql进行数据迁移&#xff0c;最简单的不过是导出sql&#xff0c;然后在运行sql&#xff0c;数据也自然迁移过去了。 可是mongodb里&#xff0c;我们存储的是文件&#xff0c;是怎么做到的呢&#xff0c;当我在翻阅网上博客的时候&#xff0c;并没有发现有这方面的顾虑。 当…

制造业DT数字化之生产制造业务建模

一、工厂建模为何物&#xff1f; 对制造业人员&#xff08;人&#xff09;、设备&#xff08;机&#xff09;、材料&#xff08;料&#xff09;、工艺流程&#xff08;法&#xff09;、工厂环境&#xff08;环&#xff09;数据化管理的过程就叫工厂建模。 二、制造建模有哪几大…

Math.js 进阶使用:数值比较和数学运算

一. 引言 上篇文章中&#xff0c;我们了解了 Math 工具函数在数值操作方面的妙用&#xff0c;主要包括&#xff1a;取绝对值、向上向下取整以及四舍五入的方法&#xff0c;详细了解请参考上一篇文章&#xff1a; Math 工具函数的妙用&#xff1a;常用的数值操作 本篇文章将继…

【Linux系统编程】第三十弹---软硬链接与动静态库的深入探索

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、软硬链接 1.1、见一见 1.2、特征 1.3、什么是软硬链接&#xff1f;有什么用(为什么)&#xff1f; 2、动态库和静态库 2.…

从 Vim 到 VSCode:提升远程开发效率的秘密武器

1.前言 在 Linux 服务器上进行开发时&#xff0c;我们常常会选择使用 vi 或 vim 这些轻量级的编辑器。虽然它们可以满足基本的编辑需求&#xff0c;但在处理大型项目时&#xff0c;局限性很明显&#xff1a;缺乏现代编辑器的高级功能&#xff0c;比如语法高亮、代码补全以及便…

windows 调整虚拟内存文件大小,释放C盘

Windows 虚拟内存文件&#xff08;通常是 pagefile.sys&#xff09;的作用是充当物理内存&#xff08;RAM&#xff09;的扩展&#xff0c;当系统内存不足时&#xff0c;它为系统提供一个额外的、基于硬盘的存储空间。这种虚拟内存的机制帮助系统在物理内存耗尽时仍能继续运行程…

数据结构 ——— 单链表oj题:相交链表(链表的共节点)

目录 题目要求 手搓两个相交简易链表 代码实现 题目要求 两个单链表的头节点 headA 和 headB &#xff0c;请找出并返回两个单链表相交的起始节点&#xff0c;如果两个链表不存在相交节点&#xff0c;则返回 NULL 手搓两个相交简易链表 代码演示&#xff1a; struct Lis…

SpringSecurity(一)——认证实现

一、初步理解 SpringSecurity的原理其实就是一个过滤器链&#xff0c;内部包含了提供各种功能的过滤器。 当前系统中SpringSecurity过滤器链中有哪些过滤器及它们的顺序。 核心过滤器&#xff1a; &#xff08;认证&#xff09;UsernamePasswordAuthenticationFilter:负责处理…

LabVIEW提高开发效率技巧----状态保存与恢复

在LabVIEW开发中&#xff0c;保存和恢复程序运行时的状态是一个关键技巧&#xff0c;特别是在涉及需要暂停或恢复操作的应用中。通过使用 Flatten To String 和 Unflatten From String 函数&#xff0c;开发人员可以将程序当前的状态转换为字符串并保存&#xff0c;再在需要时恢…

Vue入门-指令修饰符-事件修饰符

事件修饰符 事件名.stop ->阻止冒泡 demo&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><ti…

【Redis】Set类型常用命令

目录 一. Set集合类型简介.二. 增加元素相关命令2.1 向集合中添加元素(sadd)2.2 从集合中移动元素( smove ) 三. 查询元素相关操作.3.1 查询集合中存在的所有元素.( smembers )3.2 查询集合中是否存在member( sismember ) 四. 随机获取集合中的元素4.1 随机获取集合中的n个元素…

LabVIEW中的非阻塞定时器

在LabVIEW编程中&#xff0c;通常需要在某些任务执行过程中进行非阻塞的延时操作。例如&#xff0c;显示某条信息一段时间&#xff0c;同时继续执行其他任务&#xff0c;并在延时时间结束后停止显示该信息。这类需求通常用于处理优先级不同的信息显示&#xff0c;如错误信息需要…

2024双十一买啥最划算?四款必入的数码好物推荐!

随着2024年双十一购物狂欢节的临近&#xff0c;各大电商平台纷纷推出了一系列令人期待的优惠活动&#xff0c;这无疑是一年中最佳的采购时机。对于追求科技潮流与实用主义的消费者而言&#xff0c;选择在这个时候入手心仪已久的数码产品无疑是明智之举。为了帮助大家抓住这波促…

Windows系统操作技巧

文章目录 I 打开‌任务管理器II Windows的run功能常用命令RDP协议的远程连接I 打开‌任务管理器 ‌通过快捷键打开‌任务管理器 ‌[Ctrl + Shift + Esc]:这是最常用的方法,直接按下这三个键即可快速打开任务管理器。‌Ctrl + Alt + Delete‌:按下这三个键后会弹出一个菜单,…

PostgreSQL数据库定期清理归档(pg_wal)日志

一、配置归档模式 在postgresql.conf文件中设置archive_mode on来启用归档功能。 二、设置归档命令 同样在postgresql.conf中&#xff0c;设置archive_command参数&#xff0c;指定一个shell命令来处理归档日志&#xff0c;例如&#xff1a; archive_command cp %p /home/…

中英文在线翻译工具大盘点

中英文在线翻译工具如同语言世界的桥梁&#xff0c;连接着两种不同的文化和语言体系。接下来&#xff0c;让我们一同走进这个精彩纷呈的中英文在线翻译工具集锦&#xff0c;探寻它们的奥秘与魅力。 1.福昕在线翻译 链接直达>>https://fanyi.pdf365.cn/doc 这款在线翻…

Git的基本使用入门

参考&#xff1a;Git速查 git的基本概念 git常用命令大部分是基于三大分区来执行的。先来了解一些专有名词吧。 工作区&#xff0c;也叫 Working Directory暂存区&#xff0c;也叫 stage&#xff0c;index版本库&#xff0c;也叫本地仓库&#xff0c;commit History 将代码推…

书店系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;图书管理&#xff0c;论坛信息管理&#xff0c;用户管理&#xff0c;公告信息管理&#xff0c;基础数据管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;论坛信息&…

(六)、CT中的滤光片

在X射线中衰减是吸收和散射的结果。X射线可以由于光电效应而衰减&#xff0c;也可以由于康普顿效应而衰减和散射。长波长X射线对CT图像形成的贡献不显著&#xff0c;但会增加患者的剂量&#xff0c;总体的来讲就是要保留穿透能力强的X光。 光电效应是指当光子与物质中的原子相互…