【Android学习札记】数据类型

本文介绍了Android中的数据类型,包括基本数据类型如整数型、浮点型、字符型和布尔型,以及转换规则。详细讨论了自动转换和强制转换的情况,并举例说明。此外,文章还提到了引用数据类型,如数组、接口和类,强调了数组的声明、创建和初始化方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android还是需要java基础的,数据类型基本就是java的那套。

这里写图片描述

一.基本数据类型

1、八大基本类型

这里写图片描述

1.1、整数型
包含byte、短整型short、整数int和长整型long
只能存放整数,区别在于存放内容所占的空间大小有一定的区别
long类型数字要加”L”或”l”,不然就会当成int类型(整型默认类型)

1.2、浮点类型
包含float以及双精度double
默认的小数类型,就算我们赋值为1,再输出的时候也会变成1.0
float类型数字要加”F”或”f”,不然默认为double类型(浮点型默认类型)

1.3、字符型
一个char类型型的变量,对应一个字符,例如‘a’,这种类型的变量在Java中由两个字节(byte)组成。
既可以放单个字符,用单引号,例如‘a’
也可以放数字,原因是char类型存放的值,其实是和ascii编码中的值是一样的;比如如果赋值97,那么对于的就是字母’a’

1.4、布尔类型
也即boolean类型,只有两个取值:false和true。注意这种类型的变量,不能转换成任何其他数据类型

有一道题是这样的:

//1,将内容1中的
    long l=3615L;
//改为:
     long l=3615; 
//会出现什么情况?为什么?

//2.将本内容1中的
    float f=0.23F;
//改为:
     float f=0.23;
//会出现什么情况?为什么?

答案是

不加L默认是int,int转为long是安全的,所以会自动转,能编译通过
浮点数不加F默认是double类型,double转float可能损失精度,因为不会自动转,编译是通不过的

2 基本类型转换
在Java中,boolean类型与所有其他7种类型都不能进行转换,这一点很明确。
对于其他7中数值类型,它们之间都可以进行转换,但是可能会存在精度损失或者其他一些变化。
转换分为自动转换和强制转换。
对于自动转换(隐式),无需任何操作,而强制类型转换需要显式转换,即使用转换操作符(type)。
将7种类型按下面顺序排列一下:
byte <(short=char)< int < long < float < double
如果从小转换到大,可以自动完成,而从大到小,必须强制转换。short和char两种相同类型也必须强制转换。

很奇怪为什么long的占用空间比float大,为什么取值范围反而小?
答案是:
long是8个字节,也就是64位区间就是2的63次方-1到负的2的63次方;
而float是浮点型,它的存储方式不是直接存储,而是第一位是符号位,然后八位是指数位,后面23位是数据位,±(23位数据的值)×2^(8位的值)

2.1 自动转换
自动转换时发生扩宽(widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。

2.2 强制类型转换
如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。

严格地说,将byte转为char不属于(narrowing conversion),因为从byte到char的过程其实是byte–>int–>char,所以widening和narrowing都有。

强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。
强制转换格式:(type) value

int a=257;
byte b;   
b = (byte)a;    //输出1

为什么输出1,与二进制的存储有关:
比如 a=257, 二进制是:0 100000001(前面的0是符号位,0是正)
byte存储大小是8bit,所以只能存储到00000001(符号位和前面的1截掉了), 转为十进制结果为:1

如果a=200,二进制为:0 11001000
8bit正好把前面符号位截取了,剩11001000,第一位是符号位,1 1001000,是负数
计算机中的负数是以其补码形式存在的 补码=原码取反+1,真值就是:1 0111000,转为十进制结果为:-56

将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围进行上述处理。

二、引用数据类型

包括数组类型(Array)、接口类型(Interface)、类(Class);
引用在某种语义上等同于C\C++语言中的指针(Pointer),指向一个相应类型(类、数组、接口)的实例对象。
当一个引用类型不指向任何对象时,其值为一个特殊值:null。引用的默认值就是null。

1,数组类型(Array)
1、数组可以看成是多个相同数据类型数据的组合,对这些数据的统一管理。
2、数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。
3、数组中的元素可以是任何类型,包括基本类型和引用类型。

1.1、声明数组
type var[]; 或 type[] var;

例如:

int a1[];     
int[] a2;   
String s1[];

声明数组时不能指定其长度(数组中元素的个数),例如:
int a[5];  //非法
数组对象的创建:

1.2、创建数组
使用关键字new 创建数组对象,格式为:
数组名 = new 数组元素类型[数组元素个数];

例如:

int[] arr;
arr = new int[5];
for(int i=0;i<5;i++){
    arr[i] = i;
}
System.out.println(Arrays.toString(arr));

//元素为引用数据类型
Date[] date;
date = new Date[3];
for(int i=0; i<3; i++){
    date[i] = new Date(2014,10,25);
}
System.out.println(Arrays.toString(date));

注意:元素为引用数据类型的数组中的每一个元素都需要实例化

1.3、数组初始化:

1.3.1、动态初始化:

数组定义与为数组元素分配空间和赋值的操作分开进行,例如:

int[] arr = new int[3];        //数组定义
arr[0]=1;    //数组初始化
arr[1]=2;
arr[2]=3;

Date[] date = new Date[3];    //数组定义
date[0] = new Date(2014,10,25);        //数组初始化
date[1] = new Date(2014,10,25);
date[2] = new Date(2014,10,25);

1.3.2、静态初始化

在定义数组的同时就为数组元素分配空间并赋值,例如:

int a[] = {1,2,3};
Date[] date = {new Date(2014,10,25), new Date(2014,10,26), new Date(2014,10,27)};

1.3.3、默认初始化:

数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化,例如:

int[] a = new int[3];
System.out.println(a[2]);   //输出0

2、类(Class)

3、接口类型(Interface)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值