1、变量
变量:可以变化的量。本质上代表一个”可操作的存储空间”,空间位置确定,里面存放的值不确定。通过变量名来访问“对应的存储空间”,来操纵这个“存储空间”存储的值。
-
java是一种强类型语言,每个变量必须声明其类型。变量的数据类型决定变量占据存储空间的大小。
-
java变量是程序中最基本的存储单元,其要素包括:变量名、变量类型和作用域。变量在使用前必须对其声明, 只有在变量声明以后,才能为其分配相应长度的存储空间。
//数据类型 变量名 = 值;逗号隔开用来声明多个同类型变量
-
每个变量都有数据类型,可以是基本数据类型。也可以是引用类型
-
变量名必须是合法的标识符
1.1 分类
-
类变量(静态变量)
-
实例变量(成员变量)
-
局部变量
public class demo2 {
//属性:变量
//类变量【类内部】 static修饰
static double salary =3000;
//实例变量【类内部,方法外部】:从属于对象,如果不自行初始化,这个类型的默认值
//除了基本类型,其余的默认值都是null
String name;
int age;
public static void main(String[] args) {
//局部变量【方法/语句块】:必须声明和初始化值
int i =10;
System.out.println(i);
//变量类型 变量名 = new Demo2();
demo2 d = new demo2();
System.out.println(d.age);
System.out.println(d.name);
//类变量
System.out.println(salary);
}
}
-
局部变量
方法或语句块内部定义的变量。声明周期从声明位置开始到方法/语句块执行完毕为止。
局部变量在使用前必须先声明、初始化(赋值)再使用。
-
成员变量(实例变量)
方法外部、类内部定义的变量。从属于对象,声明周期随对象的始终。
如果不自行定义初始化,会自动初始化该类型默认的初始值。
-
静态变量(类变量)
使用static定义。从属于类,生命周期伴随类始终,从类加载到卸载。
如果不自行初始化,会自动初始化成该类型的默认初始值。
2、数据类型
-
基本数据类型
-
引用类型
【基本数据类型】:
-
数值型:byte、short、int、long、float、double
-
字符型:char
-
布尔型:boolean:true、false
【引用数据类型】( 4 个字节,记录其引用对象的地址):
-
类:class
-
接口:interface
-
数组
2.1 整型
【进制表示】:
-
十进制:99,-500,0
-
八进制:以0开头,eg:015
-
十六进制:以0x或0X开头,eg:0x15
-
二进制:以0b或0B开头,eg:0b10010010
Java 语言的整型常数默认为 int 型,声明 long 型常量可以后加‘ l ’或‘ L ’.
2.2 浮点型
-
float
又称单精度类型。尾数可以精确到 7 位有效数字,离散、舍入误差、大约、接近但不等于。
→:果需要进行不产生舍入误差的精确数字计算BigDecimal 数学工具类
尽量不使用float浮点数进行比较
-
double
又称双精度类型,数值精度约是 float 类型的两倍,绝大部分应用程序都采用 double 类型。
-
float类型的数值有一个后缀F或者f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D或者d, 以明确其为double类型
float f = 0.1f;
double d = 0.1;
System.out.println(f = d);//→false
float d1 = 23232222233333323233f;
float d2 = d1+1;
System.out.println(d1 == d2);//true
reaon:由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。 浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于
-
java.math 包下面的两个有用的类:BigInteger 和 BigDecimal,这两个类可以处理任意长度的数值。BigInteger 实现了任意精度的整数运算。BigDecimal 实现了任意精度的浮点运算。
//科学计数法
double f = 314e2; //314*10^2-->31400.0
double f2 = 314e-2; //314*10^(-2)-->3.14
2.3 字符型
字符型在内存中占 2 个字节,在 Java 中使用单引号来表示字符常量。例如’A’是一个字符,它与”A”是不同的,”A”表示含有一个字符的字符串
char 类型用来表示在 Unicode 编码表中的字符。Unicode 编码被设计用来处理各种语言的文字,它占 2 个字节,可允许有 65536 个字符。
-
强制转换
char c1 = 'a';
char c2 = '中';
System.out.println(c1);
System.out.println((int)c1);
System.out.println(c2);
System.out.println((int)c2);
-
编码:Unicode表 2字节 (0-65536),通常用从’\u0000’到’\uFFFF’之间的十六进制值来表示(前缀为 u 表示 Unicode)
-
Excel :2^16=65536
-
所有字符的本质还是数字
char c3= '\u0061';
System.out.println(c3);
-
转义字符
-
String 类,其实是字符序列(char sequence), 本质是 char 字符组成的数组。
-
对象,从内存分析
String s1 = new String("zhangsan");
String s2 = new String("zhangsan");
System.out.println(s1==s2); // false
String s3 = "zhangsan";
String s4 = "zhangsan";
System.out.println(s3==s4);//true
2.4 布尔型
boolean 类型有两个常量值,true 和 false,在内存中占一个字节或 4 个字节→流程控制。
Boolean flag = true;
if(flag) {
// true 分支
} else {
// false 分支
}
-
在 Java 虚拟机中没有任何供 boolean 值专用的字节码指令,Java 语言表达式所操作的boolean 值,在编译之后都使用 Java 虚拟机中的 int 数据类型来代替,而 boolean 数组将会被编码成 Java虚拟机的 byte 数组,每个元素 boolean 元素占 8 位。
-
说 JVM 规范指出 boolean 当做 int 处理,也就是 4 字节,boolean 数组当做 byte 数组处理,这样我们可以得出 boolean 类型占了单独使用是 4 个字节,在数组中是确定的 1 个字节。
2.5 类型转换
-
byte ,short ,char→int→ long→float→double
1. 自动类型转换(小→大)
八种基本数据类型,除了 boolean 类型之外的七种类型是可以自动转化的(虚线:精度缺失问题)。可以将整型常量直接赋值给 byte、 short、 char 等类型变量,而不需要进行强制类型转换,只要不超出其表数范围即可
int i =128;
double d = 123;
byte b1 =(byte)i;
byte b2 = d;
System.out.println(i);//128
System.out.println(b1);//-128
2. 强制类型转换(大→小)
强制类型转换,又称造型(cast)。在有可能丢失信息的情况下进行的转换是通过造型来完成的,可能造成精度降低或溢出。
当将一种类型强制转换成另一种类型,而又超出了目标类型的表数范围,就会被截断成为一个完全不同的值。
int x = 300;
byte bx = (byte)x; //值为 44
【注意点】
-
不能对布尔类型进行转换
-
不能把对象类型数据转换为不相干的类型
-
把高容量的时候可能存在内存溢出或精度问题
System.out.println((int)123.4);//123
System.out.println((int)-45.89f);//-45
【溢出问题】
-
jdk7新特性:数字之间可以用下划线进行分割
int money = 10_0000_0000;
int years = 20;
int toal1 = money*years;//-1474836480;计算溢出
long toal2 = money*years;//-1474836480;默认是int,转换前就已经存在溢出问题
long total3 = money*(long)years;//20000000000;先把一个数转换为long类型
//L l
【注意点】:
-
操作比较大的数时,要留意是否溢出,尤其是整数操作时。
-
L和l(小写)混淆→L