云计算百科
云计算领域专业知识百科平台

Java--数据类型加运算符

Java–数据类型加运算符

    • 数据类型
    • 类型转换的要点
      • 隐式类型提升(Type Promotion)
      • 显式类型转换(Type Casting)
      • 数据丢失和类型安全(Data Loss and Type Safety)
      • 编译器错误(Compiler Errors)
    • 位运算和逻辑运算
      • 逻辑运算符
      • 位运算符
    • 最后两个注意点

​ Java 源代码文件,通常以 .java 扩展名结尾,包含了用 Java 编程语言编写的类定义和方法实现。为了将这些源代码转换成 JVM 可以理解和执行的格式,需要使用 Java 编译器( javac )进行编译。编译完成后,生成的 .class 文件包含了 JVM 可以理解的字节码。这些字节码文件可以在任何安装了 JVM 的系统上执行,这是 Java 语言“一次编写,到处运行”(Write Once, Run Anywhere,WORA)特性的基础。

#mermaid-svg-kcycvKpQZClRukpY {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kcycvKpQZClRukpY .error-icon{fill:#552222;}#mermaid-svg-kcycvKpQZClRukpY .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-kcycvKpQZClRukpY .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-kcycvKpQZClRukpY .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-kcycvKpQZClRukpY .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-kcycvKpQZClRukpY .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-kcycvKpQZClRukpY .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-kcycvKpQZClRukpY .marker{fill:#333333;stroke:#333333;}#mermaid-svg-kcycvKpQZClRukpY .marker.cross{stroke:#333333;}#mermaid-svg-kcycvKpQZClRukpY svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-kcycvKpQZClRukpY .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-kcycvKpQZClRukpY .cluster-label text{fill:#333;}#mermaid-svg-kcycvKpQZClRukpY .cluster-label span{color:#333;}#mermaid-svg-kcycvKpQZClRukpY .label text,#mermaid-svg-kcycvKpQZClRukpY span{fill:#333;color:#333;}#mermaid-svg-kcycvKpQZClRukpY .node rect,#mermaid-svg-kcycvKpQZClRukpY .node circle,#mermaid-svg-kcycvKpQZClRukpY .node ellipse,#mermaid-svg-kcycvKpQZClRukpY .node polygon,#mermaid-svg-kcycvKpQZClRukpY .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-kcycvKpQZClRukpY .node .label{text-align:center;}#mermaid-svg-kcycvKpQZClRukpY .node.clickable{cursor:pointer;}#mermaid-svg-kcycvKpQZClRukpY .arrowheadPath{fill:#333333;}#mermaid-svg-kcycvKpQZClRukpY .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-kcycvKpQZClRukpY .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-kcycvKpQZClRukpY .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-kcycvKpQZClRukpY .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-kcycvKpQZClRukpY .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-kcycvKpQZClRukpY .cluster text{fill:#333;}#mermaid-svg-kcycvKpQZClRukpY .cluster span{color:#333;}#mermaid-svg-kcycvKpQZClRukpY div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-kcycvKpQZClRukpY :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

编译 javac

运行java

.java

.class 字节码文件

JVM

数据类型

