0基础学java之Day18

包装类

  • 理解:基本数据类型对应的类

  • 出现原因:

  • Java为纯面向对象语言,8种基本数据类型不能new对象,

  • 破坏了Java为纯面向对象语言的特征,所以Java有为8种

  • 基本数据类型分别匹配了对应的类,这种类叫做包装类/封装类

基本数据类型引用数据类型继承关系
byteByteObject.Number.Byte
shortShortObject.Number.Short
intIntegerObject.Number.Integer
longLongObject.Number.Long
floatFloatObject.Number.Float
doubleDoubleObject.Number.Double
charCharacterObject.Character
booleanBooleanObject.Boolean

注意:

  • int类型对应的包装类是Integer

  • char类型对应的包装类是Character

  • 其余的基本数据类型对应的包装类就是首字母大写

  • 应用场景:

    • 一个方法既可以接收整数也可以接收小数的参数,就可以把形参的类型设置为Number

    • 集合作为容器,需要设置元素的参数,元素参数必须是引用数据类型,如果想存储基本数据类型,就可以把元素类型设置为对应的包装类

public static void main(String[] args) {
    /*  double i=100.145;
        Double valueOf = Double.valueOf(i);
        System.out.println(valueOf);
        
    //手动拆箱  包装型->基本数据类型 
    Double double1 = new Double(120.365);
    double doubleValue = double1.doubleValue();
    System.out.println(doubleValue);*/
        
    
    //自动拆箱
    int i=200;
    Integer integer=i;
    System.out.println(integer);
    
    //自动拆箱
    Double double1 = new Double(365.365);
    double a=double1;
    System.out.println(a);
        
    //parseInt():将字符串转换为int值
    String str = "123";
    int num = Integer.parseInt(str);
    System.out.println(num+1);//124     
    }

Integer底层

//手写Integer方法创建MyInteger类
package com.qf.package_class;
​
public class MyInteger{
​
    private int value;
​
    public MyInteger(int value) {
        this.value = value;
    }
    
    public int intValue(){
        return value;
    }
    
    @Override
    public String toString() {
        return String.valueOf(value);
    }
    
    public static MyInteger valueOf(int i){
        if(i >= MyIntegerCache.low && i<= MyIntegerCache.high){
            return MyIntegerCache.cache[i - MyIntegerCache.low];
        }
        return new MyInteger(i);
    }
    
    //MyInteger缓存类 -- 存储了-128~127区间的MyInteger对象
    private static class MyIntegerCache{
        
        private static final int low = -128;
        private static final int high = 127;
        private static final MyInteger[] cache;
        
        static{
            cache = new MyInteger[high - low + 1];//创建数组共有256个元素(有0)
            int j = low//把最小值当作数组的第一个元素
            for (int i = 0; i < cache.length; i++) {
                cache[i] = new MyInteger(j);
                j++;
            }
        }
        
    }
}
//创建一个测试类
package com.qf.package_class;
​
public class Test03 {
    /**
     * 知识点:Integer的深入 -- 底层原理
     */
    public static void main(String[] args) {
        
//      Integer integer = new Integer(100);
//      int i = integer.intValue();
//      System.out.println(i);//100
//      System.out.println(integer);//100
        系统的Integer
        Integer integer1 = Integer.valueOf(100);
        Integer integer2 = Integer.valueOf(100);
        System.out.println(integer1 == integer2);//true
        
        Integer integer3 = Integer.valueOf(200);
        Integer integer4 = Integer.valueOf(200);
        System.out.println(integer3 == integer4);//false
        
        System.out.println("-------------------------------------");
        
//      MyInteger myInteger = new MyInteger(100);
//      int i = myInteger.intValue();
//      System.out.println(i);//100
//      System.out.println(myInteger);//100
        自己手写的MyInteger也能实现功能
        MyInteger myInteger1 = MyInteger.valueOf(100);
        MyInteger myInteger2 = MyInteger.valueOf(100);
        System.out.println(myInteger1 == myInteger2);//true
        
        MyInteger myInteger3 = MyInteger.valueOf(200);
        MyInteger myInteger4 = MyInteger.valueOf(200);
        System.out.println(myInteger3 == myInteger4);//false
    }
}
​

枚举

