目录
本文介绍了Java中的字面常量、数据类型和变量相关概念
主要内容包括:
1.字面常量的分类(字符串、整型、浮点型等);
2.基本数据类型的分类(四类八种)及其存储特性;
3.变量的定义和使用方法;
4.各种整型变量(int/long/short/byte)和浮点型变量的特点及取值范围;
5.类型转换规则(自动转换和强制转换)及类型提升机制。文章通过代码示例详细说明了不同数据类型的用法和注意事项,比较了Java与C语言在数据类型处理上的异同。
一:字⾯常量
在上次HelloWorld程序中, System.out.println("Hello World") ; 语句,不论程序何时 运⾏,输出的都是HelloWorld,其实"HelloWorld"就是字⾯常量。
常量即程序运⾏期间,固定不变的量称为常量,⽐如:⼀个礼拜七天,⼀年12个⽉等
代码如下:
java
public class Test{
public static void main(String[] args){
System.Out.println("hello world!");
System.Out.println(100);
System.Out.println(3.14);
System.Out.println('A');
System.Out.println(true);
System.Out.println(false);
}
}
运行结果:

其中:100、3.14、'A'、true/false都是常量,将其称为字⾯常量。
字⾯常量的分类:
1. 字符串常量:由 " " 括起来的,⽐如"12345"、"hello"、"你好"。
2. 整型常量 :程序中直接写的数字(注意没有⼩数点),⽐如:100、1000
3. 浮点数常量:程序中直接写的⼩数,⽐如:3.14、0.49
4. 字符常量:由单引号括起来的当个字符,⽐如:'A'、'1'
5. 布尔常量:只有两种true和false
6. 空常量 :null(后⾯了讲) 注意:字符串、整型、浮点型、字符型以及布尔型,在Java中都称为数据类型
二:数据类型
在Java中数据类型主要分为两类:基本数据类型 和引⽤数据类型。
基本数据类型有四类⼋种:
-
四类 :整型、浮点型、字符型以及布尔型
-
⼋种:

注意(和C语言有区别):
• 不论是在16位系统还是32位系统,int都占⽤4个字节,long都占8个字节
• 整型和浮点型都是带有符号的
• 整型默认为int型,浮点型默认为double
• 字符串属于引⽤类型,该种类型后序介绍。
什么是字节?(在C语言的时候讲过了)
字节是计算机中表⽰空间⼤⼩的基本单位.
计算机使⽤⼆进制表⽰数据.我们认为8个⼆进制位(bit)为⼀个字节(Byte).
我们平时的计算机为8GB内存,意思是8G个字节.
其中1KB=1024Byte,1MB=1024KB,1GB=1024MB. 所以8GB相当于80多亿个字节.
三:变量
1.变量概念
在程序中,除了有始终不变的常量 外,有些内容可能会经常改变,⽐如:⼈的年龄、⾝⾼、成绩分 数、数学函数的计算结果等,对于这些经常改变的内容,在Java程序中,称为变量。⽽数据类型就是 ⽤来定义不同种类变量的
2.语法格式
定义变量的语法格式为:
数据类型 变量名 = 初始值 ;
代码如下:
整型变量、浮点型、字符型、布尔类型
注意一下:这里的布尔类型和C语言的布尔类型写法不一样
C语言:bool
java:boolean
java
int a = 10;
double d = 3.14;
char c = 'A';
boolean b = true;
System.out.println(a);
System.out.println(d);
System.out.println(c);
System.out.println(b);
输出结果:

此外这里的变量是可以赋值的,和C语言是一模一样的,如下:
java
public static void main(String[] args) {
int a=10;
System.out.println(a);
a=20;
System.out.println(a);
}
输出结果:

还有就是:在⼀⾏可以定义多个相同类型的变量。这里也和C语言是一样的,如下:
java
public static void main(String[] args) {
int a1 = 10, a2 = 20, a3 = 30;
System.out.println(a1);
System.out.println(a2);
System.out.println(a3);
}
输出结果:

3.整型变量
3.1整型变量
⽅式⼀:在定义时给出初始值(没有问题)
代码如下:
java
public static void main(String[] args) {
int a = 10;
System.out.println(a);
}
输出结果:

⽅式⼆:在定义时没有给初始值,但使⽤前必须设置初值(没有问题)
代码如下:
java
public static void main(String[] args) {
int b;
b = 10;
System.out.println(b);
}
输出结果:

方式三:定义了变量但是没有赋值(有问题)
代码如下:
java
public static void main(String[] args) {
int c;
System.out.println(c);
c = 100;
}
输出结果:会直接报错(这里和C语言的一个很大的区别)