#mermaid-svg-rAseG3yL6sxJXjJ3 {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rAseG3yL6sxJXjJ3 .error-icon{fill:#552222;}#mermaid-svg-rAseG3yL6sxJXjJ3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rAseG3yL6sxJXjJ3 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-rAseG3yL6sxJXjJ3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rAseG3yL6sxJXjJ3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rAseG3yL6sxJXjJ3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rAseG3yL6sxJXjJ3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rAseG3yL6sxJXjJ3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rAseG3yL6sxJXjJ3 .marker.cross{stroke:#333333;}#mermaid-svg-rAseG3yL6sxJXjJ3 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rAseG3yL6sxJXjJ3 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-rAseG3yL6sxJXjJ3 .cluster-label text{fill:#333;}#mermaid-svg-rAseG3yL6sxJXjJ3 .cluster-label span{color:#333;}#mermaid-svg-rAseG3yL6sxJXjJ3 .label text,#mermaid-svg-rAseG3yL6sxJXjJ3 span{fill:#333;color:#333;}#mermaid-svg-rAseG3yL6sxJXjJ3 .node rect,#mermaid-svg-rAseG3yL6sxJXjJ3 .node circle,#mermaid-svg-rAseG3yL6sxJXjJ3 .node ellipse,#mermaid-svg-rAseG3yL6sxJXjJ3 .node polygon,#mermaid-svg-rAseG3yL6sxJXjJ3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rAseG3yL6sxJXjJ3 .node .label{text-align:center;}#mermaid-svg-rAseG3yL6sxJXjJ3 .node.clickable{cursor:pointer;}#mermaid-svg-rAseG3yL6sxJXjJ3 .arrowheadPath{fill:#333333;}#mermaid-svg-rAseG3yL6sxJXjJ3 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rAseG3yL6sxJXjJ3 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rAseG3yL6sxJXjJ3 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-rAseG3yL6sxJXjJ3 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-rAseG3yL6sxJXjJ3 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rAseG3yL6sxJXjJ3 .cluster text{fill:#333;}#mermaid-svg-rAseG3yL6sxJXjJ3 .cluster span{color:#333;}#mermaid-svg-rAseG3yL6sxJXjJ3 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rAseG3yL6sxJXjJ3 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}

数据类型

基本数据类型

引用数据类型

整数

浮点类型

字符类型

布尔类型

数组 类 接口 字符串……

数据类型关键字内存占用 (字节)范围
byte 1 -128 到 127
short 2 -32,768 到 32,767
int 4 -2,147,483,648 到 2,147,483,647
long 8 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
float 4 单精度 32 位 IEEE 754
double 8 双精度 64 位 IEEE 754
char 2 U+0000 到 U+FFFF
boolean 1 true 或 false

包装类只是针对基本的数据类型 对应的类类型

类型转换的要点

​ 在 Java 编程语言中,当进行算术运算时,较小的数据类型(如short和byte)会被隐式提升(upcast)到较大的数据类型(如int)以避免数据丢失。这种隐式类型转换被称为类型提升(type promotion)。然而,在将计算结果赋值回较小的数据类型变量时,需要进行显式类型转换(explicit type casting),以确保数据类型的兼容性和防止潜在的数据丢失。

隐式类型提升(Type Promotion)

在 Java 中,当不同类型的操作数参与算术运算时,较小的数据类型会自动转换为较大的数据类型。例如,当byte或short类型的变量与int类型的变量进行运算时,byte或short类型的变量会被提升为int类型。这种提升是自动的,不需要程序员显式进行类型转换。

显式类型转换(Type Casting)

在将运算结果赋值回较小的数据类型变量时,必须进行显式类型转换。这是因为,如果没有显式转换,较大的数据类型(如int)可能包含较小的数据类型(如byte或short)无法表示的值。直接赋值会导致编译器报错,因为这种操作可能会导致数据丢失。

例如,如果一个int类型的变量存储的值超出了byte类型变量的表示范围,直接赋值将导致编译错误。为了解决这个问题,可以使用显式类型转换,如下所示:

byte b = 10;
int i = 200;
i = i + b; // 自动类型提升:b 被提升为 int 类型
b = (byte) i; // 显式类型转换:将 i 转换为 byte 类型

在这个例子中,b和i相加时,b被隐式提升为int类型。但是,当尝试将结果赋值回b时,必须显式地将i转换为byte类型,以确保结果在byte类型的范围内。

数据丢失和类型安全(Data Loss and Type Safety)

在进行显式类型转换时,必须小心处理可能的数据丢失。如果转换后的值超出了目标类型的表示范围,可能会导致数据丢失或不可预测的行为。因此,程序员有责任确保类型转换是安全的,并且不会导致数据丢失。