特点

  • 枚举就是一个受限制的类,默认继承Enum

  • 枚举的第一行必须定义该枚举类型的对象

  • 枚举类型对象默认添加: public static final 类型

  • 枚举没有继承明确类(自定义枚举类默认继承Enum,Enum默认继承Object)

  • 枚举类不能被继承

  • 枚举里可以有构造方法、成员方法、静态方法、抽象方法

  • 枚举可以实现接口

  • 枚举里没有定义方法,可以在最后一个对象后面加逗号、分号或什么都不加

优势

  • 增强代码可读性

  • 枚举型可直接与数据库交互

  • switch语句优势

  • 编译优势

    (枚举类编译时,没有把常量值编译到代码中,即使常量值发生改变,也不会影响引用常量的类 )

  • 将常量组织起来,统一管理

  • 去除equals两者判断 由于常量值地址唯一,使用枚举可以直接通过“==”进行两个值之间的对比,性能会有所提高

枚举的方法

方法名解释
Enum.valueOf(Class<E> enumType, String name)根据字符串找到该枚举类中的对象
public static void values()获取该枚举类对象数组
public static void valueOf(String args0)根据字符串获取该枚举类中的对象
public final String name()获取该枚举对象名字
public final Class<E> getDeclaringClass()获取枚举对象的枚举类型相对应的Class对象
public final int hashCode()获取该枚举对象的hash值
public final int compareTo(E o)两个枚举对象进行比较
public final boolean equals(Object other)比较两个枚举对象是否相同

需求:编写季节类(Season),该类只有四个对象(spring,summer,autumn,winter)

重点:只有四个对象 枚举的应用场景:一个类有固定的几个对象,就推荐使用枚举

枚举默认写了 public static final

//创建枚举
package com.qf.enum2;
​
public enum Season {  //注意这里是enum不是class类
    //底层实现:public static final Season spring = new Season("春天","春雨绵绵");
    spring("春天","春雨绵绵"),
    summer("夏天","烈日炎炎"),
    autumn("秋天","硕果累累"),
    winter("冬天","白雪皑皑");
//必须先创建枚举对象可以不写也可以逗号也可以分号结束
    
        private String name;
        private String info;
    
        private Season() {
        }
        private Season(String name, String info) {
            this.name = name;
            this.info = info;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getInfo() {
            return info;
        }
        public void setInfo(String info) {
            this.info = info;
        }
        
        @Override//重写toString方法
        public String toString() {
        
        return name+"   "+info;
        }
}
//创建一个测试类输出春夏秋冬及其他信息
public class Test01 {
    public static void main(String[] args) {    
        System.out.println(Season.spring);
        System.out.println(Season.summer);
        System.out.println(Season.autumn);
        System.out.println(Season.winter);
    }
}

枚举的底层

//还是刚才Season的代码反编译
public abstract class Enum<E extends Enum<E>> implements Comparable<E>, Serializable {
    
    private final String name;//枚举对象名
    private final int ordinal;//枚举对象编号(从0开始)
    
    protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }
    
    public final String name() {
        return name;
    }
    
    public final int ordinal() {
        return ordinal;
    }
    
}
///
public final class Season extends Enum{
​
    public static final Season spring;
    public static final Season summer;
    public static final Season autumn;
    public static final Season winter;
    
    private String name;
    private String info;
    
    private static final Season[] ENUM$VALUES;//枚举数组
    
