java面对对象(中.2)(多态性,终极父类,instanceof,包装类等)

2023-11-06

今天来讲java中的多态性,多态性我个人认为它是最重要,同时也是最难理解的!!!不过不用担心,下面就带你了解java中的多态性!

多态性,是面向对象中最重要的概念,在Java中的体现:
对象的多态性:父类的引用指向子类的对象
可以直接应用在抽象类和接口上
Java引用变量有两个类型:编译时类型运行时类型。编译时类型由声明
该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简
称:编译时,看左边;运行时,看右边。
若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism)
多态情况下,
“看左边”:看的是父类的引用(父类中不具备子类特有的方法)
“看右边”:看的是子类的对象(实际运行的是子类重写父类的方法)
对象的多态 —在Java中,子类的对象可以替代父类的对象使用
一个变量只能有一种确定的数据类型
一个引用类型变量可能指向 ( 引用 ) 多种不同类型的对象
Person p = new Student();
Object o = new Person(); //Object 类型的变量 o ,指向 Person 类型的对象
o = new Student(); //Object 类型的变量 o ,指向 Student 类型的对象
子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象:向
上转型 (upcasting)
一个引用类型变量如果声明为父类的类型,但实际引用的是子类
对象,那么该变量就不能再访问子类中添加的属性和方法
Student m = new Student();
m.school = “pku”;
//合法,Student类有school成员变量
Person e = new Student();
e.school = “pku”;
//非法,Person类没有school成员变量
属性是在编译时确定的,编译时ePerson类型,没有school成员变量,因而编
译错误。
方法声明的形参类型为 父类 类型,可以使用 子类的对象 作为实参调用该方法
类似于:老板叫你找个人过来帮忙,你找来一个男人或者女人来都没关系,在这里人相当于父类,男人相当于子类,女人相当于子类,同理,老板叫你找个男人来的时候,你就不能随便找个是人的玩意就行了!!!!
虚拟方法调用(Virtual Method Invocation)
 正常的方法调用
Person e = new Person();
e.getInfo();
Student e = new Student();
e.getInfo();
虚拟方法调用(多态情况下)
子类中定义了与父类同名同参数的方法,在多态情况下,将此时父类的方法称为虚拟方法,父
类根据赋给它的不同子类对象,动态调用属于子类的该方法。这样的方法调用在编译期是无法
确定的。
Person e = new Student();
e.getInfo();
//调用Student类的getInfo()方法
编译时类型和运行时类型
编译时ePerson类型,而方法的调用是在运行时确定的,所以调用的是Student
getInfo()方法。——动态绑定
类似于:老板要看一个人跳舞,你找张三来,他跳的是芭蕾,你找李四来他跳的是爵士舞,但是老板让你找的时候,他不知道会看到是什么舞(编译行为),等来了开跳了才知道啊(运行时行为)

 

多态小结
多态作用:
提高了代码的通用性,常称作接口重用
前提:
需要存在继承或者实现关系
有方法的重写
成员方法:
  编译时 :要查看 引用变量所声明的类 中是否有所调用的方法。
运行时 :调用实际 new 的对象所属的类 中的重写方法。
成员变量:
不具备多态性,只看引用变量所声明的类
关于多态还不止这些,还没有完,接下来我们就再深入理解一波!

 

下面是代码分析 

public class ConversionTest {
public static void main(String[] args) {
double d = 13.4;
long l = (long) d;
System.out.println(l);
int in = 5;
Object obj = "Hello";
String objStr = (String) obj;
System.out.println(objStr);
Object objPri = new Integer(5);
// 所以下面代码运行时引发ClassCastException异常
String str = (String) objPri; } 
}

运行结果

 13
Hello
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
    at ConversionTest.main(ConversionTest.java:33)

public class Test {
public void method(Person e) { // 设Person类中没有getschool() 方法
// System.out.pritnln(e.getschool()); //非法,编译时错误
if (e instanceof Student) {
Student me = (Student) e; // 将e强制转换为Student类型
System.out.pritnln(me.getschool());
} }
public static void main(String[] args){
Test t = new Test();
Student m = new Student();
t.method(m);  //子类自动向父类转型
} }

