您的位置:首页 > 移动开发 > Android开发

【Android学习札记】数据类型

2016-05-20 12:37 471 查看
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
a6ac
[] = {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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 数据类型