Java : 多态,包装类的面试题:

news2024/11/22 6:34:29

Java : 多态,包装类的面试题:

在这里插入图片描述


每博一文案

有人说:小孩子才会仰天大哭,成年人的世界早就调成了静音模式,连崩溃也很懂事。
一路走来,我们一边受伤,也一边变得更坚强,慢慢的不再逢人就笑了,也不再期待谁的拥抱了。
我们习惯了一边打伞一边奔跑,在没人帮的时候,学会了独立,也在没人疼的时候,学会了自愈,明白了
想要去的地方,要自己走过去。想要的安全感也只能自己给,没有人生来坚强,只是后来学会了隐藏。
听过这样的一句话,时间顺流而下,生活逆水行舟,人生不可能一帆风顺,经历过磨难在所难免。
很多时候,我们都是逼自己穿起了戎装,硬着头皮去面对,不愿在人面前露出一丝一毫的脆弱。
仿佛一旦示弱,就会被生活生吞活剥,其实这个世界上没有那么多的感同身受,有的,只是冷暖自知,你的眼泪
只有关心你的人心疼,你的笑容,也只有在乎你的人中重视,所以不要把硬抗伪装成坚强,把困难修饰成笑脸,
只为了让自己看起来还算体面。
你的眼睛很漂亮,看错人没关系,爱流眼泪也没关系,一定会有人时如珍宝。
愿你往后的每一次坚强都不是硬抗。
                                                   ——————   一禅心灵庙语

文章目录

    • Java : 多态,包装类的面试题:
    • 每博一文案
    • 1. 多态面试题
    • 2. 三目运算符
    • 3. 包装类中的 Integer 缓存问题
    • 4. 总结:
    • 5. 最后:


1. 多态面试题

如下代码,其中的 atest.add(1,2,3); 语句执行的是 其中的 add()的哪个方法 ,执行结果又是什么???

package blogs.blog1;

public class Topic {
    public static void main(String[] args) {
        Test test = new Test2();  // 多态
        test.add(1,2,3);  
    }

}


class Test{
    public void add(int a,int...arr) {
        System.out.println("Test:add");
    }
}


class Test2 extends Test{
    public void add(int a,int[]arr) {
        System.out.println("Test2:add");
    }
    
    public void add(int a,int b,int c) {
        System.out.println("Test: a, b, c");
    }
}

在这里插入图片描述

解析:

执行的是 Test2 子类中重写的 add() 的方法。

因为: 对于 public void add(int a,int...arr)public void add(int a,int[]arr) 是一样的参数列表,

最后的可变参数 int…arr ,本身就是旧的数组 int[]arr ,继承关系:方法名一样,参数列表一样,符合继承重写条件,在加上继承的多态所以调用的是子类重写的 public void add(int a,int[] arr) 方法


修改一下:

如下 其中的 test2.add(1,2,3); 调用的又是哪个类中的哪个方法,执行的结果又是什么???

package blogs.blog1;

public class Topic {
    public static void main(String[] args) {
        Test test = new Test2();  // 多态
        Test2 test2 = (Test2)test;
        test2.add(1,2,3);
    }

}


class Test{
    public void add(int a,int...arr) {
        System.out.println("Test:add");
    }
}


class Test2 extends Test{
    public void add(int a,int[]arr) {
        System.out.println("Test2:add");
    }

    public void add(int a,int b,int c) {
        System.out.println("Test: a, b, c");
    }
}

在这里插入图片描述

解析:

test2.add(1,2,3); 是通过 这行代码 : Test2 test2 = (Test2)test;强制向下转型得到的,一个子类 Test2 对象的

所以这里 add(1,2,3) 调用的是 Test2 子特有的 public void add(int a,int b,int c) 三个形参从方法。


2. 三目运算符

观察如下代码,思考运行结果是:什么 ???

public class Topic {
    public static void main(String[] args) {
        Object object = true ? new Integer(1) : new Double(2.0);
        System.out.println(object);
    }
}

在这里插入图片描述

解析:

因为对于运算: +,-,*,/ 都是需要保证两者之间是同一个数据类型才行的,如果不是的话,其中一个不符合的变量会自动提升到类型一致的情况后,再进行运算的。

同理 ? 三目运算符也是运算符,同样需要保证两者变量的一致性,所以 Integer 会自动提升至 Double 类型后,再进行运算。

结果就是 Double 类型的了,为 1.0


3. 包装类中的 Integer 缓存问题

请仔细阅读如下代码,查看执行的结果是 : ???

public class Topic {
    public static void main(String[] args) {
        Integer i = new Integer(1);
        Integer j = new Integer(1);
        System.out.println("i == j: "+(i == j));

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

        Integer x = 128;
        Integer y = 128;

        System.out.println("x == y: "+(x == y));

    }
}

在这里插入图片描述

解析:

  • 第一个 i == j 的结果是 : false。

因为我们使用的是 == 操作符,再加上使用的是 new 创建的实例对象,对于引用类型(除了String ) 比较的是 两个变量的地址是否相等 ,很显然地址是不同的。结果是 false

  • 第二个 m == n 的结果是:true 。

