Java表达式2.0

news2025/4/21 13:46:57

1 .数据类型转换

自动类型转换的规则

自动类型转换遵循一定的规则,这些规则确保了转换的合理性和安全性。以下是自动类型转换的主要规则:

  1. 容量小的类型自动转换为容量大的类型
    Java中,数据类型的容量从小到大依次为:byteshortintlongfloatdouble。当进行算术运算或赋值操作时,如果操作数的类型不同,系统会自动将容量小的类型转换为容量大的类型,以确保运算的正确性和数据的完整性。

  2. 操作数为double型时的转换规则
    如果表达式中有一个操作数是double类型,那么整个表达式的结果会被提升为double类型。这是因为double类型具有最高的精度和最大的容量,能够容纳其他类型的数据,从而避免了精度丢失。

  3. 操作数为float型时的转换规则
    如果表达式中有一个操作数是float类型,那么整个表达式的结果会被提升为float类型。这是因为float类型比intlong等整数类型具有更高的精度,但比double类型稍低。

  4. 操作数为long型时的转换规则
    如果表达式中有一个操作数是long类型,而没有floatdouble类型的操作数,那么整个表达式的结果会被提升为long类型。这是因为long类型比int类型具有更大的范围,能够容纳更大的整数值。

示例与解释

以下是一些具体的示例,帮助理解自动类型转换的规则:

示例1:操作数为double
double result = 10 + 3.5;
  • 在这个表达式中,10int类型,3.5double类型。

  • 根据自动类型转换规则,int类型的10会被自动转换为double类型,然后与3.5进行加法运算。

  • 最终,整个表达式的结果是13.5,并且结果的类型是double

示例2:操作数为float
float result = 10 + 3.5f;
  • 在这个表达式中,10int类型,3.5ffloat类型。

  • 根据自动类型转换规则,int类型的10会被自动转换为float类型,然后与3.5f进行加法运算。

  • 最终,整个表达式的结果是13.5f,并且结果的类型是float

示例3:操作数为long
long result = 10L + 5;
  • 在这个表达式中,10Llong类型,5int类型。

  • 根据自动类型转换规则,int类型的5会被自动转换为long类型,然后与10L进行加法运算。

  • 最终,整个表达式的结果是15L,并且结果的类型是long

示例4:多个操作数的类型提升
double result = 10 + 5L + 3.5f;
  • 在这个表达式中,10int类型,5Llong类型,3.5ffloat类型。

  • 首先,int类型的10会被自动转换为long类型,与5L进行加法运算,结果是15L

  • 然后,15L会被自动转换为float类型,与3.5f进行加法运算,结果是18.5f

  • 最后,由于表达式中存在double类型的操作数,18.5f会被自动转换为double类型,最终结果是18.5,并且结果的类型是double

自动类型转换的意义

自动类型转换在Java中具有重要的意义,它不仅简化了代码的编写,还提高了代码的可读性和可维护性。通过自动类型转换,开发者可以避免显式地进行类型转换,从而减少代码的冗余和出错的可能性。同时,自动类型转换还确保了数据在转换过程中的安全性和准确性,使得开发者可以更加专注于逻辑的实现,而不是类型转换的细节。

注意事项

尽管自动类型转换非常方便,但在某些情况下,开发者仍然需要注意以下几点:

  1. 精度丢失:虽然自动类型转换会尽量避免精度丢失,但在某些情况下,如将floatdouble转换为整数类型时,可能会导致精度丢失。

  2. 范围溢出:如果转换后的类型范围不足以容纳原始数据,可能会导致范围溢出。例如,将一个非常大的long值转换为int类型时,可能会导致数据丢失或错误。

  3. 显式类型转换:在某些情况下,如果需要将容量大的类型转换为容量小的类型,需要使用显式类型转换(强制类型转换),并注意可能引发的异常。

  • 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的 那种数据类型,再进行计算。

    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
++自增:操作数的值增加1B++ 或 ++B 等于 21
--自减:操作数的值减少1B-- 或 --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 1100
        int b = 13;                 // 0000 1101
        System.out.println(a&b);    // 0000 1100
        System.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;

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

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

相关文章

JavaScript 一维数组转二维数组

题目描述&#xff1a; <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 置&#xff0c;帐户&#xff0c;登录选项&#xff0c;密码。 输入当前密码后&#xff0c;直接下一步。 再次重启&#xff0c;就会发现不需要密码了。

开源项目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(场景:简单实现,不关心稳定性)

选择排序原理&#xff1a;&#xff08;简单但低效&#xff09; 每次从未排序部分选择最小元素&#xff0c;放到已排序部分的末尾。 特点&#xff1a; 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O(1) 不稳定排序 // 选择排序 function selectionSort(arr) {for (let …

【统计分析120】统计分析120题分享