    static{
        //初始化该枚举类的四个对象,并且把枚举名和枚举编号一并记录下来
        spring = new Season("spring", 0, "春天", "春雨绵绵");
        summer = new Season("summer", 1, "夏天", "烈日炎炎");
        autumn = new Season("autumn", 2, "秋天", "硕果累累");
        winter = new Season("winter", 3, "冬天", "白雪皑皑");
        
        //初始化枚举数组
        ENUM$VALUES = new Season[]{spring, summer, autumn, winter};
    }
​
    //private Season(){}
    private Season(String s, int i){
        super(s, i);
    }
​
    //private Season(String name, String info){}
    private Season(String s, int i, String name, String info){
        super(s, i);
        this.name = name;
        this.info = info;
    }
​
    public String getName(){
        return name;
    }
​
    public void setName(String name){
        this.name = name;
    }
​
    public String getInfo(){
        return info;
    }
​
    public void setInfo(String info){
        this.info = info;
    }
​
    public String toString(){
        return (new StringBuilder(String.valueOf(name))).append(" -- ").append(info).toString();
    }
​
    //获取该枚举类所有的对象
    public static Season[] values(){
        Season[] aseason = ENUM$VALUES;
        int i = aseason.length;
        Season[] aseason1 = new Season[i];
        
        //参数 - 源数组,开始下标,目标数组,开始下标,拷贝长度
        System.arraycopy(aseason, 0, aseason1, 0, i);
        return aseason1;
    }
​
    public static Season valueOf(String s){
        return (Season)Enum.valueOf(com/qf/enum03/Season, s);
    }   
}
​
//测试类
package com.qf.enum03;
​
public class Test01 {
    /**
     * 知识点:枚举的方法
     */
    public static void main(String[] args) {
​
        //通过字符串获取对应枚举类里的对象
        Season season1 = Enum.valueOf(Season.class, "spring");
        
        //通过字符串获取对应枚举类里的对象
        Season season2 = Season.valueOf("spring");
        System.out.println(season1 == season2);//true
        
        //获取枚举对象名
        String name1 = season1.name();
        String name2 = season2.name();
        System.out.println(name1);
        System.out.println(name2);
        
        //获取枚举对象编号
        int ordinal1 = season1.ordinal();
        int ordinal2 = season2.ordinal();
        System.out.println(ordinal1);//0
        System.out.println(ordinal2);//0
        
        //获取该枚举类里所有的对象
        Season[] seasons = Season.values();
        for (Season season : seasons) {
            System.out.println(season);
        }
        
    }
    
}
​

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在面试了些外包以后,我有了些自己的思考

大家好&#xff0c;我是洋子&#xff0c;最近公司在降本增效&#xff0c;需要把外包从北京迁移到陕西的某新一线城市&#xff0c;其实就是变相裁员&#xff0c;减少外包的成本&#xff0c;裁掉现有的员工&#xff0c;重新招聘新人 在整个测试行业&#xff0c;外包测试的比重是…

论文 | Ignore Previous Prompt: Attack Techniques For Language Models

这篇论文探讨了针对大型语言模型&#xff08;LLM&#xff09;的“提示注入”攻击&#xff0c;并提出了一种名为 PROMPTINJECT 的框架来研究这类攻击。 论文的主要内容包括&#xff1a;1. 提示注入攻击&#xff1a; 论文定义了“提示注入”的概念&#xff0c;即通过在用…

Django-中间件

定义&#xff1a; 编写中间件&#xff1a; 注册中间件&#xff1a; 添加中间件&#xff1a; 1.在项目目录下添加一个文件夹&#xff08;名字随意&#xff09;&#xff0c;然后文件夹下创建.py文件 2.将中间件添加到setting文件中 MIDDLEWARE [django.middleware.security.Se…

MBR20100CT-ASEMI半塑封肖特基二极管MBR20100CT

编辑&#xff1a;ll MBR20100CT-ASEMI半塑封肖特基二极管MBR20100CT 型号&#xff1a;MBR20100CT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220 安装方式&#xff1a;插件 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;20A 最大循环…

操作数据表

创建表 创建表语法&#xff1a; CREATE TABLE table_name ( field1 datatype [COMMENT 注释内容], field2 datatype [COMMENT 注释内容], field3 datatype ); 注意&#xff1a; 1. 蓝色字体为关键字 2. CREATE TABLE 是创建数据表的固定关键字&#xff0c;表…

一、ARMv8寄存器之通用、状态、特殊寄存器

ARMV8核心寄存器数量是非常大的&#xff0c;为了更好的学习&#xff0c;可以划分为以下几大类&#xff1a; 通用寄存器。这类寄存器主要是用来暂存数据和参与运算。通过load\store指令操作。状态寄存器。AArch64体系结构使用PSTATE寄存器表示当前处理器状态。特殊寄存器。有专门…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

【Docker】构建Linux云桌面环境

目录 一、说明 二、离线安装Docker 1&#xff09;将下载的包上传到服务器上去 2&#xff09;安装docker 3) 启动docker 4&#xff09;配置加速器 三、安装云桌面镜像 四、启动云桌面 方式一&#xff1a;docker命令直接运行 方式二&#xff1a;docker-compose方式 五…

Easysearch 与 LLM 融合打造知识库系统

文章目录 一、LangChain 简介二、RAG 产生的背景及其局限性三、RAG 工作流程四、 Easysearch 结合 LLM 实现 RAG&#xff08;1&#xff09;Easysearch 简介&#xff08;2&#xff09;结合实现RAG 五、 Easysearch 结合 LLM 实现 RAG 的优势&#xff08;1&#xff09;提高检索准…