因为不是 new 创建的实例对象,而是通过自动装箱到包装类当中的,使用 == 比较的是两个变量的数值内容是否相等,很显然都是 1,相等,结果是 true;

  • 第三个 x == y 的结果是: false。

因为什么呢:这里我们使用和上面第二个自动装箱的方式,并没有 new ,按道理来说,应该也是比较的是两个变量的数值内容,返回的也应该是 true 才对,为什么返回的却是 false;

原因是:

Integer 内部定义了 IntegerCache 结构,IntegerCache 中定义了 Integer[] 保存了 从 -128~127 范围的整数,如果我们使用自动装箱的方式,给Integer赋值的范围在 -128~127范围内时,可以直接使用数组中的元素,就不用 new 了,从而提高效率。

而这里的 128 自动装箱不在该[-128~127]的范围内,数组中没有该元素,就会 new 一个对象,存储该数值 128 ,new 一个实例对象,再 == 操作符,引用类型的比较的就不再是变量的数值内容了,而是变量的地址了,显然地址是不相同的。返回 false

我们在从源码上分析

private static class IntegerCache {
        static final int low = -128;
        static final int high; 
        static final Integer cache[];

        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);

            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }

        private IntegerCache() {}
    }

从源码上我们可以到 low 是为 -128high 是为 127 ,我们在通过获取到的信息阅读如下代码


