Java学习笔记23(面向对象三大特征)

1.5 多态

​ *多态(polymorphic)

​ *方法或对象具有多种形态,是面向对象的第三大特征,多态是建立在封装和继承基础之上的

1.多态的具体体现

1.方法的多态

(重写和重载体现了多态)

2.对象的多态

​ 1.一个对象的编译类型和运行类型可以不一致

Animal animal = new Dog();	//animal编译类型是Animal,运行类型是Dog
animal = new Cat();

​ 2.编译类型在定义对象时,就确定了,不能改变

​ 3.运行类型是可以变化的

​ 4.编译类型看定义时=号的左边,运行类型看 = 号的右边

class Cat extends Animal
{public void cry(){System.out.println("小猫喵喵叫")}
}class Animal
{public void cry(){System.out.println("动物在叫")}
}main()
{Animal animal = new Cat();animal.cry();	//小猫喵喵叫//若此时改为Dog类,则会执行Dog类下的方法animal = new Dog();animal.cry();
}

2.多态的细节

1.多态的前提:两个对象(类)存在继承关系

2.本质:父类的引用指向了子类的对象

3.语法:父类类型 引用名 = new 子类类型();

4.特点:编译类型看左边,运行类型看右边

5.如果子类中写有父类没有的方法,那么如果运用了多态,就调用不了子类特有的成员方法

3.多态的向上转型

​ *(子类转换成父类)

​ *父类也可以是爷爷类(基类)

4.多态的向下转型

​ 1.语法: 子类类型 引用名 = (子类类型) 父类引用

​ 2.只能强转父类的引用,不能强转父类的对象

​ 3.要求父类的引用必须指向的是当前目标类型的对象

​ 4.当向下转型后,可以调用子类类型中所有的成员

main()
{Animal animal = new Cat();	//原来的animal的运行类型是Cat对象,所以可以在下面强转为Cat类型Cat cat = (Cat) animal;//强转父类引用为为子类	这样就可以调用子类的特有成员方法
}

5.注意事项和细节

1.属性没有重写直说,属性的值看编译类型

class Base
{int money = 10;
}class Sub extends Base
{int money = 20;
}main()
{Base base = new Base();base.money;//10Sub sub = new Sub();sub.money;//20
}

2.instanceof 比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型

class AA{}//父类
class BB extends AA{}//子类main()
{BB bb = new BB();System.out.println(bb instanceof BB);//bb是不是BB的类型,返回结果为boolean值System.out.println(bb instanceof AA);//aa 编译类型 AA,运行类型BBAA aa = new BB();System.out.println(aa instanceof AA);//trueSystem.out.println(aa instanceof BB);//true    
}

6.动态绑定机制

1.当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

2.当调用对象属性时,没有动态绑定机制,哪里声明(函数里面的成员属性为函数所在类下的成员属性),哪里使用

class A
{public int i = 10;public int sum(){return getI() + 10;}public int sum1(){return i +10;}public int getI(){return i;}
}class B extends A
{public int i =20;public int sum(){return i +20;}public int getI(){return i;}public int sum1(){return i +10;}
}main()
{A a = new B();//向上转型System.out.println(a.sum());//40System.out.println(a.sum1());//30    
}

7.多态的应用

1.多态数组

​ *数组的定义类型为父类类型,里面保存的实际元素类型为子类类型

