Java数据类型和变量

Java的数据类型

常量

常量即程序运行期间,固定不变的量称为常量。

字面常量

字面常量属于常量,也存在数据类型

  1. 字符串常量:由""括起来的,比如“12345”、“hello”、“你好”。(String类型)
  2. 整形常量:程序中直接写的数字,比如:100、1000。(int类型)
  3. 浮点数常量:程序中直接写的小数,比如:3.14、0.49。(double类型)
  4. 字符常量:由 单引号 括起来的当个字符,比如:‘A’、‘1’。(char类型)
  5. 布尔常量:只有两种true和false。(boolean类型)
  6. 空常量:null

其中直接写出来的整型字面量不仅仅是int类型,默认是10进制
0b开头表示二进制 ob10 (10)
0开头表示8进制 010(10)
0x开头表示16进制 0x10(10)
在这里插入图片描述

变量

基本数据类型

一.数值型(都是有符号数)
1.整型
byte(1字节)<short(2字节)<int(4字节)<long(8字节)
2.浮点型
float(4字节)<double(8字节)
二.字符型
char(2字节)
三.布尔型
boolean (只有true或false)

引用数据类型(数组,类,接口)

八大数据类型对应的包装类:

byte<Short<Integer<Long (默认值 0)
Float<Double (默认值 0.0)
Character (默认值 ‘\u0000’)
Boolean (默认值 false)

语法格式

定义变量的语法格式为:
比如:
数据类型 变量名 = 初始值;
int a = 10; // 定义整形变量a,a是变量名也称为标识符,该变量中放置的值为10
注:
方法中的变量不存在默认值,在方法中定义的局部变量必须先声明后使用
在这里插入图片描述
数据类型的默认值必须要在类中定义的变量才存在默认值
在这里插入图片描述
在Java任意方法内部声明的变量都是局部变量,局部变量没有默认值,当方法调用结束,方法中的局部变量都会被销毁,内存释放。

数据的溢出问题

byte类型在内存中占用一个字节,能表示的数是从-128~127
在这里插入图片描述
当超过变量能存放的最大值就会出现溢出的情况,当小的数据类型放不下时我们就需要更换更大数据类型来存放正确的值,long类型能表示2^63个有符号数,在一般的工程中已经足够使用。当大数据是采用BigInteger类来储存,也可以用字符串String类型来储存大整数。
一般场景下int就够用了,int放不下用long,当进行网络或者I/O编程时,基本的操作单位都是byte。
float保证六位之内的小数是准确的,double能保证12位以内的小数是准确的,若在某些精度要求特别高的场景下,更换使用BigDecimal类来存储小数。

类型转换与类型提升

类型转换

在Java中,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。
数据范围从小到大转换时,自动转换。数据范围从大到小转换时,需要强转,否则编译失败,强转之后会有精度丢失问题。
(字面常量中整型默认情况下是int, 浮点型默认情况下是double)

int a = 100;
long b = 10L;
b = a; // a和b都是整形,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表示数据范围大,直接将float交给double会有数据丢失,不安全
byte b1 = 100; // 编译通过,100没有超过byte的范围,编译器隐式将100转换为byte
byte b2 = 257; // 编译失败,257超过了byte的数据范围,有数据丢失
int a = 10;
long b = 100L;
b = a; // int-->long,数据范围由小到大,隐式转换
a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败
float f = 3.14F;
double d = 5.12;
d = f; // float-->double,数据范围由小到大,隐式转换
f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败
a = d; // 报错,类型不兼容
a = (int)d; // int没有double表示的数据范围大,需要强转,小数点之后全部丢弃
byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换
byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错
boolean flag = true;
a = flag; // 编译失败:类型不兼容
flag = a; // 编译失败:类型不兼容

类型提升

不同类型的数据之间相互运算时,会自动将小的数据类型提升为大的数据类型后再进行运算。
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的运算

byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c);
// 编译报错
Test.java:5: 错误: 不兼容的类型:int转换到byte可能会有损失

byte short char这三个数据类型再存储时仍然保留其类型,当参与运算时,在CPU中读写内存都是以四个字节进行读取,因此这三个类型参与运算时会统一提升为int类型然后参与运算,a和b存储在内存中会自动被提升为int类型 int+int=int ,此时 byte = int 编译不通过
正确的写法:

byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);

char和int的转换

char c = 'a'; //char变量赋值给int,自动提升
int b = c; //按照编码规则将字符转换为对应的整数(此为97)
System.out.println(b);
char d = (char)b; //此时将int赋值给char,从大到小,需要强转
System.out.println(d);//输出整数对应的字符(a)

在这里插入图片描述
int与String的转换
int→String
在Java中任何其他类型和字符串对象“+”,都会将其他类型转为字符串类型然后进行字符串的拼接操作
在这里插入图片描述
String→int
调用整型包装类Integer的patselnt方法(字符串必须由纯数字组成,且必须在int的保存范围之内,否则都会报错)
在这里插入图片描述
当字符串中有其他类型调用这个方法就会报错
在这里插入图片描述

当字符串超过了整型的范围,同样会报错
在这里插入图片描述

此外boolean类型与任何类型毫无关系,无法强转也无法提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值