1. +的优先级大于==
2. float默认值是0.0f
3. java中访问权限问题
4. 数据类型所占字节大小
在 Java 中,各种基本数据类型的大小是固定的,不依赖于具体的操作系统或硬件架构。以下是 Java 中所有基本数据类型的大小和表示范围:
1. 整数类型
数据类型 | 大小(字节) | 大小(位) | 范围 |
---|---|---|---|
byte | 1 | 8 | -128 到 127 |
short | 2 | 16 | -32,768 到 32,767 |
int | 4 | 32 | -2,147,483,648 到 2,147,483,647 |
long | 8 | 64 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
2. 浮点数类型
数据类型 | 大小(字节) | 大小(位) | 精度 | 范围 |
---|---|---|---|---|
float | 4 | 32 | 大约 7 位十进制有效数字 | ±1.4E-45 到 ±3.4028235E38 |
double | 8 | 64 | 大约 15-16 位十进制有效数字 | ±4.9E-324 到 ±1.7976931348623157E308 |
3. 字符类型
数据类型 | 大小(字节) | 大小(位) | 范围 |
---|---|---|---|
char | 2 | 16 | 0 到 65,535 (Unicode) |
说明:Java 的 char
类型使用 Unicode 编码,占用 2 字节,支持所有语言的字符表示。
4. 布尔类型
数据类型 | 大小(字节) | 大小(位) | 范围 |
---|---|---|---|
boolean | 未明确规定 | 未明确规定 | true 或 false |
说明:
- 在 Java 中,
boolean
的大小未被明确规定,取决于 JVM 的实现。通常,一个布尔值占用 1 位,但 JVM 为了优化内存布局,可能会按字节或更大的单位存储多个布尔值。 - 只能表示两种值:
true
和false
。
总结表格
数据类型 | 大小(字节) | 大小(位) | 范围 / 精度 |
---|---|---|---|
byte | 1 | 8 | -128 到 127 |
short | 2 | 16 | -32,768 到 32,767 |
int | 4 | 32 | -2,147,483,648 到 2,147,483,647 |
long | 8 | 64 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 |
float | 4 | 32 | 精度大约 7 位十进制有效数字 |
double | 8 | 64 | 精度大约 15-16 位十进制有效数字 |
char | 2 | 16 | 0 到 65,535(Unicode) |
boolean | 未明确规定 | 未明确规定 | true 或 false |
扩展:对象引用类型的大小
- 引用类型(如
String
或自定义类的实例)的大小依赖于 JVM 和平台。 - 通常,32 位 JVM 中一个对象引用占用 4 字节,而 64 位 JVM 中占用 8 字节(可能启用指针压缩以优化内存)。
5. java中实例变量不需要初始化,局部变量必须初始化
在 Java 中,局部变量必须显式初始化后才能使用,否则编译器会报错。局部变量与类的成员变量(实例变量和静态变量)不同,后者会在声明时被自动初始化为默认值。
详细解释
1. 局部变量
- 局部变量是声明在方法、构造器或代码块中的变量。
- 特点:
- 存储在栈内存中。
- 没有默认值,因此必须显式初始化。
- 在使用之前,Java 编译器会检查是否进行了初始化。
public class Main {public static void main(String[] args) {int x; // 声明局部变量,但未初始化System.out.println(x); // 编译错误:变量 x 可能尚未初始化}
}
正确用法:
public class Main {public static void main(String[] args) {int x = 10; // 显式初始化System.out.println(x); // 正常输出:10}
}
2. 类的成员变量
- 包括实例变量和静态变量。
- 特点:
- 会被自动初始化为默认值。
- 默认值如下:
- 数值类型(如
int
,float
,double
等):0
或0.0
- 布尔类型:
false
- 引用类型:
null
- 数值类型(如
public class Main {int instanceVar; // 实例变量static int staticVar; // 静态变量public static void main(String[] args) {Main obj = new Main();System.out.println(obj.instanceVar); // 输出默认值:0System.out.println(staticVar); // 输出默认值:0}
}
3. 局部变量为什么不被自动初始化?
- Java 设计局部变量不自动初始化是为了避免程序逻辑中隐藏错误。
- 强制要求显式初始化可以帮助开发者在使用变量之前明确其值,减少潜在的逻辑错误。
4. 特殊情况:局部变量的延迟初始化
- 如果局部变量在后续某个条件中才初始化,只要在使用之前完成初始化即可。
public class Main {public static void main(String[] args) {int x; // 声明局部变量if (Math.random() > 0.5) {x = 10; // 条件初始化} else {x = 20; // 条件初始化}System.out.println(x); // 使用前确保 x 被初始化}
}
5. 局部变量和final
关键字
- 如果局部变量被声明为
final
,那么它必须在声明时或首次使用前被初始化,而且只能初始化一次。
public class Main {public static void main(String[] args) {final int x;x = 10; // 可以初始化一次System.out.println(x);// x = 20; // 编译错误:final 变量已被初始化}
}
总结
- 局部变量必须显式初始化,未初始化就使用会导致编译错误。
- 类的成员变量(实例变量和静态变量)会被自动初始化为默认值。
- 显式初始化局部变量可以增强代码的可读性和安全性。
5 round四舍五入计算方法:
round 表示”四舍五入”,算法为Math.floor(x+0.5) ,即将原来的数字加上 0.5 后再向下取整,所以 Math.round(11.5) 的结果为 12,Math.round(-11.5) 的结果为 -11。
6. java中所有异常类基类都是Throwable
7 与或非表示
在 Java 中,与、或、非是常见的逻辑运算符,用于进行布尔值的运算。它们分别是:
- 与运算符(AND):
&&
(逻辑与)和&
(位与) - 或运算符(OR):
||
(逻辑或)和|
(位或) - 非运算符(NOT):
!
(逻辑非)和~
(位非)
1. 逻辑与(AND)运算符
&&
:逻辑与(短路与)- 当两个条件都为
true
时,结果为true
;否则为false
。 - 具有“短路”特性:如果第一个条件为
false
,则不会再评估第二个条件,因为结果已经确定。
- 当两个条件都为
boolean a = true;
boolean b = false;
System.out.println(a && b); // 输出 false
&
:位与
- 对于布尔值,和
&&
相同,但没有短路效果。它会评估两个条件,即使第一个条件为false
。
boolean a = true;
boolean b = false;
System.out.println(a & b); // 输出 false
2. 逻辑或(OR)运算符
||
:逻辑或(短路或)- 当任意一个条件为
true
时,结果为true
;只有当两个条件都为false
时,结果才为false
。 - 具有“短路”特性:如果第一个条件为
true
,则不会再评估第二个条件。
- 当任意一个条件为
boolean a = true;
boolean b = false;
System.out.println(a || b); // 输出 true
|
:位或- 对于布尔值,和
||
相同,但没有短路效果。它会评估两个条件,即使第一个条件为true
。
- 对于布尔值,和
boolean a = true;
boolean b = false;
System.out.println(a | b); // 输出 true
3. 逻辑非(NOT)运算符
!
:逻辑非- 取布尔值的反值。
true
变false
,false
变true
。
- 取布尔值的反值。
boolean a = true;
System.out.println(!a); // 输出 false
4. 位非(NOT)运算符
~
:位非- 对整数进行按位取反,即每一位都进行反转。对于布尔值
true
和false
,它的用法通常不适用。
- 对整数进行按位取反,即每一位都进行反转。对于布尔值
int a = 5; // 二进制 101
System.out.println(~a); // 输出 -6,按位取反后,得到 11111111111111111111111111111010(二进制补码表示)
总结:
- 逻辑运算符(
&&
,||
,!
)通常用于布尔值的运算。 - 位运算符(
&
,|
,~
)用于按位操作整数,适用于二进制数值。
public class Main {public static void main(String[] args) {boolean a = true;boolean b = false;// 逻辑与System.out.println("a && b: " + (a && b)); // false// 逻辑或System.out.println("a || b: " + (a || b)); // true// 逻辑非System.out.println("!a: " + !a); // false// 位与int x = 5, y = 3; // x = 0101, y = 0011System.out.println("x & y: " + (x & y)); // 1 (0001)// 位或System.out.println("x | y: " + (x | y)); // 7 (0111)// 位非System.out.println("~x: " + (~x)); // -6 (补码反转,11111111111111111111111111111010)}
}