数据类型和程序运算

news2024/9/22 1:43:25

1. 数据类型

1.1 static修饰的变量

本文所有内容在企业考核的笔试题出现频率很高,而且是易错题大家注意下!

南友们在玩Java时有没发现,下面这样一个对象,我们即使没有给变量赋值,在创建它后这个变量依旧会有默认值

class A {
    int a;
}

System.out.println(new A().a);
程序执行结果:
0

有时前端同学要求后端给个默认值0,我们甚至不用动手,Java编译器就把活给干完。

这实际上是Java语言的一个特性,对于实例变量即成员变量,如果是基本数据类型都会有一个默认值。不同的基本类型默认值不同,我们看看以下各种基本类型的默认值。

int a; //0
short b; //0
long c; //0
float d; //0.0
double e; //0.0
boolean f; //false
byte g; //0
char h; //空字符

1.2 自动类型提升

(1)Java中的byte、short、char进行数学计算时都会提升为int类型,很容易忽略的基础知识,胡广慢慢道来。

以下代码的运行正常吗?

byte b1 = 1, b2 = 2, b3;
b3 = b1 + b2;

答案在你意料之中,就是编译报错。

# 报错内容
java: 不兼容的类型: 从int转换到byte可能会有损失

既然byte、short、char进行数学计算时都会提升为int类型,那我们就需要在运行过程中把结果转换成byte类型。正确的做法如下。

b3 = (byte)(b1 + b2);

(2)但假如byte变量是这样的写法,我们给b1和b2都加个final,很神奇,编译不会报错。

final byte b1 = 1, b2 = 2, b3;
b3 = b1 + b2;

这种情况是一个特殊情况,Java编译器会为其进行特殊处理,我们称它为编译时常量表达式的求值。b1、b2、b3都是常量值,b3在编译阶段就会被编译器进行赋值,不会涉及到上面我们提到的数学计算提升为int类型,也就不会编译错误。

(3)但如果是这种情况呢?

final byte b1 = 1; byte b2 = 2, b3;
b3 = b1 + b2;

以上两个byte变量,只有一个final修饰,也就是说对b3赋值运算不能在编译时进行,那这段代码依旧会报错,我们还是需要把结果转换为byte类型。

正确做法如下。

b3 = (byte)(b1 + b2);

1.3 byte溢出

byte类型的数据范围在-128 ~ 127,当这个值超过127会转变成 - 128。为什么呢?

byte i = 127;
System.out.println(++i);
程序执行结果:
-128

byte类型的最大值127在二进制中表示为01111111,当我们对127的值增加1时,每位加1后都会产生进位,导致的结果就是所有的位都会翻转(从01111111变成10000000),而10000000十进制的表示就是-128。

1.4 Bollean赋值

业务开发编写最多就是条件语句了,特别在迭代年代比较旧的老项目,一套接一套的if语句。

既然见识了那么多条件语句,那以下代码的执行结果是什么?

Boolean flag = false;
if (flag = true) {
    System.out.println("true");
}
else {
    System.out.println("false");
}

在Java里,条件判断是有赋值的功能,try语句同样也有。此时falg在条件判断里被赋值了。

程序执行结果:
true

2. 程序运算

2.1 三元运算符

三元运算符的坑,相信不少南友遇到过。。。我们来看看三元运算符是什么?

Java中的三元运算符是一种简洁的条件表达式工具,其语法格式为:条件 ? 表达式1 : 表达式2。

如果条件为真(true),则表达式的结果是表达式1;如果为假(false),则结果是表达式2

假如是这种情况呢,胡广问:o1最终的数据类型是什么?

Object o1 = true ? new Integer(1) : new Double(2.0);

上面的代码行其实等同于这一行。

Object o1 = true ? new Double(1.0) : new Double(2.0);

三元运算符的一个非常关键的细节就是类型的统一化。Double类型的数据范围更大于Interger类型,所以Java编译器会对值类型进行类型提升,最终把Integer类型提升为Double类型。

2.2 自增问题

下面是胡广编写的两个i++自增的易错问题,面试考核经常出现在笔试题。

(1)胡广第一问:以下代码执行的结果是什么?

int i = 0;
i = i++ + i; 
程序执行结果:
1

