1. 变量
在程序执行的过程当中,我们需要一个存储数据的容器,这个容量就被称之为变量。这个容器在程序运行期间,容器中的值时可以随时发生改变的。
Java是一门强类型的语言,所有的变量以及数据都会存在类型,不同的类型存储的数据是不一样的,不同的类型存储的数据的大小是不一样的。
目前现阶段:我们需要确定的事情是: 所有的整数的类型暂时先使用 int
变量的三要素:数据类型 变量名 作用域
1.1 变量的声明和使用
/*
测试使用变量
1: 声明变量:
data_type name ; 声明了一个data_type这样类型的变量 名字叫name
*/
//1声明一个int类型的变量
int num;
//2: 给变量初始化
num = 10; // 将字面值10赋值给int类型的变量num存储
//3:使用
System.out.println(num);
// 声明和初始化会放在一起
int sum = 10; // 将一个整数字面值10赋值给int类型的变量 sum存储
System.out.println(sum);
// 变量在程序运行期间其值可以发生改变
sum = 20;
System.out.println(sum);
- 重点
-
- 变量要先声明在初始化 然后才能使用 一般我们的声明和初始化时放在一起的 一行;
- 变量在程序运行期间 其值可以发生改变
- 变量在声明的时候必须要满足:
// data_type name = value
int num = 10; // 这个行代码是自右向左进行运算的
1.2 数据类型
I、byte 字节型
// 测试使用byte数据类型
public class ByteTest{
public static void main(String[] args){
//1:声明byte类型的变量
byte b = 10;
//2: 输出一下b这个变量的值
System.out.println(b);
// 修改byte变量b的值
/*
ByteTest.java:13: 错误: 不兼容的类型: 从int转换到byte可能会有损失
b = 130
*/
b = 130;
System.out.println(b);
}
}
取值范围
数据类型 | 表数范围 | 所占空间 |
字节型 byte | [-128,127] -2^7 - 2^7-1 | 1个字节 |
注意事项
对于byte这种数据类型而言,大家在赋值的时候要注意取值,不要超过byte的取值范围,一般我们可以使用byte去做类型的值判定。表述状态。
II、short 短整型
// 测试使用short数据类型
public class ShortTest{
public static void main(String[] args){
//1:声明short类型的变量
short b = 130;
//2: 输出一下b这个变量的值
System.out.println(b);
// 修改short变量b的值
/*
ShortTest.java:13: 错误: 不兼容的类型: 从int转换到short可能会有损失
b = 130000;
^
1 个错误
*/
b = 130000;
System.out.println(b);
}
}
取值范围
数据类型 | 表数范围 | 所占空间 |
短整型 short | [-32768,32767] -2^15 - 2^15-1 | 2个字节 65536 |
注意事项
对于short这种数据类型而言,大家在赋值的时候要注意取值,不要超过short的取值范围,一般我们可以使用short存储大多数的值,但是一般不这么干;
III、int 整型
// 测试使用int数据类型
public class IntTest{
public static void main(String[] args){
//1:声明int类型的变量
int b = 130000;
//2: 输出一下b这个变量的值
System.out.println(b);
// 修改int变量b的值
/*
IntTest.java:16: 错误: 过大的整数: 2147483648
b = 2147483648;
^
1 个错误
*/
b = 2147483648;
System.out.println(b);
}
}
取值范围
数据类型 | 表数范围 | 所占空间 |
整型 int | -2^31 - 2^31-1 | 4个字节 |
注意事项
对于int这种数据类型而言,大家在赋值的时候不需要特别注意,因为一般我们都直接使用int进行存储;Java所有字面整数值的默认类型时int类型;
IV、long 长整型
// 测试使用LongTest数据类型
public class LongTest{
public static void main(String[] args){
//1:声明long类型的变量
long b = 2147483647;
//2: 输出一下b这个变量的值
System.out.println(b);
// 修改long变量b的值
/*
LongTest.java:16: 错误: 过大的整数: 2147483648
b = 2147483648;
^
1 个错误
*/
b = 2147483648L;
System.out.println(b);
}
}
取值范围
数据类型 | 表数范围 | 所占空间 |
长整型 long | -2^63 - 2^63-1 | 8个字节 |
注意事项
- 如果给一个long类型变量赋值的时候,当前这个字面值超过了int的取值范围,此时需要在字面值后面加
L
或者时l
。保证编译器可以识别当前字面值是long类型; - 在java中所有的字面整数都是int类型;
- 对于byte和short这两种数据类型而言,只要字面值没有超过对用的数据类型的取值范围,那么编译器是不会报错的;
V、关于整数的存储方式
- 进制转换
- 数据存储
一个整数在内存中的存储,是以这个数的补码来存储的,一个数的二进制表示方式就是这个数的原码,在其第一位符号位不变的情况下,其余为取反,就得到这个数的反码,再在反码的基础上加1,就能得到一个数的补码
例如:
5 -5
原码:0000 0101 原码:1000 0101
反码:1111 1010 反码:1111 1010
补码:0000 1011 补码:1111 1011
VI、关于整数的赋值方式
// 测试整数的赋值方式
public class IntInitValue{
public static void main(String[] args){
//1: 二进制赋值
int n = 0b1101; //JDK1.7之后的特性 0b 0B开头 后跟二进制数字
System.out.println(n);
//2:八进制赋值
n = 027; //以0开头 后跟8进制数字
System.out.println(n);
//3:十进制赋值
n = 123;
System.out.println(n);
//4:十六进制赋值
n = 0x3F;//以0x 0X开头 后跟16进制数字 A:10 B:11 C:12 D:13 E:14 F:15
System.out.println(n);
//5:会计计数法
long num = 123_456_789_999L;
System.out.println(num);
}
}
VII、float 单精度
// 测试float变量
public class FloatTest{
public static void main(String[] args){
//1: 声明一个float类型的变量
/*
FloatTest.java:6: 错误: 不兼容的类型: 从double转换到float可能会有损失
float f = 3.14;
*/
float f = 3.14F; //告知编译器 我这个字面值时float类型 不是double
System.out.println(f);
}
}
取值范围
数据类型 | 精度 | 所占空间 |
float 单精度 | 6-7位 | 4个字节 |
注意事项
- 如果给一个float类型变量赋值的时候,因为所有的字面小数都是double类型,所以需要在小数字面值后面加
F
\f
; - 在java中所有的字面小数都是double类型;
VIII、double 双精度
// 测试double变量
public class DoubleTest{
public static void main(String[] args){
//1: 声明一个double类型的变量
/*
FloatTest.java:6: 错误: 不兼容的类型: 从double转换到float可能会有损失
float f = 3.14;
*/
double d = 3.14;
System.out.println(d);
System.out.println(1/0.3);
System.out.println(1/0.3F);
// 小数运算时存在精度的问题 所以一般不要使用小数运算
// 解决问题的办法:扩大或者时缩小倍数
// java BigDecimal完成精度取值
System.out.println((0.6*10-0.5*10)/10);
}
}
取值范围
数据类型 | 精度 | 所占空间 |
double 单精度 | 15~16位 | 8个字节 |
注意事项
- 如果给一个float类型变量赋值的时候,因为所有的字面小数都是double类型,所以需要在小数字面值后面加
F
\f
; - 在java中所有的字面小数都是double类型;
VIIII、小数的存储方式
- 进制转换
- 定点数
X、小数的赋值方式
// 测试小数的赋值方式
public class DoubleInitValue{
public static void main(String[] args){
// 正常赋值
double d = 3.14;
// 省略0赋值
d = .5;
System.out.println(d);
// 科学计数法
d = 0.000134;
System.out.println(d);
d = 1.34E-4;
System.out.println(d);
}
}
XI、 boolean 布尔类型
// 测试boolean类型
public class BooleanTest{
public static void main(String[] args){
boolean flag = true;
System.out.println(flag);
flag = false;
System.out.println(flag);
}
}
取值范围
数据类型 | 取值 | 所占空间 |
boolean 布尔类型 | true \ false | 实际占用空间1位 虚拟开空间的时候可能会当他当成byte或者是int去开空间; |
注意事项
- 有且只有两个值 分别是true 和false
- 并且不能赋值0和1
XII、char 字符型
摘录自:ASCII图片_百度百科
Tips: 48--->0 65---->A 97---->a
// 测试使用char数据类型
public class CharTest{
public static void main(String[] args){
//1:声明char类型的变量
char ch = 'a'; // 字符都是一个个数字
System.out.println(ch);
// 当声明char类型的变量的时候直接赋值数字会怎么样?
ch = 23345;
System.out.println(ch);
// 第三种赋值方式:通过一个个的unicode代码点去赋值
// 斜杠\+u 后跟一个4位的16进制数字
ch = '\u5B31';
System.out.println(ch);
System.out.println('c'+3);
}
}
取值范围
数据类型 | 赋值方式 | 所占空间 |
char 字符型 | 通过单引号引起来的单个字符 | 2个字节 |
注意事项
- char类型是可以赋值为一个数字的,所以char类型是可以参与四则运算的;
1.3 常量
常量程序运行期间不可以发生改变的。
// 测试常量
public class FinalTest{
public static void main(String[] args) {
//1: 字面常量: 写什么就是什么
int num = 10; // 10是字面常量
char ch = 'A';
double d = 3.14;
//2: 符号常量
// 声明一个变量 半径是5
int r = 5;
//声明一个变量 存储pi的值
final double pi = 3.1415;
// 计算当前半径是5的圆的面积
double area = pi*r*r;
System.out.println(area);
}
}
- 通过final关键词修饰的变量称之为常量,常量是在程序运行期间其值不能发生改变的;
- final修饰的常量,在一定程度上是能够提升程序的编译以及执行的效能的,因为它存储的值时不变的;
1.4 类型转换
我们在学习类型转换的时候,基本数据类型的类型转换不重要,引用类型的类型转换。
类型转化的意思:一个类型变为另外一个类型。
I、自动类型转换
// 测试基本数据类型的自动转换
public class Convert01{
public static void main(String[] args) {
//1:声明一个变量 byte类型
byte b = 10;
System.out.println(b);
//2: 转换
int n = b;
System.out.println(n);
//3:四则运算会触发自动类型转换
char m = 10+'A'; // 编译的时候就10+'A'=>常量折叠 已经做完了 执行的时候 char m = 75;
System.out.println(m);
char ch = 'A';
int result = 10+ch; // 类型转换 编译期间做的 char = int 检查的时候报错了
System.out.println(result);
// boolean是不可以参与运算的
boolean flag = true;
n = flag+1;
System.out.println(n);
}
}
- 四则运算都会触发类型转换,自动向上提升(小变大)。
II、强制类型转换
// 测试基本数据类型的强制转换
public class Convert02{
public static void main(String[] args) {
char ch = 'A';
char result = (char)(10+ch); // char+char不是char 是int
System.out.println(result);
ch = 'A';
result = (char)(65535+ch); // char+char不是char 是int
System.out.println(result);
byte b = (byte)135;
System.out.println(b);
}
}
Tips:强转有风险、转换需谨慎;但是实际上是不需要谨慎的(你能够确定是否会出现数据问题)。