驱动-----adc

在key1.c的基础上进行对adc1.c进行编写 首先将文件里面的key全部改为adc 再修改一下设备号 按键和adc的区别是什么,按键只需要按一下就触发了,并且不需要返回一个值出来, adc要初始化,启动,返回值 以下是裸机adc的代码: #include <s3c2440.h> #include "ad…

快速生成高质量提示词,Image to Prompt 更高效

抖知书老师推荐&#xff1a; 随着 AI 技术的不断发展&#xff0c;视觉信息与语言信息之间的转换变得越来越便捷。在如今的数字化生活中&#xff0c;图像与文字的交互需求愈发旺盛&#xff0c;很多人都希望能轻松将图像内容直接转化为文本描述。今天我们来推荐一款实用的 AI 工…

FileLink跨网文件传输与传统文件传输对比

在数字化时代&#xff0c;文件传输已成为企业日常运营不可或缺的一部分。然而&#xff0c;随着企业规模的扩大和业务的复杂化&#xff0c;传统的文件传输方式逐渐暴露出诸多不足。本文将对比FileLink跨网文件传输与传统文件传输方式&#xff0c;揭示FileLink在高效性、安全性和…

渗透测试-百日筑基—文件上传篇特征截断渲染%00绕过——下篇

目录 day10-渗透测试文件上传篇&绕过&特征&截断&渲染 一、黑名单大小写绕过代码分析 1、获取文件后缀名进行判断&#xff0c;如果后缀在这个字典里就禁止上传。 2、黑名单大小写绕过攻击 二、利用 windows 系统特征绕过上传 1、windows 系统特征绕过漏洞…

YoloV9改进策略:Block改进|RFE模块,提高小物体的识别精度|即插即用|代码+修改过程

摘要 论文介绍 本文介绍了一种基于YOLOv5的人脸检测方法,命名为YOLO-FaceV2。该方法旨在解决人脸检测中的尺度变化、简单与困难样本不平衡以及人脸遮挡等问题。通过引入一系列创新模块和损失函数,YOLO-FaceV2在WiderFace数据集上取得了优异的表现,特别是在小物体、遮挡和困…

CodeQL学习笔记(3)-QL语法(模块、变量、表达式、公式和注解)

最近在学习CodeQL&#xff0c;对于CodeQL就不介绍了&#xff0c;目前网上一搜一大把。本系列是学习CodeQL的个人学习笔记&#xff0c;根据个人知识库笔记修改整理而来的&#xff0c;分享出来共同学习。个人觉得QL的语法比较反人类&#xff0c;至少与目前主流的这些OOP语言相比&…

QT-使用QSS美化UI界面

一、QSS简介&#xff1a; Qt Style Sheet&#xff1a;Qt样式表&#xff0c;用来自定义控件外观的一种机制&#xff0c;可以把他类比成CSS&#xff08;CSS主要功能与最终目的都是能使界面的表现与界面的元素分离&#xff09;。QSS机制使应用程序也能像web界面那样随意地改变外观…

江协科技STM32学习- P23 DMA 直接存储器存取

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

Adb命令大全

本文列举了几乎所有的adb命令&#xff0c;方便Android学习者或者开发工程师在日常学习开发过程中查询使用。建议收藏。 Adb Server adb kill-server adb start-server 重启 adb reboot adb reboot recovery adb reboot-bootloader adb root //restarts adb with root permis…

信息安全保障人员CISAW认证有哪些级别和方向?

在信息安全领域&#xff0c;CISAW认证已经成为了一个重要的资格认证标准。 它不仅代表了专业技术水平的认可&#xff0c;也是进入该领域工作和发展的重要凭证。 对于有志于从事信息安全相关工作的人员来说&#xff0c;了解其报考条件是迈向成功的第一步。 CISAW认证体系涵盖…

微信小程序中点击搜素按钮没有反应,可能是样式问题(按钮被其他元素覆盖或遮挡)

文章目录 1. 确认 bindtap 绑定在正确的元素上2. 检查是否有遮挡或重叠元素3. 检查 this 上下文绑定问题4. 清除微信小程序开发者工具的缓存5. 用微信开发者工具查看事件绑定6. 确保 handleSearch 没有拼写错误进一步调试 1、searchResults.wxml2、searchResults.wxss3、search…