子类继承父类
若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的 同名方法,系统将不可能把父类里的方法转移到子类中。
对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的 实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量

 接下来我们说下,目前学习中我听过最中二的名字终极父类(Objext)

——Java程序中所有类的直接或间接父类,类库中所有类的父类,处在类层次最高点

包含了所有Java类的公共属性,其构造方法是Object( )

 到这里我们随便讲下== 和equals以及还有终极父类中方法 

 

 

 

 看到这里,你以为完了??趁热打铁我们下面来了解下包装类

我们都知道java有基本数据类型和引用数据类型,而它的口号又是“万事万物皆对象”,所以针对基本数据类型,他提出了包装类的概念,实现从基本数据类型到类的转化!!

 

 

 

 

 

 下面看下一道踩坑题:(你会中枪的,我说的)

Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);
System.out.println(1==i);
System.out.println(1==j);
System.out.println(i.equals(1));
System.out.println(j.equals(1));

			Integer m = 1;
			Integer n = 1;
			System.out.println(m == n);

Integer x = 128;
Integer y = 128;
System.out.println(x == y);

 运行结果:

false
true
true
true
true
true
false

解释:

基本数据类型与引用数据类型进行比较时,引用数据类型会进行拆箱,然后与基本数据类型进行值的比较

引用数据类型与基本数据类型进行比较,基本数据类型会进行自动装箱,与引用数据类型进行比较,Object中的equals方法比较的是地址,但是Integer类已经重写了equals方法,只要两个对象的值相同,则可视为同一对象,具体看API文档,所以这归根到底也是值的比较!

如果引用数据类型是直接new的话,不管值是否相同,这时两个对象都是不相同的,因为都会各自在堆内存中开辟一块空间

如果引用数据类型是这样 Integer i = 12;直接从常量池取对象,这是如果数值是在-128与127之间,则视为同一对象,否则视为不同对象

从常量池取对象跟new出来的对象也是不同的

    举例: 
    Integer i = 12; 
    Integer j = new Integer(12) 
    i == j 这时返回的是false

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java面对对象(中.2)(多态性,终极父类,instanceof,包装类等) 的相关文章