1-30 判断题 数学模型 指的是通过抽象、简化现实世界的某些现象&#xff0c;利用数学语言来描述他们的结构和行为&#xff0c;做出一些必要的假设&#xff0c;运用适当的数学工具&#xff0c;得到一个数学结论 数学模型&#xff1a;指的是通过抽象、简化现实世界的某些现象&am…

【计量地理学】实验四 主成分分析与莫兰指数

一、实验内容 &#xff08;一&#xff09; 某地区35个城市2004年的7项经济统计指标数据见&#xff08;数据中的“题目1”sheet&#xff09;。 &#xff08;1&#xff09;试用最短距离聚类法对35个城市综合实力进行系统聚类分析&#xff0c;并画出聚类谱系图: 在此次实验内容…

手写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芯片功耗持续攀升问题的设计策略。随着工艺尺寸微缩&#xff0c;单颗芯片可集成更多元件&#xff0c;导致功耗相应增长。更严峻的是&#xff0c;现代芯片工作频率较二十年前大幅提升&#xff0c;而功耗与频率呈正比关系。因此&#xff0c;芯片功耗突破…

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.…

max31865典型电路

PT100读取有很多种方案&#xff0c;常用的惠斯通电桥&#xff0c;和专用IC max31865 。 电阻温度检测器(RTD)是一种阻值随温度变化的电阻。铂是最常见、精度最高的测温金属丝材料。铂RTD称为PT-RTD&#xff0c;镍、铜和其它金属亦可用来制造RTD。RTD具有较宽的测温范围&#x…

数据通信学习笔记之OSPF的区域

OSPFArea 用于标识一个 OSPF 的区域 区域是从逻辑上将设备划分为不同的组&#xff0c;每个组用区域号 (Area ID)来标识 OSPF 的区域 ID 是一个 32bit 的非负整数&#xff0c;按点分十进制的形式(与 IPV4 地址的格式一样)呈现&#xff0c;例如 Area0.0.0.1。 为了简便起见&#…

5 提示词工程指南-计划与行动

5 提示词工程指南-计划与行动 计划与行动 Cline 有两种模式: Plan 描述目标和需求、提问与回答、讨论、抽象项目的各个方面、确定技术路线、确定计划 计划与确认相当于架构师,不编写代码Act 按计划编写代码 按照计划编码Plan 模式的本质是构建实际编码前的上下文,Act 的本…

如何一键批量删除多个 Word 文档中的页眉和页脚

在工作中&#xff0c;许多 Word 文档的页眉页脚中包含公司名称、Logo、电话等信息&#xff0c;用于对外宣传。但有时我们需要批量删除这些页眉页脚信息&#xff0c;尤其当信息有误时&#xff0c;手动逐个删除会增加工作量&#xff0c;导致效率低下。本文将介绍一种便捷的方法&a…

QCustomPlot中自定义图层

QCustomPlot 使用图层(QCPLayer)系统来组织绘图元素的绘制顺序和可见性。下面详细介绍如何自定义图层并将可绘制对象关联到特定图层。 1. 理解 QCustomPlot 的图层系统 QCustomPlot 的图层系统具有以下特点&#xff1a; 图层按顺序排列&#xff0c;后绘制的图层会覆盖前面的图…

-实用类-

1. API是什么 2.什么是枚举 &#xff01;有点类似封装&#xff01; 2.包装类 注意&#xff1a; 1.Boolean类构造方法参数为String类型时&#xff0c;若该字符串内容为true(不考虑大小写)&#xff0c;则该Boolean对象表示true&#xff0c;否则表示false 2.当包装类构造方法参…

Spring 事务管理核心机制与传播行为应用

Spring 事务详解 一、Spring 事务简介 Spring 事务管理基于 AOP&#xff08;面向切面编程&#xff09;实现&#xff0c;通过 声明式事务&#xff08;注解或 XML 配置&#xff09;统一管理数据库操作&#xff0c;确保数据一致性。核心目标&#xff1a;保证多个数据库操作的原子…

集合框架(重点)

1. 什么是集合框架 List有序插入对象&#xff0c;对象可重复 Set无序插入对象&#xff0c;对象不可重复&#xff08;重复对象插入只会算一个&#xff09; Map无序插入键值对象&#xff0c;键只唯一&#xff0c;值可多样 &#xff08;这里的有序无序指的是下标&#xff0c;可…

IPv4地址分类与常用网络地址详解

常见的 IPv4 地址分类&#xff1a; 1. A 类地址&#xff08;Class A&#xff09; 范围&#xff1a;0.0.0.0 到 127.255.255.255 默认子网掩码&#xff1a;255.0.0.0 或 /8 用途&#xff1a;通常用于大型网络&#xff0c;例如大型公司、组织。 特点&#xff1a; 网络地址范围…