数据类型与变量

本节目标

1.字面常量
2.数据类型
3.变量

字面常量

public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

在我们运行的第一个Java的程序中,System.Out.println("Hello, World");语句,不管怎么运行,最后的输出结果都是Hello,World,其实就是说明了Hello,World就是一个字面常量。常量顾名思义就是指程序在运行的时候,固定不变的量。

public class ConstantExamples {
    public static void main(String[] args) {
        // 1. 字符串常量,用双引号括起来
        String str1 = "你好";
        String str2 = "123456";
        String str3 = "Hello, World";
        System.out.println("字符串常量示例:" + str1 + "," + str2 + "," + str3);

        // 2. 整形常量,即整数
        int int1 = 520;
        int int2 = 1314;
        System.out.println("整形常量示例:" + int1 + "," + int2);

        // 3. 浮点型常量,即小数,这里float类型需加f后缀,double类型可直接写
        float floatNum = 1.1f;
        double doubleNum = 13.14;
        System.out.println("浮点型常量示例:" + floatNum + "," + doubleNum);

        // 4. 字符常量,用单引号括起来,且只能有一个字符
        char char1 = 'A';
        char char2 = '2';
        System.out.println("字符常量示例:" + char1 + "," + char2);

        // 5. 布尔常量,值为true或false
        boolean bool1 = true;
        boolean bool2 = false;
        System.out.println("布尔常量示例:" + bool1 + "," + bool2);

        // 6. 空常量null,一般用于引用数据类型的初始化等
        String nullStr = null;
        System.out.println("空常量示例:" + nullStr); 
        // 注意:直接打印nullStr可能输出"null"字符串,实际代表引用为空,后续使用要避免空指针异常
    }
}

字面常量分为常见的六类:

1.字符串常量:一般都会被“ ”括起来,比如:“你好”,“123456”,“Hello,World”
2.整形常量:程序中的整数,比如:520,1314
3.浮点数常量:程序中的小数,比如:1.1,13.14
4.字符常量:一般是由‘’括起来,比如:‘A’,‘2’
5.布尔常量:分别为true和false
6.空常量:null

注意⚠️:字符串,整形,浮点型,字符型以及布尔型都在Java中被称为基本数据类型

数据类型

在Java中,数据类型分为两种基本数据类型和应用数据类型。

基本数据类型有八种:

数据类型 关键字 内存占用 范围
字节型 byte 1 字节 -128 ~ 127
短整型 short 2 字节 -32768 ~ 32767
整型 int 4 字节 −231-2^{31}231 ~ 231−12^{31} - 12311
长整型 long 8 字节 −263-2^{63}263 ~ 263−12^{63} - 12631
单精度浮点数 float 4 字节 有范围,一般不关注
双精度浮点数 double 8 字节 有范围,一般不关注
字符型 char 2 字节 0 ~ 65535
布尔型 boolean 没有明确规定 true 和 false

注意⚠️:
1.无论是在16位还是32位的系统,int都占用4字节,long都占用8个字节
2.整形和浮点型都是有符号的
3.整形默认是int类型,浮点型默认是double类型
4.字符串String为引用数据类型,而不是基本数据类型

变量

变量的概念

在程序中除了存在一成不变的常量,自然也会存在经常发生变化的内容。对于这些经常发生变化的内容,我们一般称为变量。然而数据类型就是用来定义不同类型的变量

语法格式: 数据类型 变量名 = 初始值;
          int a = 10;

整型变量

// 声明并初始化
int num1 = 10; 
// 先声明,后赋值
int num2;
num2 = 20;

注意⚠️:
1.int不管是在什么系统下都是4字节
2.设置初始值的时候,不要超过范围
3.int的包装类为Integer(Integer为引用数据类型)

长整型变量

// 使用大写L标识为long类型
long num1 = 100L; 
// 使用小写l标识为long类型
long num2 = 200l; 
System.out.println("num1的值:" + num1);
System.out.println("num2的值:" + num2);

注意⚠️:
1.长整型变量初始化的时候,需要在具体的值后面加L或l
2.长整型变量不管在什么系统下都是8个字节
3.long的包装类为Long(Long为引用数据类型)

短整型变量

// 声明并初始化一个short类型变量
short num1 = 100; 
System.out.println("num1的值:" + num1);

注意⚠️:
1.短整型变量不管在什么系统下都是2个字节
2.short的包装类为Short(Short为引用数据类型)

字节型变量

// 声明并初始化一个byte类型变量
byte num1 = 100; 
System.out.println("num1的值:" + num1);

注意⚠️:
1.字节型变量不管在什么系统下都是1个字节
2.byte的包装类为Byte(Byte为引用数据类型)

浮点型变量

double num1 = 3.14;        // 直接赋值(默认被视为double)
double num2 = 2.71828d;    // 后缀d/D(可选,但建议明确)
double num3 = 1.23e5;      // 科学计数法:1.23×10⁵ = 123000.0

float num1 = 3.14f;        // 必须加后缀f/F
float num2 = 2.71828F;     // 大小写均可
float num3 = 1.23e-2f;     // 科学计数法:1.23×10⁻² = 0.0123