编译器错误(Compiler Errors)

如果不进行适当的类型转换,编译器会报错,因为 Java 是一种静态类型语言(statically-typed language),它要求在编译时就确定所有变量和表达式的类型。这种类型检查机制有助于在编译时捕获潜在的错误,从而提高程序的可靠性和稳定性。

位运算和逻辑运算

在Java中,位运算和逻辑运算是两种不同的运算类型,它们在底层对数据进行操作。以下是Java中支持的位运算符和逻辑运算符,以及如何使用它们的方法:

逻辑运算符

逻辑运算符用于执行逻辑比较,并返回布尔值(true或false)。

• &&(逻辑与):当且仅当两个操作数都为true时,结果才为true。

• ||(逻辑或):如果两个操作数中至少有一个为true,则结果为true。

• !(逻辑非):反转操作数的布尔值。

示例方法:

public class LogicalOperations {

public static boolean andOperation(boolean a, boolean b) {
return a && b;
}

public static boolean orOperation(boolean a, boolean b) {
return a || b;
}

public static boolean notOperation(boolean a) {
return !a;
}

public static void main(String[] args) {
System.out.println(andOperation(true, false)); // 输出 false
System.out.println(orOperation(true, false)); // 输出 true
System.out.println(notOperation(true)); // 输出 false
}
}

位运算符

位运算符对整数的二进制位进行操作。 (黄色为简易口诀)

• &(位与):对两个操作数的每一位执行逻辑与操作。 有0则0,同1为1

• |(位或):对两个操作数的每一位执行逻辑或操作。 有1则1,同0为0

• ^(位异或):对两个操作数的每一位执行逻辑异或操作。 相同为0,不同为1

• ~(位非):反转操作数的所有位。

• <<(左移):将操作数的位向左移动指定的位数。

• >>(右移):将操作数的位向右移动指定的位数。

• >>>(无符号右移):将操作数的位向右移动指定的位数,左边用0填充。

示例方法:

public class BitwiseOperations {

public static int bitwiseAnd(int a, int b) {
return a & b;
}

public static int bitwiseOr(int a, int b) {
return a | b;
}

public static int bitwiseXor(int a, int b) {
return a ^ b;
}

public static int bitwiseNot(int a) {
return ~a;
}

public static int leftShift(int a, int shift) {
return a << shift;
}

public static int rightShift(int a, int shift) {
return a >> shift;
}

public static int unsignedRightShift(int a, int shift) {
return a >>> shift;
}

public static void main(String[] args) {
System.out.println(bitwiseAnd(10, 7)); // 输出 2
System.out.println(bitwiseOr(10, 7)); // 输出 15
System.out.println(bitwiseXor(10, 7)); // 输出 13
System.out.println(bitwiseNot(10)); // 输出 -11
System.out.println(leftShift(10, 2)); // 输出 40
System.out.println(rightShift(10, 2)); // 输出 2
System.out.println(unsignedRightShift(10, 2)); // 输出 1073741822
}
}

在这些示例方法中,我们定义了各种位运算和逻辑运算,并在main方法中提供了测试用例。您可以根据需要调用这些方法来执行相应的运算。请注意,位运算符只能用于整数类型(byte、short、int、long),而逻辑运算符只能用于布尔类型(boolean)。

没有 <<< (无符号符号左移[不存在]) 因为有无符号都是用右边用0来补充,<<<会增加复杂度,带来不必要的麻烦,故不存在。

最后两个注意点

最后要注意的两个点是三目运算符和String字符的拼接:

1.三目运算符所产生的值需要接收,否则编译器会报错

2.String拼接的时候的顺序是从左到右,

32+12 +"HelloWorld" //结果是"44HelloWorld"

"HelloWorld"+32+12 //结果是"HelloWorld44"

赞(0)
未经允许不得转载:网硕互联帮助中心 » Java--数据类型加运算符
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!