int区间范围:
代码如下:
java
public static void main(String[] args) {
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
}
输出结果:

注意事项:
-
int不论在何种系统下都是4个字节
-
推荐使⽤⽅式⼀定义,如果没有合适的初始值,可以设置为0
-
在给变量设置初始值时,值不能超过int的表⽰范围,否则会导致溢出
-
变量在使⽤之前必须要赋初值,否则编译报错
-
int的包装类型为Integer
3.2⻓整型变量
表示代码(三种写法):
java
public static void main(String[] args) {
long b = 10; // long定义的⻓整型变量
long c = 10L; // 建议后面加L,做个区分
long d =10l; // 加小l和上面一个意思,但是大写更好
}
后面建议加大写的L 来加以区分,推荐这样写
long区间范围
代码如下:
java
public static void main(String[] args) {
System.out.println(Long.MIN_VALUE);
System.out.println(Long.MAX_VALUE);
}
输出结果:

注意事项:
-
⻓整型变量的初始值后加L或者l,推荐加L
-
⻓整型不论在那个系统下都占8个字节
-
⻓整型的表⽰范围为:-2^63 ~(2^63)-1
-
long的包装类型为Long
3.3短整型变量
表示代码:
java
public static void main(String[] args) {
short a = 10;
System.out.println(a);
}
输出结果:

short区间范围
代码如下:
java
public static void main(String[] args) {
System.out.println(Short.MIN_VALUE);
System.out.println(Short.MAX_VALUE);
}
输出结果:

注意事项:
-
short在任何系统下都占2个字节
-
short的表⽰范围为:-32768~32767
-
使⽤时注意不要超过范围(⼀般使⽤⽐较少)
-
short的包装类型为Short
3.4字节型变量
注意这是java特有的变量,C语言是没有的
表示代码如下:
java
public static void main(String[] args) {
byte b = 10;
System.out.println(b);
}
输出:

byte区间范围
代码如下:
java
public static void main(String[] args) {
System.out.println(Byte.MIN_VALUE);
System.out.println(Byte.MAX_VALUE);
}
输出结果:

注意事项:
-
byte在任何系统下都占1个字节
-
byte的范围是:-128~127
-
字节的包装类型为Byte
思考:byte、short、int、long都可以定义整型变量,为什么要给出4种不同类型呢?
这就好⽐买⾐服时的尺码:

3.5浮点型变量
3.5.1双精度浮点型
代码写法:
java
public static void main(String[] args) {
double d = 3.14;
System.out.println(d);
}
神奇的代码⼀:
java
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a / b); //输出0.5吗?
}
输出是0.5吗?显然不是。这里的计算和C语言大同小异,结果是0

结论:
在Java中,int除以int的值仍然是int(会直接舍弃⼩数部分)。如果想得到0.5,需要使⽤double类 型计算
代码如下:
java
public static void main(String[] args) {
double a = 1.0;
double b = 2.0;
System.out.println(a / b); //输出0.5
}
结果:

注意事项:
-
double在任何系统下都占8个字节
-
浮点数与整数在内存中的存储⽅式不同,不能单纯使⽤的形式来计算
-
double的包装类型为Double
-
double类型的内存布局遵守IEEE754标准(和C语⾔⼀样),尝试使⽤有限的内存空间表⽰可能⽆限 的⼩数,势必会存在⼀定的精度误差,因此浮点数是个近似值,并不是精确值
3.5.2单精度浮点型
书写代码:
java
public static void main(String[] args) {
float num = 1.0f;
System.out.println(num);
}
结果:

float 类型在Java中占四个字节,
同样遵守IEEE754标准.由于表⽰的数据精度范围较⼩,⼀般在⼯程上 ⽤到浮点数都优先考虑double,不太推荐使⽤float.
float的包装类型为Float
3.6字符型变量
代码写法:
java
public static void main(String[] args) {
char c1 = 'A';
char c2 = '1';
char c3 = '菜';
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
}
输出结果:

注意事项:
-
Java中使⽤ 单引号 + 单个字⺟ 的形式表⽰字符字⾯值.
-
计算机中的字符本质上是⼀个整数.在C语⾔中使⽤ASCII表⽰字符,⽽Java中使⽤Unicode表⽰ 字符.因此⼀个字符占⽤两个字节(C语言里面是一个字节),表⽰的字符种类更多,包括中⽂.
-
char的包装类型为Character
3.7布尔型变量
布尔类型常⽤来表⽰真假,在现实⽣活中也是经常出现的,⽐如:听说xxx同学买彩票中了⼀个亿..., 听到后估计⼤部分⼈第⼀反应就是:真的假的?
代码写法:
java
public static void main(String[] args) {
boolean b = true;
System.out.println(b);
b = false;
System.out.println(b);
}
输出结果:

