Java表达式2.0
1 .数据类型转换
自动类型转换的规则
自动类型转换遵循一定的规则,这些规则确保了转换的合理性和安全性。以下是自动类型转换的主要规则:
-
容量小的类型自动转换为容量大的类型
Java中,数据类型的容量从小到大依次为:byte→short→int→long→float→double。当进行算术运算或赋值操作时,如果操作数的类型不同,系统会自动将容量小的类型转换为容量大的类型,以确保运算的正确性和数据的完整性。 -
操作数为
double型时的转换规则
如果表达式中有一个操作数是double类型,那么整个表达式的结果会被提升为double类型。这是因为double类型具有最高的精度和最大的容量,能够容纳其他类型的数据,从而避免了精度丢失。 -
操作数为
float型时的转换规则
如果表达式中有一个操作数是float类型,那么整个表达式的结果会被提升为float类型。这是因为float类型比int、long等整数类型具有更高的精度,但比double类型稍低。 -
操作数为
long型时的转换规则
如果表达式中有一个操作数是long类型,而没有float或double类型的操作数,那么整个表达式的结果会被提升为long类型。这是因为long类型比int类型具有更大的范围,能够容纳更大的整数值。
示例与解释
以下是一些具体的示例,帮助理解自动类型转换的规则:
示例1:操作数为double型
double result = 10 + 3.5;
-
在这个表达式中,
10是int类型,3.5是double类型。 -
根据自动类型转换规则,
int类型的10会被自动转换为double类型,然后与3.5进行加法运算。 -
最终,整个表达式的结果是
13.5,并且结果的类型是double。
示例2:操作数为float型
float result = 10 + 3.5f;
-
在这个表达式中,
10是int类型,3.5f是float类型。 -
根据自动类型转换规则,
int类型的10会被自动转换为float类型,然后与3.5f进行加法运算。 -
最终,整个表达式的结果是
13.5f,并且结果的类型是float。
示例3:操作数为long型
long result = 10L + 5;
-
在这个表达式中,
10L是long类型,5是int类型。 -
根据自动类型转换规则,
int类型的5会被自动转换为long类型,然后与10L进行加法运算。 -
最终,整个表达式的结果是
15L,并且结果的类型是long。
示例4:多个操作数的类型提升
double result = 10 + 5L + 3.5f;
-
在这个表达式中,
10是int类型,5L是long类型,3.5f是float类型。 -
首先,
int类型的10会被自动转换为long类型,与5L进行加法运算,结果是15L。 -
然后,
15L会被自动转换为float类型,与3.5f进行加法运算,结果是18.5f。 -
最后,由于表达式中存在
double类型的操作数,18.5f会被自动转换为double类型,最终结果是18.5,并且结果的类型是double。
自动类型转换的意义
自动类型转换在Java中具有重要的意义,它不仅简化了代码的编写,还提高了代码的可读性和可维护性。通过自动类型转换,开发者可以避免显式地进行类型转换,从而减少代码的冗余和出错的可能性。同时,自动类型转换还确保了数据在转换过程中的安全性和准确性,使得开发者可以更加专注于逻辑的实现,而不是类型转换的细节。
注意事项
尽管自动类型转换非常方便,但在某些情况下,开发者仍然需要注意以下几点:
-
精度丢失:虽然自动类型转换会尽量避免精度丢失,但在某些情况下,如将
float或double转换为整数类型时,可能会导致精度丢失。 -
范围溢出:如果转换后的类型范围不足以容纳原始数据,可能会导致范围溢出。例如,将一个非常大的
long值转换为int类型时,可能会导致数据丢失或错误。 -
显式类型转换:在某些情况下,如果需要将容量大的类型转换为容量小的类型,需要使用显式类型转换(强制类型转换),并注意可能引发的异常。
-
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的 那种数据类型,再进行计算。
byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
boolean类型不能与其它数据类型运算。
-
int a = 100; long b = 200;
-
b = a + b; System.out.println(b); 计算下列结果?
-
int a = 123; double d = a + 123; System.out.println(d);
-
int b = a /300; System.out.println(b);
强制类型转换
-
条件:转换的数据类型必须是兼容的
-
格式:(数据类型) 变量 , (数据类型) 是强制类型转换后的数据类型。例:
double d = 123.456d;System.out.println(d);int i = d;// 编译不通过int i = (int) d;// 截断操作System.out.println(i);;
-
*注意:强制转换有可能造成数据的缺失或者精度的缺失
编码情况1: long l1 = 123; // ok long l1 = 1234567890123456789; // 编译不通过 System.out.println(l1); float f1 = 12.3; // 编译不通过 // float f1 =(float) 12.3; 编码情况2: 整型常量,默认类型为int型 浮点型常量,默认类型为double类型 byte b = 12; byte b1 = b + 1;// 编译不通过 float f1 = b + 12.3;// 编译不通过 // byte b1 = (byte) (b + 1); // float f1 = (float) (b + 12.3);
2. 作用域
-
变量起作用的范围,称为作用域。
-
范围:变量在哪对大括号中声明定义的,范围就是哪对大括号。
-
在同一个作用域中,不能定义重复的变量。
-
3. 运算符
3.1 算数运算符
-
算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。
-
表格中的实例假设整数变量A的值为10,变量B的值为20:
| 操作符 | 描述 | 例子 |
|---|---|---|
| + | 加法:相加运算符两侧的值 | A + B 等于 30 |
| - | 减法:左操作数减去右操作数 | A – B 等于 -10 |
| * | 乘法:相乘操作符两侧的值 | A * B 等于 200 |
| 7/2 | 除法:左操作数除以右操作数 | B / A 等于 3 |
| % | 取余(取模):左操作数除以右操作数的余数 | B % A 等于 0 |
| ++ | 自增:操作数的值增加1 | B++ 或 ++B 等于 21 |
| -- | 自减:操作数的值减少1 | B-- 或 --B 等于 19 |
-
自增自减运算符
-
基本使用
int a = 5; a++; System.out.println(a); // 此时a的值为6 a--; System.out.println(a); // 此时a的值为5
-
a++和++a的区别int a = 5; int b = a++; System.out.println(a); // 6 System.out.println(b); // 5 int c = 5; int d = ++c; System.out.println(c); // 6 System.out.println(d); // 6
-
a++先赋值后自增 -
++a先自增后赋值int i = 6; int j = i++ + ++i; int k = --j - i-- - j-- + i++;
-
-
3.2 关系运算符
-
下表为Java支持的关系运算符
-
表格中的实例整数变量A的值为10,变量B的值为20:
| 运算符 | 描述 | 例子 |
|---|---|---|
| == | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | (A == B)为假 |
| != | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | (A != B)为真 |
| > | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | (A > B)为假 |
| < | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | (A < B)为真 |
| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | (A >= B)为假 |
| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | (A <= B)为真 |
3.3 逻辑运算符
-
下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假
| 运算符 | 说明 |
|---|---|
| 逻辑与 & | 两个条件为true,结果才是true,否则是false |
| 逻辑或 | | 两个条件有一个是true,结果就是true |
| 逻辑非 ! | 取反:!false为true,!true为false |
| 短路与 && | 左侧表达式为false,则直接返回false |
| 短路或 || | 左侧表达式为true, 则直接返回true |
&”和“&&”的区别
单&时,左边无论真假,右边都进行运算
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。(一假俱假)
“|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。(一真俱真)
//1>2的结果为false,那么整个表达式的结果即为false,还要计算2>(3/0),因为0不能做除数,所以会输出异常信息 boolean d = 1>2 & 2>(3/0); System.out.println(d); //1>2的结果为false,那么整个表达式的结果即为false,将不再计算2>(3/0) boolean c = 1>2 && 2>(3/0); System.out.println(c);
3.4 赋值运算符
-
下面是Java语言支持的赋值运算符:
| 操作符 | 描述 | 例子 |
|---|---|---|
| = | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
| += | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C += A等价于C = C + A |
| -= | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C -= A等价于C = C - A |
| *= | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C *= A等价于C = C * A |
| /= | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C /= A,C 与 A 同类型时等价于 C = C / A |
3.5 位运算符 (了解)
-
下表列出了位运算符的基本运算,假设整数变量 A 的值为 60 和变量 B 的值为 13:
| 操作符 | 描述 | 例子 |
|---|---|---|
| & | 如果相对应位都是1,则结果为1,否则为0。 | (A&B),得到12,即 0000 1100 |
| | | 如果相对应位都是0,则结果为0,否则为1。 | (A | B)得到61,即 0011 1101 |
| ^ | 如果相对应位值相同,则结果为0,否则为1。 | (A ^ B)得到49,即 0011 0001 |
| 〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即 1100 0011 |
| << | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
| >> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15,即 1111 |
| >>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A >>> 2得到15,即 0000 1111 |
-
注意:
&和|既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
-
位运算是直接对整数的二进制进行的运算。
public static void main(String[] args) {int a = 60; // 0011 1100int b = 13; // 0000 1101System.out.println(a&b); // 0000 1100System.out.println(a|b); // 0011 1101}
public class JavaDemo {public static void main(String[] args) {/*1.位运算符操作的都是整型的数据2.<<在一定范围内,每向左移一位,相当于*2>>在一定范围内,每向左移一位,相当于/2*/int i = 21;System.out.println("i<<2=" + (i << 2));System.out.println("i<<3=" + (i << 3));System.out.println("i<<27=" + (i << 27));System.out.println("i>>2=" + (i >> 2));
}
}
-
java中的进制声明
public static void main(String[] args) {int a = 0b11; //声明二进制变量int b = 011; //声明八进制变量int c = 11; //声明十进制变量int d = 0xaabb; //声明十六进制变量System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(d);}
3.6 其他运算符
-
条件运算符(x?y:z)
条件运算符也被称为三元运算符。
其中 x 为 boolean 类型表达式,先计算 x 的值,若为true,则整个运算的结果为表达式 y 的值,否则整个运算结果为表达式 z 的值。
int a = 10; int b = a > 10 ? 10 : 0; class calc {public static void main(String[] arg) {int a = 10;int b = 20;int c = 30;int result = (a > b ? a : b) > c ? (a > b ? a : b) : c;System.out.println(result);} } -
instanceof 运算符
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类型或接口类型)。
如果运算符左侧变量所指的对象,是操作符右侧类或接口(class/interface)的一个对象,那么结果为真。
String name = "James"; boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真
如果被比较的对象兼容于右侧类型,该运算符仍然返回true。
字符串类型:String String不是基本数据类型,属于引用数据类型 使用方式与基本数据类型一致。例如:String str = “abcd”; 一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。
字符串连接符(+) “+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
int a=12; System.out.println("a="+ a);//输出结果: a=12 String a = "3"; int b = 4 ; int c = 5 ; System.out.println(a+b+c); System.out.println(b+c+a);
3.7 运算符优先级
-
算术运算符 > 关系运算符 > 逻辑运算符
-
复杂的运算需要用小括号
()来强制控制运算顺序,可读性强int a = 3;int b = a += a++;int c = b *= a;
相关文章:
Java表达式2.0
1 .数据类型转换 自动类型转换的规则 自动类型转换遵循一定的规则,这些规则确保了转换的合理性和安全性。以下是自动类型转换的主要规则: 容量小的类型自动转换为容量大的类型 Java中,数据类型的容量从小到大依次为:byte → shor…...
JavaScript 一维数组转二维数组
题目描述: <script>const num [1,2,3,4]const out (function(num,m,n){if(num.length ! m*n){return []}const newarr []for(let i 0;i<m;i){newarr.push(num.slice(i*n,(i1)*n))}return newarr})(num,2,2)console.log(out)</script>不使用Stri…...
WIN10重启开机不用登录,直接进入桌面
我们个人机不需要登录。 步骤1 置,帐户,登录选项,密码。 输入当前密码后,直接下一步。 再次重启,就会发现不需要密码了。...
JavaScript学习教程,从入门到精通,DOM节点操作语法知识点及案例详解(21)
DOM节点操作语法知识点及案例详解 一、语法知识点 1. 获取节点 // 通过ID获取 const element document.getElementById(idName);// 通过类名获取(返回HTMLCollection) const elements document.getElementsByClassName(className);// 通过标签名获取…...
基于ESP32 - S3实现一个ping百度的C测试程序
环境准备 安装ESP-IDF开发环境,可参考官方文档。确保开发环境已正确配置,能对ESP32 - S3进行编译和烧录。 实现思路 连接WiFi:让ESP32 - S3连接到一个可用的WiFi网络。初始化Ping功能:利用ESP-IDF提供的Ping API初始化Ping功能…...
英语学习4.15
amateur amateur 🔤 读音:/ˈmətər/ 或 /ˈmətʃʊr/ ✅ 词性:名词 / 形容词 ✅ 中文释义: (名词)业余爱好者 👉 指不是以此为职业的人,通常出于兴趣而从事某项活动。 …...
开源项目FastAPI-MCP:一键API转换MCP服务
在当今AI开发的世界中,应用程序与AI模型之间的无缝集成至关重要。 模型上下文协议(Model Context Protocol, MCP)通过允许AI模型访问外部工具和数据源,弥合了这一差距。 FastAPI MCP是一个强大的工具,它可以通过最少的配置将您现有的FastAPI端点转换为MCP兼容的工具。 本…...
python课堂随记
11.15 连接符 namemcl print(我叫,name) print(我叫name)#连接符 age18 print(我叫name年龄str(age)) #连接符需要数据类型相同 11.17随记 除法运算神奇 8/5 #1.6 8//5 #1 -8/5 #-1.6 -8//5 #-2 ##次方表示—两个** 3的27次方 27的3次方 小结 程序的书写&…...
Agent安装-Beszel 轻量级服务器监控平台
docker-compose安装 beszel-agent 安装 docker-compose 配置文件 services:beszel-agent:image: henrygd/beszel-agent:latestcontainer_name: beszel-agentrestart: unless-stoppednetwork_mode: hostvolumes:- ./beszel_socket:/beszel_socket- /var/run/docker.sock:/var…...
算法—选择排序—js(场景:简单实现,不关心稳定性)
选择排序原理:(简单但低效) 每次从未排序部分选择最小元素,放到已排序部分的末尾。 特点: 时间复杂度:O(n) 空间复杂度:O(1) 不稳定排序 // 选择排序 function selectionSort(arr) {for (let …...
websocket和SSE学习记录
websocket学习记录 websocket使用场景 即时聊天在线文档协同编辑实施地图位置 从开发角度来学习websocket开发 即使通信项目 通过node建立简单的后端接口,利用fs, path, express app.get(*, (req, res) > {const assetsType req.url.split(/)[…...
【统计分析120】统计分析120题分享
1-30 判断题 数学模型 指的是通过抽象、简化现实世界的某些现象,利用数学语言来描述他们的结构和行为,做出一些必要的假设,运用适当的数学工具,得到一个数学结论 数学模型:指的是通过抽象、简化现实世界的某些现象&am…...
【计量地理学】实验四 主成分分析与莫兰指数
一、实验内容 (一) 某地区35个城市2004年的7项经济统计指标数据见(数据中的“题目1”sheet)。 (1)试用最短距离聚类法对35个城市综合实力进行系统聚类分析,并画出聚类谱系图: 在此次实验内容…...
手写call,bind,apply
foo.Mycall(obj,1,2,3) Function.prototype.Mycallfunction(target,...args){if(typeof this!function){throw new TypeError(this is not a function)}// 判断target是否是对象if(targetnull||targetundefined){targetwindow}if(typeof target!object){targetObject(target)}/…...
【读书笔记·VLSI电路设计方法解密】问题64:什么是芯片的功耗分析
低功耗设计是一种针对VLSI芯片功耗持续攀升问题的设计策略。随着工艺尺寸微缩,单颗芯片可集成更多元件,导致功耗相应增长。更严峻的是,现代芯片工作频率较二十年前大幅提升,而功耗与频率呈正比关系。因此,芯片功耗突破…...
Ubuntu18.04安装Qt5.12
本文介绍了在Ubuntu18.04环境下安装QT QT5.12相关安装包下载地址 https://download.qt.io/archive/qt/5.12/ Linux系统下Qt的离线安装包以.run结尾 (sudo apt-get install open-vm-tools open-vm-tools-desktop解决无法paste的问题) 安装 1.cd命令 终端进入对应的文件夹下面 2.…...
【SpringBoot】99、SpringBoot中整合RabbitMQ实现重试功能
最近在做一个项目,需要使用 MQ 实现重试功能,在这里给各位分享一下。 1、整合 RabbitMQ <!-- rabbitmq消息队列 --> <dependency><groupId>org.springframework.boot</groupId><...
max31865典型电路
PT100读取有很多种方案,常用的惠斯通电桥,和专用IC max31865 。 电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD,镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围&#x…...
每日一道leetcode(补充版)
1004. 最大连续1的个数 III - 力扣(LeetCode) 题目 给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数 。 示例 1: 输入:nums [1,1,1,0,0,0,1…...
数据通信学习笔记之OSPF的区域
OSPFArea 用于标识一个 OSPF 的区域 区域是从逻辑上将设备划分为不同的组,每个组用区域号 (Area ID)来标识 OSPF 的区域 ID 是一个 32bit 的非负整数,按点分十进制的形式(与 IPV4 地址的格式一样)呈现,例如 Area0.0.0.1。 为了简便起见&#…...
5 提示词工程指南-计划与行动
5 提示词工程指南-计划与行动 计划与行动 Cline 有两种模式: Plan 描述目标和需求、提问与回答、讨论、抽象项目的各个方面、确定技术路线、确定计划 计划与确认相当于架构师,不编写代码Act 按计划编写代码 按照计划编码Plan 模式的本质是构建实际编码前的上下文,Act 的本…...
如何一键批量删除多个 Word 文档中的页眉和页脚
在工作中,许多 Word 文档的页眉页脚中包含公司名称、Logo、电话等信息,用于对外宣传。但有时我们需要批量删除这些页眉页脚信息,尤其当信息有误时,手动逐个删除会增加工作量,导致效率低下。本文将介绍一种便捷的方法&a…...
QCustomPlot中自定义图层
QCustomPlot 使用图层(QCPLayer)系统来组织绘图元素的绘制顺序和可见性。下面详细介绍如何自定义图层并将可绘制对象关联到特定图层。 1. 理解 QCustomPlot 的图层系统 QCustomPlot 的图层系统具有以下特点: 图层按顺序排列,后绘制的图层会覆盖前面的图…...
Dubbo QoS操作手册
QOS 操作手册 QoS概述 启动参数 参数说明默认值qos-enable是否启动Qostrueqos-port启动Qos绑定的端口22222qos-accept-foreign-ip是否运行远程访问falseqos-accept-foreign-whitelist支持的远端地址ip地址(段)无qos-anonymous-access-permission-lefe…...
-实用类-
1. API是什么 2.什么是枚举 !有点类似封装! 2.包装类 注意: 1.Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false 2.当包装类构造方法参…...
Apache Parquet 文件组织结构
简要概述 Apache Parquet 是一个开源、列式存储文件格式,最初由 Twitter 与 Cloudera 联合开发,旨在提供高效的压缩与编码方案以支持大规模复杂数据的快速分析与处理。Parquet 文件采用分离式元数据设计 —— 在数据写入完成后,再追加文件级…...
Spring 事务管理核心机制与传播行为应用
Spring 事务详解 一、Spring 事务简介 Spring 事务管理基于 AOP(面向切面编程)实现,通过 声明式事务(注解或 XML 配置)统一管理数据库操作,确保数据一致性。核心目标:保证多个数据库操作的原子…...
从零开始解剖Spring Boot启动流程:一个Java小白的奇幻冒险之旅
大家好呀!今天我们要一起探索一个神奇的话题——Spring Boot的启动流程。我知道很多小伙伴一听到"启动流程"四个字就开始头疼,别担心!我会用最通俗易懂的方式,带你从main()方法开始,一步步揭开Spring Boot的…...
集合框架(重点)
1. 什么是集合框架 List有序插入对象,对象可重复 Set无序插入对象,对象不可重复(重复对象插入只会算一个) Map无序插入键值对象,键只唯一,值可多样 (这里的有序无序指的是下标,可…...
IPv4地址分类与常用网络地址详解
常见的 IPv4 地址分类: 1. A 类地址(Class A) 范围:0.0.0.0 到 127.255.255.255 默认子网掩码:255.0.0.0 或 /8 用途:通常用于大型网络,例如大型公司、组织。 特点: 网络地址范围…...