(2)胡广第二问:以下代码执行的结果是什么?

int i = 0;
i = i++;
System.out.println(i);
程序执行结果:
0

2.3 String对象

我们创建一个String对象,JVM在背后实际上做了很多功夫,String对象在常量池、堆内存都有可能存在。我们具体问题来具体分析下。

(1)以下代码段不包含引用类型,只是单纯的字面量拼接,所以只会创建一个对象存在于常量池中。

String s = "JavaProGuide" + "胡广" + 666;

(2)以下代码段包含了引用类型,一共创建了3个对象,猜对了吗?

String s = "Hello";
s = s + " world!"

"Hello"、" world!"都属于字面量,所以它们都会被加入到Java字符串常量池中。

s + " world!"这么一个代码段涉及了引用类型,所以它在内存里创建了一个新的String对象,并不存在于常量池,而是存在于堆内存里。

(3)以下代码段一共创建了两个对象,分别存在于常量池、堆内存。

首先new对象会把该String对象放到堆内存里,而过程中会先检查常量池是否存在JavaProGuide

String str = new String("JavaProGuide");

祝大家学习愉快,加油!! 

祝大家学习愉快,加油!! 

祝大家学习愉快,加油!! 

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

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

相关文章

【个人笔记】Git

Tiltle: Github 使用 📖 快速使用 音标:[ɡɪthʌb] 0 介绍 Github是一个面向开源与私有软件项目的 托管平台,Git源自其内部的版本库格式.2008年上线,18年被微软收购;有很多知名的开源项目:jQuery、pytho…

Android Framework(三)Activity启动流程

文章目录 大纲总体流程 第一阶段:点击图标启动应用流程概览SourceActivity端处理system_service处理启动请求参数的构建activityInfo的解析创建ActivityRecord 窗口层级树的处理获取Task--getOrCreateRootTaskActivityRecord挂载到Task--setNewTask移动Task到容器顶…

最新!yolov10+deepsort的目标跟踪实现

目录 yolov10介绍——实时端到端物体检测 概述 主要功能 型号 性能 方法 一致的双重任务分配,实现无 NMS 培训 效率-精度驱动的整体模型设计 提高效率 精度提升 实验和结果 比较 deepsort介绍: yolov10结合deepsort实现目标跟踪 效果展示…

Elasticsearch的部署和使用

首先对java来说,我们可用的有原生elasticsearch和经过spring二次封装的spring data elasticsearch. 后者自带了一些方法,类似于mybatisplus,可以直接使用,十分方便. 如果是spring项目都建议使用第二种,除非你要深度使用. 首先是服务器的部署.部署之前要知道版本,我在部署时遇到…

GoLang:Go语言开发环境的配置

Go语言 Go语言开发环境的配置 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite:http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_28550263/a…

一款管理苹果设备的软件iMazing3中文破解安装激活教程

iMazing3官方版是一款管理苹果设备的软件,是一款帮助用户管理 IOS 手机的PC端应用程序,能力远超 iTunes 提供的终极 iOS 设备管理器。在iMazing官方版上与苹果设备连接后,可以轻松传输文件,浏览保存信息等,功能比Itune…

NDK编译c/c++文件成so库

目录 背景 Android NDK下载及配置 工程准备 创建Android.mk文件 创建Application.mk文件 编译项目 总结 背景 做算法开发,有时需要将算法编程成so库给其他人调用,很多时候都是在Android平台上使用,这样就会使用到Android NDK进行编译&…

高职院校大数据分析与可视化微服务架构实训室解决方案

一、前言 随着信息技术的飞速发展,大数据已成为推动社会进步与产业升级的关键力量。为了培养适应未来市场需求的高素质技术技能型人才,高职院校纷纷加大对大数据分析与可视化技术的教学投入。唯众,作为国内领先的职业教育解决方案提供商&…

论文速读|大型语言模型作为通用模式机器

项目地址:Large Language Models as General Pattern Machines 本研究探讨了大型语言模型(LLMs)作为通用模式机器的潜力,特别是在机器人技术领域。研究发现,LLMs 能够在没有额外训练的情况下,通过上下文学…

这才是HR想看到的应届生简历