注意⚠️:
1.double在任何系统下都占8个字节
2. 浮点数与整数在内存中的存储方式不同,不能单纯使用2ⁿ的形式来计算
3. double的包装类型为Double(Double为引用数据类型)
4. double类型的内存布局遵守 IEEE 754标准和C语言一样,尝试使用有限的内存空间表示可能无限的小数,势必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值
5. float则是占4个字节
6. float同样遵守IEEE 754标准。由于表示的数据精度范围较小,一般在工程上用到浮点数都优先考虑double,不太推荐使用float
7. float的包装类型为Float(Float为引用数据类型)

字符型变量

// 初始化一个英文字符
char letter = 'A'; 
System.out.println("letter的值:" + letter);

// 初始化一个中文字符
char chineseChar = '中'; 
System.out.println("chineseChar的值:" + chineseChar);

// 初始化一个特殊字符
char specialChar = '$'; 
System.out.println("specialChar的值:" + specialChar);

注意⚠️:
1.Java中使用单引号➕单个字母的形式表示字符字面值
2.计算机中的字符本质上是一个整数,在C语言中通过ASCII进行转码解码,在Java中则是通过Unicode进行转码和解码
3.char的包装类型为Character(Character为引用数据类型)

布尔型变量

// 声明并初始化一个布尔型变量,值为true
boolean flag1 = true; 
System.out.println("flag1的值:" + flag1);

// 声明并初始化一个布尔型变量,值为false
boolean flag2 = false; 
System.out.println("flag2的值:" + flag2);

注意⚠️:
1.布尔类型的变量只有两种取值,true表示真,false表示假
2.Java的布尔类型不能与整形(int)相互转化,不存在1表示true,0表示false这样的用法
3.在java虚拟机的规范中,并没有明确表示布尔类型占多少个字节,也没有专门用来处理布尔类型的字节码指令,但是在Oracle公司的虚拟机实现中,布尔类型占1个字节
4.boolean的包装类为Boolean(Boolean为引用数据类型)

类型转换

Java作为一个强类型编程语言,不同类型的变量通过转换的时候,需要通过严格的校验。当参与运算的变量,类型不一致的时候,就需要进行类型转换。在Java中,类型的转换主要分为两类:自动类型转换和强制类型转换

自动类型转换
// byte类型自动转换为int类型
byte byteNum = 10;
int intNum = byteNum; 
System.out.println("byte转换为int后的值:" + intNum);

// short类型自动转换为long类型
short shortNum = 20;
long longNum = shortNum; 
System.out.println("short转换为long后的值:" + longNum);

// char类型自动转换为float类型
char charValue = 'A';
float floatValue = charValue; 
System.out.println("char转换为float后的值:" + floatValue);

概念:
当把一个取值范围小的数据类型赋值给取值范围大的数据类型时,Java 会自动进行类型转换,这种转换是安全的,不会丢失数据。

适用情况:
从低精度类型向高精度类型转换,如byte -> short -> int -> long -> float -> double。
char类型可以自动转换为int、long、float、double。

强制类型转换
// int类型强制转换为byte类型
int num1 = 130;
byte byteResult = (byte)num1; 
System.out.println("int强制转换为byte后的值:" + byteResult);
// 这里130超出了byte的取值范围 -128 ~ 127,会发生数据溢出

// double类型强制转换为int类型
double doubleNum = 3.14;
int intResult = (int)doubleNum; 
System.out.println("double强制转换为int后的值:" + intResult);
// 小数部分会被直接舍去,结果为3

// 将字符串转换为数字类型时,也可能需要强制类型转换(结合对应的转换方法)
String str = "123";
int parsedInt = Integer.parseInt(str);
// 如果需要转换为byte类型,再进行强制类型转换
byte byteFromStr = (byte)parsedInt; 
System.out.println("从字符串转换并强制转换为byte后的值:" + byteFromStr);

概念:
把一个取值范围大的数据类型赋值给取值范围小的数据类型,或者在不满足自动类型转换规则的情况下进行类型转换时,需要使用强制类型转换。强制类型转换可能会导致数据丢失或精度降低。

语法:(目标数据类型) 要转换的值

注意⚠️:
1将一个字面值常量进行赋值的时候,java会自动针对数值范围进行检查
2.强制类型转换不一定会成功,不相干的类型不能互相转换

类型提升

不同类型的变量转化的时候,会由数据类型小的被提升到数据类型大的

1.int与long之间

// int 类型变量
int numInt = 10;  
// long 类型变量
long numLong = 20L; 

// 类型提升:int(小类型)自动提升为 long(大类型),运算结果是 long 类型
long result = numInt + numLong;  

// 输出结果:30,类型是 long
System.out.println("结果:" + result); 

2.byte与byte之间

byte a = 10;  // byte类型,范围-128~127
byte b = 20;  // byte类型

// 错误:编译不通过
// byte result = a + b;  // 报错:不兼容的类型,需要byte,但得到int

// 正确:必须使用int类型接收结果,或强制类型转换
int result = a + b;  // 结果为int类型
byte castResult = (byte) (a + b);  // 强制转换回byte

System.out.println("int结果: " + result);  // 输出30
System.out.println("byte结果: " + castResult);  // 输出30(未溢出时正确)

3.int与String之间

int num = 123;
String str = "" + num; // "123"
int num = 123;
String str = String.valueOf(num); // "123"

String str = "456";
int num = Integer.parseInt(str); // 456
String str = "456";
int num = Integer.valueOf(str); // 456(自动拆箱为int)

总结:
1.不同数据类型混合计算,范围小的会提升成范围大的
2.对于小于四个字节的类型(short,byte等),会优先提升成四个字节的int进行运算

你可能感兴趣的:(java)