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)