基本数据类型和引用类型(java版)

1.基本数据类型:

基本数据类型分为整型类型和浮点型类型

数据类型占用字节取值范围
byte1-128~127
short2-2^15~2^15-1
int4-2^31~2^31-1
long8-2^63~2^63-1
float4-2^31~2^31-1
double8-2^63~2^63-1
Boolean1true和false
char20 ~ 2^16-1

在java中数据类型的取值范围是和C语言的取值范围差不多,但是C语言有(unsigned)无符号类型和(signed)有符号类型,所以在java中没有只有正数的取值范围(不包括布尔类型(Boolean)和char(字符类型))

数据类型的占用的字节决定着它们的取值范围比如int类型

一个字节有8个比特位也就是8位,所以int类型占用4个字节,取值范围为-2^(31-1)~2^(31-1)-1

至于为什么要31-1,在上面的表格中除了字节类型(char)和布尔类型(Boolean)以外都需要(占用的字节*8-1),是因为在类型的高位也就是第一位是符号位,0表示正数,1表示负数。至于最大值在减1是要有0这个数,0在这里是表示为正数。

1.1整型类型:

byte a=10;
short b=20;
int c=10;
long d=10L;
System.out.printlf(16);

a表示为字节类型(byte)b表示短整型(short)c表示整型(int)d表示长整型(long)

最后一个代码是默认的整数类型也就是int类型,在d中的L表达的是d是long类型,当然在10的后面加上l也是可以的,但是不推荐这么做,因为l和1容易混淆,可能造成一些理解型的错误,所以建议用大写的L更方便一些。

1.2浮点型类型:

float a=10.0f;
double b=10.0d

a表示为单精度浮点型(float)和双精度浮点型(double)

在a中可以定义为10f和10F,b可以定义为10d和10D。

1.3进制的表示方法

int a=28;
int b=0b11100;
int c=0x1c;

二进制:以0b和0B为前缀,0是阿拉伯数字的0不是o

八进制:以0为前缀

十六进制:以0x和0X为前缀

1.4指数的表示

double a=3.36e2;
double b=1.56e-2;

采用十进制表示指数,需要用e和R表示幂,e2表示10^2,e-2表示10^-2

1.5字符类型

char c1='A';
char c2='\u0041';
char c3='花';

c1和c2表示的是字母A,c3表示的是花这个字。

java的编码是用Unicode编码,Unicode编码的内容比ASCII编码的内容更多,ASCII编码只能表示英文字母和数字等少数内容,而Uniocde编码不只是有英文字母和数字,还有阿拉丁文字等多种文字,是连中文也包括在内,所以c3可以输出 '花' 字符.。c2的 '\u0041' 等于十六进制的41,转化为

十进制的数字就是65,就是ASCII编码的 'A' 字符。

字符类型可以与数值类型转化。注意:虽然char类型可以与数值类型转化,但是byte和short无法和char转换,同理char类型无法转换为byte和short。char可以转换为int、long、float、double。

1.6布尔类型

boolean my_true=true;
boolean my_false=false;

my_true表示为true,my_false表示false。注意:布尔类型的true和false没有数值,也就是没有0与非0的概念。布尔类型无法转换为数值类型。

1.7类型转化

int a=10;
byte b=(byte)a;

上面的代码表示把a的int类型转换为byte类型在赋值给byte类型的b。

int a=10;
byte b=(byte)a;
int c=(int)a;
int d=(int)b;

第二行代码把a的int类型转换为byte类型,第三行代码a强制转换为int类型,这个合法但是没有必要强制转换,第四行代码把b的byte类型强制转换为int类型,这个转化是自动的不需要强制转换,但是有时候为了提高效率需要这种转换。

int a=10;
float b=a/3;
System.out.printlf(b);
float c=float(a)/3;
System.out.printlf(c);

第一个输出3,第二个输出3.3333333.。b是3,c是10/3。

因为前面的b=a/3这个a是整型,小数部分被去掉了。后面的c=float(a)/3这个a被强制转换为float类型就有我们想要的效果。

当然强制转换有一定的风险那就是精度丢失

下面举一个精度丢失的例子:

long a=6666666666L;
System.out.printlf(a);
int b=(int)a;
System.out.printlf(b);

输出的结果为:

6666666666

-1923267926

上面的是long类型a的值

下面的则是因为精度丢失,出现了乱码。

2.引用类型

在java中除了8种基本数据类型,其他数据类型都属于引用类型数据类型。引用数据类型用来表示复杂数据类型,它包含了类、接口、数组声明的数据类型

int x=7;
int y=x;
String str1="hello" ;
String str2=str1;
str2="world";
System.out.println(x);
System.out.println(y);
System.out.println(str1);
System.out.println(str2);

上面的x和y是两个基本数据类型,str1和str2是两个引用数据类型。

x值为7,x赋值给y,y=7.但是它们之间是独立的,不受影响。

str1变量内容被赋值给str2,str1和str2指向"hello"对象,str1和str2本质上是引用一个对象,通过任意一个引用都可以修改对象本身。

在代码的第五行,字符串"world"对象被创建,地址保存到str2变量中,此时str1和str2不在指向相同的内存地址

注意:java的引用类型,相当于C语言的指针类型,引用实际是就是指针,是指向一个对象的内存地址,引用类型变量保持的是指向对象的内存地址。很多资料上提到了java不支持指针,事实上是不支持指针计算,而指针类型还是保留了下来,只是在java中称为引用类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值