文章目录
一、字面常量
程序运行期间,固定不变的量称为常量。
常量的分类:
- 字符串常量:有"“括起来的,比如"12345”、“hello”、“你好”。
- 整形常量:比如100、1000(没有小数点)。
- 浮点数常量:比如3.14、0.49。
- 字符常量:由’ '括起来的单个字符,比如:‘A’、‘1’。
- 布尔常量:只有true和false。
- 空常量:null。
二、数据类型
在Java中数据类型主要分为两类:基本数据类型和引用数据类型。
注意: 在Java中,所有数值类型的数据都只有带符号的,没有无符号类型。
基本数据类型有四类八种:
四类:整型、浮点型、字符型、布尔型。
八种:
数据类型 | 关键字 | 内存占用 | 范围 |
---|---|---|---|
字节型 | byte | 1字节 | -128~127 |
短整型 | short | 2字节 | -32768~32767 |
整型 | int | 4字节 | − 2 31 -2^{31} −231~ 2 31 − 1 2^{31}-1 231−1 |
长整型 | long | 8字节 | − 2 63 -2^{63} −263~ 2 63 − 1 2^{63}-1 263−1 |
单精度浮点数 | float | 4字节 | |
双精度浮点数 | double | 8字节 | |
字符型 | char | 2字节 | 0~65535 |
布尔型 | boolean | 没有明确规定 | true和false |
注意: |
- 整型和浮点型都是带符号的;
- 整型默认为int,浮点型默认为double;
- 字符串属于引用类型;
- 引用类型包括类、接口和数组类型以及特殊的null类型。
三、变量
1.变量概念
在Java程序中,其值可以发生改变的量称为变量。数据类型就是用来定义不同种类变量的。
2.语法格式
代码如下(示例):
int a =10;//定义整型变量a,a是变量名也称为标识符,该变量中放置的值为10
double d=3.14;
3.整型变量
3.1整型变量
//方式1,在定义时给出初值
int a=10;
//方式2,定义时没有给出初值,使用前必须设置初值,否则会报错
int b;
b=10;
System.out.println(b);
注意:
- int不论在任何系统下都是4个字节;
- 没有合适的初始值,可以设置为0;
- 给变量设置初值时,不能超过int的表示范围,否则会导致溢出;
3.2长整型变量
int a=10;
long b=10L;//区分int和long,在初值后加L或者l
3.3短整型变量
short a=10;
System.out.println(a);
3.4字节型变量
byte a=10;
System.out.println(a);
4.浮点型变量
4.1 双精度浮点型
double d=3.14;
System.out.println(d);
注意:
- double在任何系统下都占8个字节;
- 浮点数是个近似值,并不是精确值;
4.2 单精度浮点型
由于表示的数据精度范围较小,一般在工程上用到浮点数都优先考虑double,不太推荐float。
5.字符型变量
char c1='A';//大写字母
char c2='1';//数字字符
System.out.println(c1);
System.out.println(c2);
注意:
- Java中使用’单个字母’的形式表示字符字面值
- 计算机中的字符本质上是一个整数。在C语言中使用ASCII表示字符,而Java中使用Unicode表示字符。因此一个字符占两个字节
6.布尔型变量
注意:
- 布尔型变量只有两种取值,true表示真,false表示假;
- Java中的布尔型和整型不能相互转换;不存在1表示true,0表示false;
7.类型转换
Java作为一个强类型编程语言,当不同类型之间的变量相互赋值的时候,会有较严格的校验。
int a=10;
long b=100L;
b=a;//可以通过编译
a=b;//编译失败
在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式)和强制类型转换(显式)。
7.1 自动类型转换(隐式)
代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。
特点:数据范围小的转为数据范围大的时会自动进行。
System.out.println(1024);//整型默认情况下是int
System.out.println(3.14);//浮点型默认情况下是double
int a=100;
long b=10L;
b=a;//a的范围小,b的范围大,将a的值赋给b时,编译器会自动将a提升为long类型,然后赋值
a=b;//编译报错,long的范围比int大,会有数据丢失
float f=3.14F;
double d=5.12;
d=f;//编译器会将f转换为double类型,然后进行赋值
f=d;//double表示的数据范围大,会有数据丢失
byte b1=100;//编译通过,编译器将100转换为byte
byte b2=257;//编译失败,257超过了byte的数据范围,有数据丢失
7.2 强制类型转换(显式)
当进行操作时,代码需要经过一定的格式处理,不能自动完成。
特点:数据范围大的到数据范围小的。
int a=10;
long b=100L;
b=a;//数据范围从小到大,隐式转换
a=(int)b;//数据范围从大到小,需要强转,否则编译失败
float f=3.14F;
double d=5.12;
d=f;//数据范围从小到大,隐式转换
f=(float)d;//数据范围从大到小,需要强转,否则编译失败
a=d;//报错,类型不兼容
a=(int)d;//double没有int表示的数据范围大,需要强转,小数点之后全部丢弃
byte b1=100;//100默认为int,没有超过byte范围,隐式转换
byte b2=(byte)257;//257默认为int,超过byte范围,需要强转,否则编译失败
boolean flag=true;
a=flag;//编译失败:类型不兼容
flag=a;//编译失败:类型不兼容
注意:
- 不同数据类型的变量之间赋值,范围小的类型能够隐式转换成范围较大的类型;
- 如果需要把范围大的类型赋值给范围小的,需要强制类型转换,但是可能精度丢失;
- 将一个字面常量进行赋值时,Java会自动针对数字范围进行检查;
- 强制类型转换不一定能成功,不相干的类型不能互相转换;
8.类型提升
不同数据类型的数据之间互相运算时,数据类型小的会被提升到数据类型大的。
- int与long之间,int会被提升为long
int a=10;
long b=20;
int c=a+b;//编译出错,int+long-->long+long 赋值给int时会丢失数据
long d=a+b;//编译成功,int+long-->long+long 赋值给long
- byte与byte的运算
byte a=10;
byte b=20;
byte c=a+b;
System.out.println(c);//编译失败:java: 不兼容的类型: 从int转换到byte可能会有损失
结论: byte和byte都是相同类型,但是出现编译报错。原因是虽然a和b都是byte,但是计算a+b会先将a和b都提升为int,再进行计算,得到的结果也是int,然后赋给c,就会报错。
由于计算机的CPU通常是按照4个字节为单位从内存读写数据,为了硬件上实现方便,像byte和short这种低于4个字节的类型会先提升成int,再参与计算。
上述代码正确的写法;
byte a=10;
byte b=20;
byte c=(byte)(a+b);
System.out.println(c);
小结:
- 不同数据类型混合运算,范围小的会提升成范围大的;
- 对于short、byte这种比4个字节小的类型,会先提升成4个字节的int,再运算。
四、字符串类型
在Java中使用String类定义字符串类型,比如:
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进行拼接
在有些情况下,需要将字符串和整型数据之间进行转换;
- int转成String
int num=10;
String str1=num+"";//方法1
String str2= String.valueOf(num);//方法2
- String转成int
String str="100";
int num=Integer.parseInt(str);