变量与数据类型
本笔记所有建立在会 C/C++ 以及 Python 基本语法的基础上。
Java 中的基本数据类型:
- 整数类型:byte,short,int,long
- 浮点数类型:float,double
- 字符类型:char
- 布尔类型:boolean
可以看出,除了布尔型,其余和 C/C++ 一样,下文主要探讨 C/C++ 中有差异的类型。
byte
计算机中,一个字节是 8 个 bit
下面是 java 中基本数据类型的占用字节数图片(一个方格表示一个字节)
图片:摘自廖雪峰的官网
可以总结出规律:
short
是两个字节,short
~long
依次扩大两倍。
float
和 int
一致,float
~double
也依次扩大两倍。
char
是两个字节。
同时也可以看出相同性质,但是不同长度的数据类型之间字节数相邻之间相差两倍。
int
// int 类型的一些写法
public class Hello {
public static void main(String[] args) {
int i1 = 2147483647;
int i2 = -2147483647;
int i3 = 2_000_000_000; // 添加下划线便于识别
int i4 = 0xff0000; // 十六进制表示方法
int i5 = 0b1000000000; // 二进制表示的 512
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
System.out.println(i5);
}
}
long
需要说明的是,Java 中直接使用 long
/ long long
public class Hello {
public static void main(String[] args) {
long n1 = 9000000000000000000L; // 需要加 L
long n2 = 900; // 没有加 L,本质是右边为整型并赋值给左边
System.out.println(n1);
System.out.println(n2);
}
}
注意:不能将长的赋值给段的否则会溢出:
public class Hello {
public static void main(String[] args) {
long n1 = 9000000000000000000L; // 需要加 L
long n2 = 900; // 没有加 L,本质是右边为整型并赋值给左边
int n3 = 900L;
System.out.println(n1);
System.out.println(n2);
}
}
报错提示:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from long to int
at Hello.main(Hello.java:6)
浮点型(float/double)
Java 中
- float后跟f,形式如
3.14f
- double用点分隔,形式如
2.14
或者2.0
所以这些写法是正确的:
public class Hello {
public static void main(String[] args) {
float f1 = 3.14f;
float f2 = 3.14e38f; // 表示科学计数法3.14*10^38
double d1 = 1.14e308;
double d2 = -1.14e308;
double d3 = -1.14e-308;
}
}
特别说明,不要这样写
float f1 = 3.0;
布尔类型
在 Java 中用 boolean
来进行申明:
public class Hello {
public static void main(String[] args) {
boolean my_bool = true;
System.out.println(my_bool);
}
}
Char
字符类型和C中一致
引用类型
除了上述基本类型的变量,其余类型都是引用类型,例如最常用的 String 类型。
代码:String s = "你好吗?";
常量
Java 中用 final
而不是 const
来表示常量
var 关键字
比较有意思的是,Java 和 C/C++ 不同,但是和 JavaScript 一样,也有 var
这个关键字,刚学习 Java 的我,知道这一点还是感觉很惊喜的。众所周知,var 关键字是用于偷懒的一个糖果语法。
public class Hello {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
var sb2 = new StringBuilder(); // 可以使用 var 来进行偷懒,虽然偷懒了没多少,但是,爽!
}
}
变量的作用范围
在 Java 中,很多语句用 {} 扩起来,比如一些控制语句,判断循环等。对于这个定义我是第一次
if (...) {
...
while (...) {
...
if (...) {
...
}
...
}
...
}
变量的作用范围:
public class Hello {
public static void main(String[] args) {
{
String s = "Hello?";
System.out.println(s);
} // 变量 s 的作用范围到这里结束
// System.out.println(s); // 会报错
}
}
对于变量的作用域有一个原则,那就是尽量将变量的作用域定义在最小化,及时回收变量,避免空闲占用资源。