常量的6个类别(与下文变量相区分,为不变的量):

  1. 字符串常量,“Hello”、“abc”、“123”
  2. 整数常量,“100”、“-250”、“0”
  3. 浮点数常量,“-3.14”、“0.0”、“2.5”
  4. 字符常量,‘A’、‘9’、‘中’(单引号中必须有且只有一个字符)
  5. 布尔常量,true、false
  6. 空常量,null(即没有任何数据,不能直接打印输出)

基本数据类型

基本数据类型包括(8种int 、double 分别是整数类型和浮点类型中的默认数据类型):

数据类型(内存占用 / 字节)

取值范围

字节型 byte(1)

-128 到 127

短整型 short(2)

-32768 到 32767

整型 int(4)

-231 到 231-1

长整型 long(8)

-263 到 263-1

单精度浮点数 float(4)

1.4013E-45 到 3.4028E+38

双精度浮点数 double(8)

49E-324 到 1.7911E+308

字符型 char(2)

0 到 65535

布尔类型 boolean(1)

true、false

前四种统称为为整数类型,float和double统称浮点数类型。

数据类型还有一类叫:引用数据类型。在之后学,包括字符串、数组、类、接口、Lambda…

注意事项:

  • 浮点型可能只是个近似值,非精确值
  • 取值范围与内存不一定相关,float(4字节)取值范围比long(8字节)更广泛
  • 只写100是int,100L是long,只写3.14是double,3.14F是float。(大小写皆可,推荐大)
  • 字符串是引用类型,不是基本类型,字符串的加法“+”表示连接操作

例1:
str1=java;
System.out.println(str1+20+30);
结果为java2030,因为先执行了第一个“+”号
System.out.println(str1+(20+30));
结果为java50,改变了优先级,小括号是个神奇的东西。

使用方法

数据类型 变量名=数据值;(当然也可以先创建再赋值)
int num1=6;
float num2=3.14F;(非默认类型赋值带上后缀,如L、F)
char num3=‘中’;
boolean var=true;

注意事项:

  • 变量赋值后赋值才可打印输出
  • 在作用域内使用变量(从该变量定义直到所属大括号之间)
  • 多个变量赋值可写为:int a=10,b=20,c=30;

类型转换

  1. 自动类型转换(隐式)要求:数值范围从小到大,例如以下操作会发生自动转换:
    long num1=100; (从int变为long)
    double num2=2.5F;(从float变成double)
    float num3=30L;(从long变成float,结果为30.0)
  2. 强制类型转换(显式,不推荐,方法是直接在右侧数值前加(),里面填要转的类型,如下面例子中的int):
    int num4=(int)100L;(没有问题)
    int num5=(int)6000000000L;(结果为1705032704,数据溢出)
    int num6=(int)3.5;(结果为3,小数直接舍弃,精度损失)

注意事项:

1.byte/short/char可数学运算,首先都会被转成int类型,再计算:

例1:
char num3=‘A’;System.out.println(num3)的结果为A
char num3=‘A’;System.out.println(num3+1)的结果为66

例2:
byte num4=40;
byte num5=50;
byte result=num4+num5;
会发生精度损失,因为num4+num5是都被转为int后再计算的,应用int类型接收结果result


2.byte/short/char变量赋值时,如果右侧要赋的数值没有超过byte/short/char的范围,javac编译器会自动地、隐式地为代码补上(byte)/(short)/(char):

例1:
char num1=65;
System.out.println(num1);
结果为A,相当于65前有个隐形的(char),从int隐式地变为了char


3.编译器带有常量优化功能,如代码中有short result=1+2,则编译器直接把3赋给result,而不是在之后执行过程中耗费相应的计算资源