学习任何语言,第一步就是学习该门语言的基本数据结构,然后在此基础上进行扩展。
java的基本数据类型有 int, byte, short, long, float, double, boolean, char,使用类型声明变量然后进行赋值,这个跟c类似, 基本数据类型就是CPU可以直接运算的类型。
public class HelloWorld {
public static void main(String[] args) {
int m = 1;
System.out.println(m);
}
}
接下来分析一下这个值的传递过程
public class HelloWorld {
public static void main(String[] args) {
int m = 1;
int x = m;
x = 100;
System.out.println(m); // 1
System.out.println(x); // 100
}
}
首先我们可以看到,在对m进行初始化是,JVM在内存中为m分配了一个存储单元,然后存储单元保存的数据是1,接下来x进行初始化时,又会重新分配一个存储单元,并将存储单元对应的数据填入,然后对x进行重新赋值,因此x现在的存储单元对应的值就是100
首先我么来看一下整型类型,各整型类型所占内存空间如下:
byte: 1字节,范围:-128~127
short:2字节,范围:-32768~32767
int:4字节,范围:-2147483648 ~ 2147483647
long:8字节,范围:-9223372036854775808 ~ 9223372036854775807
public class HelloWorld {
public static void main(String[] args) {
// long y = 2_147_483_648; // Error:(3, 18) java: 整数太大
long x = 2_147_483_64;
long m = 1_000_000_000_000_000L;
System.out.println(x); // 2147483647
System.out.println(m); // 1000000000000000
}
}
例如上述在进行定义长整型时,_是为了更方便看清楚这是多大的数字,就是千位分隔符号“,”,另外我们也可以看出,当这个数字范围在int范围之间时,可以不用加后面的L符号,但超出范围之后,必须加上,否则会报错。
接下来,看一下浮点数 float, double
float:4字节,最大范围是3.4*10^38
double:8字节,最大输出可为1.79*10^308
接下来我们看一下这两种值的赋值情况:
- float的精度是8位,他只能保留8位有效数值
- double的精度是17位,他只能保留17位的有效数值
- float进行赋值时,后面必须跟f否则会报错
- double后面不需要跟f,如果跟着f就是把float类型数值转化为double类型,因此在用flaot转化为整型的时候,后面会发生变化
- 而对double来讲,输出格式默认转化位科学技术,并只保留17位有效数值,剩余的会切掉。
public class HelloWorld {
public static void main(String[] args) {
// float x = 1.123456789; // Error:(4, 19) java: 不兼容的类型: 从double转换到float可能会有损失
float x = 1234.123456789f;
double y1 = 1234.123456789f;
double y2 = 1234567890.1234567;
double y3 = 1234567890.1234567890;
System.out.println(x); // 1234.1234
System.out.println(y1); // 1234.1234130859375
System.out.println(y2); // 1.2345678901234567E9
System.out.println(y3); // 1.2345678901234567E9
}
}
所以以后想要表示比较大的数值,还是尽量用科学计数把
布尔类型
boolean就是true,false或者关系运算的结构,按道理来讲只需要一个字节,但是jvm通常在内部会把boolean表示为4字节整数,java语言对布尔类型存储没有做规定
public class HelloWorld {
public static void main(String[] args) {
boolean x = true;
boolean y1 = false;
boolean y2 = 1 > 2;
boolean y3 = 1 * 2 == 2;
System.out.println(x); // true
System.out.println(y1); // false
System.out.println(y2); // false
System.out.println(y3); // true
}
}
字符类型
字符类型声明 char
char占2个字节,char保存的是unicode字符
注意声明char类型需要用单引号,注意单引号跟双引号的区别,双引号是字符串类型,另外只能放一个字符,否则就会报错
public class HelloWorld {
public static void main(String[] args) {
char x = '我';
// char x1 = '我在中国'; // Error:(4, 19) java: 未结束的字符文字
char y = 'a';
//char y1 = 'i love china'; // Error:(6, 19) java: 未结束的字符文字
System.out.println(x); // 我
System.out.println(y); // a
}
}
常量
所谓常量就是一旦定义就不能进行更改的值,只需要在定义变量的时候在前面加一个final修饰符
public class HelloWorld {
public static void main(String[] args) {
final char x;
x = 's';
// x= 'd'; // Error:(5, 9) java: 可能已分配变量x
System.out.println(x); // s
}
}
从例子中也可以看出,常量可以先进行声明,然后再进行赋值,但能且只能赋值一次
var 关键字
java提供了var关键字,也就是说你可以不用声明变量的属性,直接var一下,然后编译器就会自动推断出你这个变量的属性
public class HelloWorld {
public static void main(String[] args) {
var x = 1;
System.out.println(x); // 1
}
}
变量的作用域,这个就是看你在哪里声明的,js以前还有变量提升,现在也正在逐步废弃,因此这个作用域如果全局声明的就是全局,如果在函数内部,就是函数内部,如果在花括号里面,作用域就是在花括号里,基本所有的编程变量作用域都差不多。
注意基本类型只有上述提到的这些,对于String,数组属于引用类型,后面在谈