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"
评论前必须登录!
注册