随机推荐

  • 网络通信深入解析:探索TCP/IP模型

    http协议访问web 你知道在我们的网页浏览器的地址当中输入url 未必是如何呈现的吗 web浏览器根据地址栏中指定的url 从web服务器获取文件资源 resource 等信息 从而显示出web页面 web使用HTTP 超文本传输协议
  • linux bitcoin-qt程序运行时 缺少 libboost.so 动态库

    这是因为该程序在系统变量的路径下未找到自己的依赖库 所以就启动不了 执行将缺省的依赖库补上 能让程序搜索的到就可以了 bitcoin可执行程序的运行错误截图 执行打开后发生的错误提示 bitcoin qt home cly project
  • Linux epoll 详解

    最近 异想天开 想用D实现一个web服务器 似乎已经想这件事好久了 只不过之前是C 自然而然得开始研究epoll 早就听说过epoll的大名 只不过网上的教程似乎没多少 并且感觉也没怎么把用法给讲完整 好在 通过几天的学习 也算是有所积累
  • 解决使用InfluxDBClient报错influxdb.exceptions.InfluxDBClientError: 401 unauthorized

    解决方案 查看自己的InfluxDB数据库版本 如果版本是1 8 或是2 x 则 首先卸载influxdb pip uninstall influxdb 然后安装 pip install influxdb client ciso 后续使用i
  • K8S-微服务组件

    微服务组件包括哪些 一个完整的微服务包括的组件 注册中心 配置中心 熔断 限流 链路跟踪 路由 在微服务中 有些组件为必须组件 必须启动存在 客户端才能正常调用 必须组件 注册中心 后台服务 Provider 非必须组件 配置中心 熔断 限
  • select poll epoll

    Select select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理 用Select就可以完成非阻塞 所谓非阻塞方式non block 就是进程或线程执行此函数时不必非要等待事件的发生 select在socket编程中
  • xcodebuild使用

    转自 xcodebuild命令简单使用 简书 流程 build archive IPA teamid xcodebuild命令简单使用 前提准备证书并熟悉xcodebuild介绍 以及官方文档 xcodebuild showsdks查看可用
  • vue2安装ant-design UI报错 ERR! peer vue@“>=3.2.0“ from ant-design-vue@3.2.15

    npm install ant design vue save 安装报错 使用的是vue2 如图 npm ERR code ERESOLVE npm ERR ERESOLVE unable to resolve dependency tre
  • JSP request对象功能详解说明

    转自 JSP request对象功能详解说明 下文笔者讲述request对象的功能简介说明 如下所示 request的功能 request是HttpServletRequest类的实例 request对象中封装了客户端请求的数据信息 通过获
  • python --- 之pil图像转换的一些方式

    在数字图像处理中 针对不同的图像格式有其特定的处理算法 所以 在做图像处理之前 我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现 本文基于这个需求 使用python中的图像处理库PIL来实现不同图像格式的转换 对于彩色图像 不管
  • UNITY普通3D项目转换成URP项目

    注意 要确认 UniversalRP 对应的版本支持 目前此插件在2019和2020 2版本上已经得到认证 转换的前提 1 查看素材或询问素材支持的Unity版本 2 查看或询问素材是否支持 UniversalRP 插件 3 查看或询问素材
  • 睿智的目标检测48——Tensorflow2 搭建自己的Centernet目标检测平台

    睿智的目标检测48 Tensorflow2 搭建自己的Centernet目标检测平台 学习前言 什么是Centernet目标检测算法 源码下载 Centernet实现思路 一 预测部分 1 主干网络介绍 2 利用初步特征获得高分辨率特征图
  • IDEA启动Tomcat时报java.lang.IllegalStateException: Error starting child

    今天刚刚开始学习使用idea时 在网上查了资料后 写了一个简单的Servlet做测试 结果出现 2019 01 13 01 30 39 745 Artifact testidea war exploded Artifact is being
  • web服务器型号价格,web服务器的价格

    web服务器的价格 内容精选 换一换 华为云将可用的计算资源 按照一定折扣进行售卖 其价格随市场供需关系实时变化 这种打折销售 价格实时变化的计费模式称为 竞价计费 在该计费模式下 您可以以折扣价购买并使用弹性云服务器 性能与常规云服务器无
  • 什么是高防CDN?

    高防CDN是为了更好的服务网络而出现的 是通过高防DNS来实现的 高防CDN是通过智能化的系统判断来路 再反馈给用户 可以减轻用户使用过程的复杂程度 通过智能DNS解析 能让网站访问者连接到响应的服务器上 以避免某个服务器因访问者过多而瘫痪
  • 多任务学习综述:推荐系统多任务学习(multitask)的实战总结和常见问题(一)

    多任务学习算法系列的主要内容是回顾和总结自己2019 2021间在深度学习多任务学习算法 multitask 的工业实践和遇到的常见问题 欢迎更多同学讨论和指正 同时也宣传一波我们组在推荐方向的工作成果 大规模推荐算法库PaddleRec
  • C语言操作字符练习题---跟着鹏哥学C语言第二天打卡

    选A 这里的字符串 hello bit hello bit 0 此处是有空格 在字符串里每个符号包空格都是由阿斯科码值组成 所以每个字符都会各自存储一个字节的空间 包括后面隐藏的 0 字符串内都会有 strlen计算包括空格 所以sizeo
  • Webgl开发输入框兼容问题及开发注意的问题

    Webgl开发输入框 InputField组件 输入中文 说明 解决方案一通过重写原生的InputField组件来兼容 解决方案二通过打包后自己定义JS 总结 说明 最近一直再搞WEBGL平台的项目 花了好几天解决InputField组件输
  • WPF PasswordBox 绑定

    对于PasswordBox 可能很多人都会按着TextBox的路子 在ViewModel里面写一个属性 然后绑定到Password属性上 当你写完这一切的时候 你会突然收到Visual Studio的提示 Password并不是依赖属性 不
  • java面对对象(中.2)(多态性,终极父类,instanceof,包装类等)

    今天来讲java中的多态性 多态性我个人认为它是最重要 同时也是最难理解的 不过不用担心 下面就带你了解java中的多态性 多态性 是面向对象中最重要的概念 在Java中的体现 对象的多态性 父类的引用指向子类的对象 可以直接应用在抽象类和