public static Integer valueOf(int i) {
    // low = -128 , high = 127
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

以发现, 当 i >= -128 && i <= 127 的时候,在该范围内时,取值是在IntegerCache.cache[] 数组中取的数值的,并不是 new 来的,在该范围内取的数值的来源是相同的,自然也就是会相等的,但是当需要取的值是超出该范围[-128~127]的时候,是return new Integer(i); 创建一个新的实例对象来的。

而在引用类型中的 == 等号,比较的就并不是数值了,而是其引用对象的地址,所以超过该范围的取值,比较时是地址,不是数值,结果就可能不相等了。


我们再比较 127 自动装箱看看,如下代码

public class Topic {
    public static void main(String[] args) {
        Integer x = 127;
        Integer y = 127;
        System.out.println("x == y: "+(x == y));
    }
}

在这里插入图片描述

在该 [-128~127]的数组范围内,从IntegerCache.cache[] 数组中取数值,不是 new 出来的引用类型,== 操作符比较的就是两个变量的值了。

4. 总结:

  1. 对于 public void add(int a,int...arr)public void add(int a,int[]arr) 是一样的参数列表,
  2. 对于运算: +,-,*,/ 都是需要保证两者之间是同一个数据类型才行的,如果不是的话,其中一个不符合的变量会自动提升到类型一致的情况后,再进行运算的。**?**三目运算符也是一样的
  3. 注意对于 Integer 包装类,自动装箱的数值如果是在 [-128~127] 范围内的话,是从 IntegerCache.cache[] 数组中取值,超过该范围的数值就是 new 创建一个实例对象,保存了。

5. 最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵——多多益善,谢谢大家,后会有期,江湖再见 !!!

在这里插入图片描述

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

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

相关文章

数据库原理及MySQL应用 | 日志管理

数据库系统管理维护阶段需要通过日志对数据库的性能进行监督、分析和改进。 日志是数据库系统的重要组成部分&#xff0c;记录了数据库的运行状态、数据的变更历史、错误信息及用户操作等信息。在日常管理中&#xff0c;数据库管理员可通过日志监控数据库的运行状态、优化数据库…

国内外文献镜像网站

一、常用的国内外文献镜像网站 维普网&#xff1a;http://lib.cqvip.com/ idata&#xff1a;https://www.cn-ki.net/ 独秀&#xff1a;https://www.duxiu.com/ 中国知网&#xff1a;https://www.cnki.net/ 龙源期刊网&#xff1a;http://www.qikan.com.cn/ 万方数据&#xff1…

计算机毕业设计HTML+CSS+JavaScript仿大型购物商城(1页)

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…

毕业设计 单片机GPS定位位置记录系统 - 物联网 嵌入式 stm32

文章目录0 前言1 简介2 主要器件3 实现效果4 硬件设计概述硬件模块的连接**AB32VG1主控MCU**5 软件说明6 部分核心代码7 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩…

基于asp.net人力资源管理系统-计算机毕业设计

基于asp.net的人力资源管理的内容和人事管理日常管理所遇到的问题&#xff0c;整个系统可以分为下面几个子模块&#xff0c;分别为员工档案信息管理、工资信息管理、考勤信息管理、消息信息管理、账号信息管理等几个大的功能模块,开发环境:Visual studio,sqlserver数据库.资料有…

非零基础自学Golang 第9章 结构体 9.4 初始化结构体

非零基础自学Golang 文章目录非零基础自学Golang第9章 结构体9.4 初始化结构体9.4.1 键值对格式初始化9.4.2 列表格式初始化第9章 结构体 9.4 初始化结构体 上一小节我们讲解了在结构体实例化后&#xff0c;再使用“.”的方式对成员变量进行赋值。另外&#xff0c;我们还可以…

Junit5 架构、新特性及基本使用(常用注解与套件执行)

什么是 Junit5&#xff0c;在 Junit5 的官方介绍文档中这写到&#xff1a; Junit5 由JUnit Platform JUnit Jupiter JUnit Vintage3部分构成&#xff0c;借用 IBM Developer 的一张图来说明 JUnit 5 的架构&#xff1a; JUnit Platform: JUnit Jupiter: JUnit Vintage: 嵌套单…

Spring Cloud 总结 - 调用远程服务的三种方式及原理分析

一个简单的微服务架构图 本文设计的 Spring Cloud 版本以及用到的 Spring Cloud 组件 Spring Cloud Hoxton.SR5eurekafeignribbon 后面的内容都将围绕上面的图来分析. 调用远程服务的三种方式 在 Spring Cloud 服务架构中, 一个服务可能部署多个实例, 通常情况下, 这个时候…

好玩的网站安利

好玩的网站安利 1、EGOUZ https://www.egouz.com/ 授人以鱼不如授人以渔&#xff0c;先给大家分享两个可以找国外优质网站的地方。EGOUZ是一个高质量的导航站&#xff0c;内容主要是外国网站&#xff0c;并且做了很详细的分类&#xff0c;网站资源非常丰富。 EGOUZ按照国家分…

50450-80-1,Ala-Ala-Ala-对硝基苯胺

AAA-pNA, chromogenic substrate for porcine pancreatic elastase and for astacin, a crayfish zinc-endopeptidase.3a - pna&#xff0c;猪胰腺弹性酶和阿斯塔星的显色底物&#xff0c;阿斯塔星是一种小龙虾锌内肽酶。 编号: 163840中文名称: 三肽Pancreatic elastase subst…

1573_AURIX_TC275_SCU中的急停功能以及overlay

全部学习汇总&#xff1a; GreyZhang/g_TC275: happy hacking for TC275! (github.com) 急停功能是不需要软件进行干预的&#xff0c;至少&#xff0c;这个事件的动作触发是不需要软件进行干预的。急停事件的触发因素&#xff1a;外部的输入事件、SMU的警报信息。外部的输入事件…

概率论 ‖ Machine Learning必备知识

概率论&#xff01;Machine Learning必备知识 文章目录概率论&#xff01;Machine Learning必备知识1 什么是概率1.1 最简单的例子1.2 概率论与数理统计的关系2 大数定律和中心极限定理2.1 大数定律是什么&#xff1f;2.2 代码直观理解大数定律2.3 中心极限定理2.4 大数定律和中…

Java基础开发之编译异常和运行异常

一、getProperties()方法 1.System类提供一个getProperties()方法用来**当前系统的全部属性&#xff0c;它会返回一个Properties对象&#xff0c;也封装了系统的全部属性&#xff0c;这些属性的存在是以键值对的形式。 2.getProperties()方法使用例子&#xff1a; public cl…

《数字电子技术》笔记

《数字电子技术》笔记绪论第一章 信息和编码第二章 逻辑代数第三章 门电路第四章 组合电路的逻辑与分析第五章 触发器第七章 可编程逻辑器件绪论 什么是电子技术&#xff1f;是研究电子器件及电子器件应用的学科。EDA&#xff1a;Electronic Design Automation电子电路用处&am…

【Python机器学习】回归任务、线性回归评价指标讲解及温度与花朵数线性回归实战(图文解释 附源码)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 与分簇、分类和标注任务不同&#xff0c;回归任务预测的不是有限的离散的标签值&#xff0c;而是无限的连续值。回归任务的目标是通过对训练样本的学习&#xff0c;得到从样本特征集到连续值之间的映射。如天气预测任务中&a…

ERC-3525 开发入门指南

ERC-3525 标准是以太坊社区批准通过的半匀质化通证&#xff08;Semifungible Token, 亦称为半同质化通证&#xff0c;简称 SFT&#xff09;标准&#xff0c;由 Solv Protocol 提出。ERC-3525 标准定义了一类新型的数字资产&#xff0c;具有以下突出优势&#xff1a;与 ERC-721 …

网曝某公司HR向求职者索要高考成绩!你们还记得自己的高考分数吗?

奇葩年年有&#xff0c;今年特别多&#xff0c;一位网友曝光&#xff1a;在应聘北京某公司的时候&#xff0c;HR竟然跟自己索要高考成绩&#xff01;网友感叹&#xff0c;遇到过在学信网查本科学位的公司&#xff0c;但这种奇葩公司没见过。有人说&#xff0c;虽然问高考成绩确…

git status 查看仓库文件状态

1. 前言 2. 各种状态 3. -s 参数 4. --ignored 查看所有被忽略的文件 1. 前言 git status 命令用于查看当前 git 中的文件状态 这个命令会将工作区、暂存区、版本库中的文件状态输出到命令行界面 git status git status 命令是 git 中最常用的命令之一&#xff0c;当我们要执…

[附源码]计算机毕业设计Python-菜篮子系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

C++11标准模板(STL)- 算法(std::equal)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 确定两个元素集合是否是相…