速创猫今天给大家分享的是应届毕业生简历优化案例,希望对大家求职有帮助。速创猫总结了以下七条简历制作干货,希望对大家有帮助: 简洁明了:简历不是自传,不需要长篇大论。保持每份简历在一页纸内,突出关键…

Linux(CentOS)同步服务器时间之~chrony

Chrony 是一款开源的网络时间协议(NTP)客户端和服务端软件,旨在提供高精度的时间同步功能。相较于传统的 NTP 实现如 ntpd,Chrony 提供了一些改进和优势,包括更快的同步速度、低延迟、低CPU占用和低内存消耗。以下是 C…

c++ 154 引用

#include<iostream> using namespace std; //引用作为函数参数不需要初始化 void myswap(int *a,int *b) {int c 0;c *a;*a *b;*b c; } void main03() {int a 10;//引用语法 Type & name var;int& b a;b 100;//相当于把a改成100&#xff1b;printf("…

素材无水印素材网站在哪下载?高清的无水印素材资源库分享

找高清无水印素材&#xff1f;蛙学网、Pixabay 等资源库全揭秘&#xff01; 创意十足的你&#xff0c;是不是常为网上素材的烦人水印而头疼&#xff1f;总在寻找高清、干净、无水印的素材资源&#xff0c;却无从下手&#xff1f;别急&#xff0c;今天就为大家推荐几个超实用的…

c++应用网络编程之八SOCKET探究

一、socket 在目前主流的网络通信中&#xff0c;SOCKET编程其实就是网络编程的代名词。在前面反复提到socket&#xff0c;那么socket到底是什么呢&#xff1f;英文的愿意是“插座、槽”的意思。这里虽然不讲解传统的网络协议但不得不简单说明一下。 首先从宏观上看&#xff0c…

《数字信号处理》学习01-离散时间信号与序列的卷积和运算

目录 一&#xff0c;信号 二&#xff0c;序列的运算 1&#xff0c;卷积和 2&#xff0c;matlab实现 相关的电子书籍请到这篇文章所在的专栏&#xff0c;并通过夸克网盘链接下载。 很多简单的知识点我就不再赘述了&#xff0c;接下来就着重记录我学习过程中遇到的较难理…

class 3: vue.js 3 计算属性

计算属性是一种Options API&#xff0c;Options API是一种通过对象定义属性、方法等框架API的方式我们知道&#xff0c;在模板中可以直接通过插值语法显示一些data属性中的数据。但是在某些情况下&#xff0c;可能需要对数据进行一些转化操作之后再显示&#xff0c;或者需要将多…

PostgreSQL技术内幕5:PostgreSQL存储引擎从磁盘到内存的读取

文章目录 0.简介1.背景知识1.1 计算机存储结构1.2 数据库常见的磁盘和内存访问形式 2. 整体获取层次3.元组介绍4. Buffer管理4.1 Buffer组成4.2 修改后落盘4.3 获取buffer页的流程 5.存储管理器&#xff08;SMGR)6.磁盘管理器&#xff08;MD)7.虚拟文件管理器&#xff08;VFD)8…

【攻防世界新手入门】simple_js

小宁发现了一个网页&#xff0c;但却一直输不对密码。&#xff08;Flag格式为 Cyberpeace{xxxxxxxxx} &#xff09; 该题来自攻防世界新手练习区的 GFSJ0480。 访问靶场&#xff0c;输入任意密码&#xff0c;弹出错误窗口并加载空页面&#xff0c;使用检查器查看对应源代码&…

zdppy+vue3+onlyoffice文档管理系统实战 20240901 上课笔记 基于验证码登录功能基本完成

遗留的问题 1、点击切换验证码2、1分钟后自动切换验证码 点击切换验证码 实现步骤&#xff1a; 1、点击事件2、调用验证码接口3、更新验证码的值 点击事件 给图片添加点击事件&#xff1a; <img :src" data:image/png;base64, captchaImg"style"widt…

ffplay源码分析(五)包缓存队列和帧缓存队列

在音视频处理流程中&#xff0c;ffplay的有两种队列&#xff0c;包缓存队列&#xff08;Packet Buffer Queue&#xff09;和帧缓存队列&#xff08;Frame Buffer Queue&#xff09;。这两个队列的存在&#xff0c;是为了适应音视频数据处理过程中的多线程架构——包括收包线程、…