注意事项:
-
boolean类型的变量只有两种取值,true表⽰真,false表⽰假.
-
Java的boolean类型和int不能相互转换,不存在1表⽰true,0表⽰false这样的⽤法.
不能转换的原因看一下代码:
java
public static void main(String[] args) {
boolean value = true;
System.out.println(value + 1);
}
结果(会报错):

-
Java虚拟机规范中,并没有明确规定boolean占⼏个字节,也没有专⻔⽤来处理boolean的字节码 指令,在Oracle的Java虚拟机实现中,Java编程语⾔中的布尔数组被编码为Java虚拟机字节数 组,每个布尔元素使⽤8位。
-
boolean的包装类型为Boolean
参考官⽅⼿册:
Chapter2.TheStructureoftheJavaVirtual Machine
3.8字符串类型
它也是java特有的,在C语言里面是没有的
在Java中使⽤String类定义字符串类型,⽐如:
java
public static void main(String[] args) {
String s1 = "hello";
String s2 = " world";
System.out.println(s1);
System.out.println(s2);
System.out.println(s1+s2); // s1+s2表⽰:将s1和s2进⾏拼接
}
输出结果:

特点:
计算加法的时候会把前面的字符串和后面的字符串拼接在一起
4.类型转换
Java 作为⼀个强类型编程语⾔,当不同类型之间的变量相互赋值的时候,会有教严格的校验
int a = 10; long b = 100L; b = a; // 可以通过编译 a = b; // 编译失败
在Java中,当参与运算**数据类型不⼀致时,就会进⾏类型转换。**Java中类型转换主要分为两类:⾃动 类型转换(隐式)和强制类型转换(显式)。
4.1⾃动类型转换(隐式)
⾃动类型转换即:代码不需要经过任何处理,在代码编译时,编译器会⾃动进⾏处理。特点:数据范 围⼩的转为数据范围⼤的时会⾃动进⾏。(小转大)
System.out.println(1024); //整型默认情况下是int System.out.println(3.14); //浮点型默认情况下是double
int 类型的值 ⾃动转换为了 long 类型(小自动转为大范围)
int a = 100;
long b = 10L;
b = a;
float 类型的值 ⾃动转换为了 double 类型
float f = 3.14F;
double d = 5.12;
d = f;
4.2强制类型转换(显式)
强制类型转换:当进⾏操作时,代码需要经过⼀定的格式处理,不能⾃动完成。特点:数据范围⼤的 到数据范围⼩的。(大换小)
int-->long ,数据范围由⼩到⼤,隐式转换
long-->int, 数据范围由**⼤到⼩,需要强转**,否则编译失败**(这里的强转和C语言是一样的)**
int a = 10;
long b = 100L;
b = a;
a = (int)b; //强转
注意事项:
-
不同数字类型的变量之间赋值,表⽰范围更**⼩的类型能隐式转换成范围较⼤的类型**
-
如果需要把**范围⼤的类型赋值给范围⼩的,需要强制类型转换,**但是可能精度丢失
-
将⼀个字⾯值常量进⾏赋值的时候,Java会⾃动针对数字范围进⾏检查
-
强制类型转换不⼀定能成功,不相⼲的类型不能互相转换
5.类型提升
不同类型的数据之间相互运算时,数据类型⼩的会被提升到数据类型⼤的。(提升往高的提)
lava这里和C语言也是一样的
int与long之间:int会被提升为long
int a = 10;
long b = 20;
int c = a + b; // 编译出错 : a + b== > int + long--> long + long 赋值给 int 时会丢失 数据
long d = a + b; // 编译成功: a + b==>int + long--->long + long 赋值给 long
byte与byte的运算
java
public static void main(String[] args) {
byte a = 10;
byte b = 20;
byte c = a + b; //编译出错
System.out.println(c);
}
结果:

结论:byte和byte都是相同类型,但是出现编译报错.
原因是:
虽然a和b都是byte,但是计算a+b会 先将a和b都提升成int,再进⾏计算,得到的结果也是int,这是赋给c,就会出现上述错误.
由于计算机的CPU通常是按照4个字节为单位从内存中读写数据.为了硬件上实现⽅便,诸如byte和 short 这种低于4个字节的类型,会先提升成int,再参与计算.
正确的写法(强转)
java
public static void main(String[] args) {
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);
}
结果:

【类型提升⼩结:】
-
不同类型的数据混合运算,范围**⼩的会提升成范围⼤**的.
-
对于short,byte这种**⽐4个字节⼩的类型,会先提升成4个字节的int,再运算**
以上就是我们的全部内容了!!!!