文章目录
一、数据类型
1. 数据类型分类
Java是一种强类型语言,每个变量都必须声明其数据类型。 Java的数据类型可分为两大类:基本数据类型(primitive data type)和引用数据类型(reference data type)。
2. 基本数据类型介绍
2.1 几种基本数据类型大小与范围
note: 单个boolean编译后用int类型代替,故占四个字节,boolean数组变异后用byte数组代替,故每个boolean占一个字节。
2.2 整数型
整型用于表示没有小数部分的数值,它允许是负数。整型的范围与运行Java代码的机器无关,这正是Java程序具有很强移植能力的原因之一。与此相反,C和C++程序需要针对不同的处理器选择最有效的整型。
四种进制的整型:
- 十进制整数,如:99, -500, 0
- 八进制整数,要求以 0 开头,如:015
- 十六进制数,要求 0x 或 0X 开头,如:0x15
- 二进制数,要求0b或0B开头,如:0b01110011
2.3 浮点型
带小数的数据在Java中称为浮点型。浮点型可分为float类型和double类型。
float与double:
float类型又被称作单精度类型,尾数可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。而double表示这种类型的数值精度约是float类型的两倍,又被称作双精度类型,绝大部分应用程序都采用double类型。浮点型常量默认类型也是double。
Java浮点类型常量有两种表示形式:
- 十进制数形式,例如:3.14 | 314.0 | 0.314
- 科学记数法形式,如314e2 | 314E2 | 314E-2
note:
浮点数不能直接比较,需要使用java.math包下的bigdecimal进行浮点数比较。
eg.
import java.math.BigDecimal;
public class DoubleOperation {
public static void main(String[] args) {
//使用精确的浮点运算,要使用BigDecimal类
BigDecimal temp1=BigDecimal.valueOf(1.0);
BigDecimal temp2=BigDecimal.valueOf(0.1);
temp1=temp1.subtract(temp2);
temp1=temp1.subtract(temp2);
temp1=temp1.subtract(temp2);
double temp3=1.0;
double temp4=0.1;
temp3=temp3-temp4-temp4-temp4;
System.out.println(temp1);
System.out.println(temp3);
}
}
运行结果:
2.4 字符型
字符型在内存中占2个字节,在Java中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串。
char 类型用来表示在Unicode编码表中的字符。Unicode编码被设计用来处理各种语言的文字,它占2个字节,可允许有65536个字符。
转义字符:
Java 语言中还允许使用转义字符 ‘\’ 来将其后的字符转变为其它的含义。常用的转义字符及其含义和Unicode值如表下表:
note:
- 字符常量单引号中必须有且仅有一个字符,
' ','as'
均会报错. - 转义字符算一个字符,
'\u0061'
- 汉字也算一个字符。
2.5 boolean类型
boolean类型有两个常量值,true和false,在内存中占一位(不是一个字节),不可以使用 0 或非 0 的整数替代 true 和 false ,这点和C语言不同。 boolean 类型用来判断逻辑条件,一般用于程序流程控制 。
note:
if(flag==1)
if(1)
//这样的语句在java中式错误的
note:
引用数据类型的大小统一为4个字节,记录的是其引用对象的地址。
3. 类型转换
3.1 自动类型转换
原则:
由容量小的自动转向容量大的。
如下图红色的实线表示无数据丢失的自动类型转换,而虚线表示在转换时可能会有精度的损失。
note:
可以将整型常量直接赋值给byte、 short、 char等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可。
eg:
short b = 12; //合法
short b = 1234567;//非法,1234567超出了short的表数范围
3.2 强制类型转换
语法格式:
(type)var
运算符“()”中的type表示将值var想要转换成的目标数据类型。
eg:
double x = 3.14;
int nx = (int)x; //值为3
3.3数据类型中的注意事项
操作比较大的数时,要留意是否溢出,尤其是整数操作时。
int money = 1000000000; //10亿
int years = 20;
//返回的total是负数,超过了int的范围
int total = money*years;
System.out.println("total="+total);
//返回的total仍然是负数。默认是int,因此结果会转成int值,再转成long。但是已经发生了数据丢失
long total1 = money*years;
System.out.println("total1="+total1);
//返回的total2正确:先将一个因子变成long,整个表达式发生提升。全部用long来计算。
long total2 = money*((long)years); (!!)
System.out.println("total2="+total2);
示例输出如下:
二、 常量
在Java语言中,主要是利用关键字final来定义一个常量。 常量是一个固定值,一旦被初始化后不能再更改其值。
1. 常量声明格式
final type varName = value;
eg:
final double PI=3.14;
2. 注意事项
- 常量可以是整数类型、小数类型、布尔类型、字符类型、字符串类型。
- 常量的命名规范是由大写字母和下划线构成。
三、 变量
变量作为程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储空间。
1.变量的声明
type varName [=value][,varName[=value]...];
//数据类型 变量名 [=初始值] [,变量名 [=初始值]…];
//中括号中为可选项,即可有可无。
//第二个中括号表示可以一行申请多个同类型变量(不提倡)
eg:
double salary;
long earthPopulation;
int age;
注意观察下图,不同数据类型的常量会在内存中分配不同的空间。
2.变量的分类
2.1 局部变量
方法或语句块内部定义的变量。生命周期是从声明位置开始到到方法或语句块执行完毕为止。局部变量在使用前必须先声明、初始化(赋初值)再使用。
2.2 成员变量
方法外部、类的内部定义的变量。从属于对象,生命周期伴随对象始终。如果不自行初始化,它会自动初始化成该类型的默认初始值。
2.3 静态变量
使用static定义。 从属于类,生命周期伴随类始终,从类加载到卸载。 (注:随后深入讲解)如果不自行初始化,与成员变量相同会自动初始化成该类型的默认初始值。
2.4 三种变量举例
/**
* 测试变量
*
* @author maruijiego
*
*/
public class TestVariable {
int a; //成员变量, 从属于对象; 成员变量会自动被初始化
static int size; //静态变量,从属于类
public static void main(String[] args) {
{
int age; //局部变量,从属于语句块;
age = 18;
}
int salary = 3000; //局部变量,从属于方法
int gao = 13;
System.out.println(gao);
int i;
// int j = i + 5; // 编译出错,变量i还未被初始化
}
}