class Teacher extends Person
{String name;int salary;public void say(){}public void teach(){}
}class Student extends Person
{String name;int score;public void say(){}public void study(){}
}class Person
{public void say(){}
}main()
{Person[] persons = new Person[5];persons[0] = new Person("jack", 20);persons[1] = new Student("jack",18,100);persons[2] = new Teach("scott" ,30 ,20000);for(int i = 0;i<3;i++){System.out.println(persons[i].say());//动态板顶机制if(persons[i] instancof Student){Student student = (Student)persons[i];//向下转型student.study();}else if(persons[i] instanceof Teacher){Teacher teacher = (Teacher)persons[i];teacher.teach();} else{System.out.println("你的类型有误,请自己检查...")}}
}
2.多态参数

​ *方法定义的形参类型为父类类型,实参类型允许为子类类型

1.6 Object类

在这里插入图片描述

1.equals方法

​ * == 是一个比较运算符

1.==:既可以判断基本类型,又可以判断引用类型

2.==:如果判断基本类型,判断的是值是否相等

3.==:如果判断引用类型,判断的是地址是否相等,即判定是不是同一个对象

4.equals:是Object类的方法,只能判断引用类型

5.默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等。比如Integer,String

2.重写equals方法

class Person
{private String name;private int age;private char gender;//重写Object的equals方法public boolean equals(Object obj){if(this == obj){return true;}}//类型判断if(obj instanceof Person){//是Person,我们才比较Person p = (Person)obj;return this.name.equals(p.name) && this.age == p.age && this.gender == p.gender;}//如果不是Person类型,则直接返回falsereturn false;
}

1.7 hashCode

​ *hashCode返回该对象的哈希码值

​ *总结:

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

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

3.两个引用,如果指向的是不同对象,则哈希值是不一样的

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

1.8 toString

​ *返回该对象的字符串表示

​ *基本介绍

1.默认返回:全类名(包名 + 类名) + @ + 哈希值的十六进制

2.当直接输出一个对象时,toString会被默认调用

System.out.println(monster);
System.out.println(monster.toString());//这两个是等价的

1.9 finalize

1.当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作

2.什么时候被回收:当某个对象没有任何引用时,则jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁对象前,会先调用finalize方法

3.垃圾回收机制的调用,是由系统来决定,也可以通过System.gc()主动触发垃圾回收机制

main()
{Car bmw = new("宝马");bmw = null;System.gc();	//主动调用垃圾回收器
}

1.10 断点调试(debug)

1.在开发中,新手程序员在查找错误时,这时老程序员就会温馨提示,可以用断点调试,一步一步的看原码执行的过程,发现错误

2.在断点调试过程中,是运行状态,是以对象的运行类型来执行的

1.断点调试介绍

1.断点调试是指在程序的某一行设置一个断点,调试时,程序运行到这一行就会停住,然后可以一步一步往下调试,调试过程中可以看各个变量当前的值

2.断点调试的快捷键

F7(跳入) :跳入方法内

F8(跳过) :逐行执行代码

shift + F8(跳出)

F9(resume,执行到下一个断点)

在这里插入图片描述

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

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

相关文章

三国游戏(贪心 排序)

三国游戏 利用贪心、排序、前缀和的计算方法&#xff0c;特别注意不要数据溢出了&#xff0c;sum 加long long s[i] x[i]-y[i]-z[i]输入: 3 1 2 2 2 3 2 1 0 7输出: 2#include <bits/stdc.h> using namespace std;const int N 1e5100;typedef long long ll;bool cm…

容器和K8s常见概念

【容器】 1、Open Container Initiative&#xff08;OCI&#xff09;&#xff1a;制定和推动容器格式和运行时的开放标准。容器运行时需要遵循此标准。主要的产出物包括&#xff1a; OCI Image Specification: 定义容器镜像格式的规范&#xff0c;统一描述容器镜像的内容和结…

git入门教程

Git 1. Git历史 同生活中的许多伟大事件一样&#xff0c;Git 诞生于一个极富纷争大举创新的年代。Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上&#xff08;1991&#xff0d;2002年间&#xff09;。到 2002…

PicGo日志报错 image not found in clipboard

PicGo: image not found in clipboard 文章目录 PicGo: image not found in clipboard问题描述问题尝试解决方案 问题描述 背景&#xff1a;在剪切板中的图片无法通过 PicGo 的剪切板图片进行上传。 读取PicGo 日志报错&#xff0c;显示图片没有在剪切板中找到。 $ ------Erro…

express接口请求的几种方式分析总结

导语 在用express做接口开发的时候&#xff0c;我们要处理post,get,put,delete等请求&#xff0c;以及jsonp的方式&#xff0c;这篇文章记录下结合ajax&#xff0c;实现处理这些请求方式的过程 实现过程 上代码&#xff0c;主要演示post,get及jsonp的请求 <!DOCTYPE htm…

(学习日记)2024.04.05:UCOSIII第三十三节:互斥量

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

51单片机入门_江协科技_17~18_OB记录的笔记

17. 定时器 17.1. 定时器介绍&#xff1a;51单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成&#xff0c;无需占用CPU外围IO接口&#xff1b; 定时器作用&#xff1a; &#xff08;1&#xff09;用于计时系统&#xff0c;可实现软件计时&…

C语言题目:分段函数练习

题目描述 输入x &#xff0c;计算并输出下列分段函数 f(x) 的值。可以调用数学库函数&#xff1a;平方根函数sqrt(),绝对值函数fabs() 和幂函数 pow()。 保留2位小数 输入格式 x 输出格式 f(x) 样例输入 5 样例输出 15.00 代码分析 包含标准输入输出库和数学库: #incl…

Linux -- 字符设备驱动--LED的驱动开发(初级框架)

驱动框架一阶段 我们怎样去点亮一个 LED 呢&#xff1f;分为三步&#xff1a; 看原理图确定引脚&#xff0c;确定引脚输出什么电平才能点亮/熄灭 LED 看主芯片手册&#xff0c;确定寄存器操作方法&#xff1a;哪些寄存器&#xff1f;哪些位&#xff1f;地址是&#xff1f; 编…

webpack5如何关闭全屏错误

1、找到vue.config.js 2、在上面的devServer里面添加如下&#xff1a; client: {overlay: false, // 禁用全局错误提示},

mynet开源库

1.介绍 个人实现的c开源网络库&#xff0e; 2.软件架构 1.结构图 2.基于event的自动分发机制 3.多优先级分发队列&#xff0c;延迟分发队列 内部event服务于通知机制的优先级为0&#xff0c;外部event优先级为1&#xff0e; 当集中处理分发的event_callback时&#xff0c…

更新!谷歌倾斜摄影转换生成OSGB瓦片V0.2版

半个月前发表了一篇文章(首发&#xff01;谷歌倾斜摄影转换生成OSGB格式),首次将谷歌原始倾斜摄影瓦片转成OSGB瓦片&#xff0c;有读者对文章里的内容有诸多疑问&#xff0c;可能我在文章中描述的不够清楚&#xff0c;这里再解释一下。 1.谷歌倾斜摄影3DTiles瓦片生成方案 之…

若依ts版本(vue3+element plus+ts)

1、项目简介 本项目参考若依前后端分离版&#xff0c;前端由[若依vue3]改写为ts版本[ruoyi-web-vue3-ts]&#xff0c;后端对[若依V3.8.7]进行了修改[后端版本分支vue3.ts.3.8.7]&#xff0c;具体文档参见[若依官方文档]。本项目对部分代码做了优化&#xff0c;增加了activiti7…

langchain 学习笔记-FunctionCalling三种方式

ChatGPT 基于海量的训练数据生成答案&#xff0c;所以它无法回答训练数据中没有的信息或搜索信息 。人们希望 ChatGPT 具有对话以外的各种功能&#xff0c;例如“我想管理我的待办事项列表”。 函数调用是对此类请求的响应。 通过使用函数调用&#xff0c;ChatGPT 现在可以在生…

Vue-ts项目导入Js文件方法-书写提示无法找到模块“XXXX”的声明文件-配置说明

提示 无法找到模块“/filter/filter”的声明文件。“d:/code/byWork/mixmarvel/SendAssetsClient/src/filter/filter.js”隐式拥有 "any" 类型。 解决方法 修改 tsconfig.json {"compilerOptions": {"target": "esnext","modu…

RIP配置不求人:手把手教你配置RIP路由

#教育优质作者发文挑战赛# 大家好&#xff0c;今天给同学们介绍一下RIP基本功能相关配置 01、基本概念 RIP是一种基于距离矢量&#xff08;Distance-Vector&#xff09;算法的协议&#xff0c;它使用跳数&#xff08;Hop Count&#xff09;作为度量值来衡量到达目的地址的距离…

耐压40V、输出电压1.23-37V可调,适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。

一、应用领域 适用于工控主板、TV板卡、安卓主板、车载功放电源等产品方案应用。 二、功能介绍 D1509是一款输入耐压40V、输出电压1.23-37V可调、输出电流最大2.0A的高效率、高精度DC-DC芯片&#xff0c;其输出电压有固定3.3V、5.0V和12.0V的版本&#xff0c;可以为客户省去…

【2024】Rancher的安装与介绍

———————————————————————————— 记录一下rancher的学习与使用过程 本部分内容包括rancher的介绍、特点、与k8s关系和部署等内容 ———————————————————————————— Rancher是什么&#xff1f; 简单来说&#xff0c;Ranc…

BIDI的单芯双向光模块是在用哪里的?

为什么要选择BIDI光模块&#xff1f; BIDI光学模块最明显的优点&#xff0c;如SFP BIDI光学模块或SFP BIDI光学模块&#xff0c;可以减少光纤跳线面板上的端口数量&#xff0c;节省光纤布线基础设施的成本&#xff0c;减少布线空间&#xff0c;方便光纤的管理&#xff0c;减少…

什么是电子邮件加密?电子邮件加密有几种类型?

在当今数字时代&#xff0c;电子邮件已经成为人们日常生活中不可或缺的沟通工具&#xff0c;据相关数据统计&#xff0c;全球每天发送的电子邮件数以亿计&#xff0c;而这些邮件里面通常包含了姓名、地址、个人身份信息 (PII)、登录凭证、财务信息、法律合同、知识产权等有价值…