Java基本数据类型
基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型。它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一下与基本类型相关的知识。
基本类型共有八种,它们分别都有相对应的包装类。
基本类型可以分为三类,字符类型char,布尔类型boolean以及数值类型byte、short、int、long、float、double。数值类型又可以分为整数类型byte、short、int、long和浮点数类型float、double。JAVA中的数值类型不存在无符号的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。
1、未带有字符后缀标识的整数默认为int类型;未带有字符后缀标识的浮点数默认为double类型。
2、如果一个整数的值超出了int类型能够表示的范围,则必须增加后缀“L”(不区分大小写,建议用大写,因为小写的L与阿拉伯数字1很容易混淆),表示为long型。
3、带有“F”(不区分大小写)后缀的整数和浮点数都是float类型的;带有“D”(不区分大小写)后缀的整数和浮点数都是double类型的。
4、编译器会在编译期对byte、short、int、long、float、double、char型变量的值进行检查,如果超出了它们的取值范围就会报错。
5、int型值可以赋给所有数值类型的变量;long型值可以赋给long、float、double类型的变量;float型值可以赋给float、double类型的变量;double型值只能赋给double类型变量
表达式和运算符
(一) 运算符
对各种类型的数据进行加工的过程成为运算,表示各种不同运算的符号称为运算符,参与运算的数据称为操作数,按操作数的数目来分,可有:
◇ 一元运算符:++,--,+,-
◇ 二元运算符:+,-,>
◇ 三元运算符:?:
基本的运算符按功能划分,有下面几类: 1 算术运算符: +,―,*,/,%,++,――。 例如: 3+2; a-b; i++; --i;
2 关系运算符: >,<,>=,<=,==,!=。 例如: count>3; I==0; n!=-1;
3 布尔逻辑运算符: !,&&,|| 。 例如: flag=true; !(flag); flag&&false;
4 位运算符: >>,<<,>>>,&,|,^,~。
例如:
a=10011101; b=00111001;
则有如下结果: a<<3 =11101000;
a>>3 =11110011 a>>>3=00010011; a&b=00011001; a|b=10111101; ~a=01100010; a^b=10100100;
5 赋值运算符 =,及其扩展赋值运算符如+=,―=,*=,/=等。 例如: i=3;
i+=3; //等效于i=i+3; 6 条件运算符 ? :
例如:result=(sum= =0 ? 1 : num/sum); 7 其它:
包括分量运算符· ,下标运算符 [],实例运算符instanceof,内存分配运算符new,强制类型转换运算符 (类型),方法调用运算符 () 等。例如:
System.out.println("hello world"); int array1[]=new int[4];
运算符
(二)表达式
表达式是由操作数和运算符按一定的语法形式组成的符号序列。一个常量或一个变量名字是最简单的表达式,其值即该常量或变量的值;表达式的值还可以用作其他运算的操作数,形成更复杂的表达式。 1.表达式的类型
表达式的类型由运算以及参与运算的操作数的类型决定,可以是简单类型,也可以是复合类型: 布尔型表达式: x&&y||z; 整型表达式: num1+num2; 2.运算符的优先次序
表达式的运算按照运算符的优先顺序从高到低进行,同级运算符从左到右进行:
优先次序
运算符 1 . [] ()
2 ++ -- ! ~ instanceof
3 new (type) 4 * / % 5 + - 6 >> >>> << 7 > < >= <= 8 = = != 9 & 10 ^ 11 | 12 && 13 || 14 ?:
15 = += -= *= /= %= ^= 16
&= |= <<= >>= >>>=
例如,下述条件语句分四步完成:
Result=sum==0?1:num/sum;
第1步:result=sum==0?1:(num/sum) 第2步:result=(sum==0)?1:(num/sum) 第3步:result=((sum==0)?1:(num/sum)) 第4步:result=
类型转换
⑴自动转换
具体地讲,当一个较“小”数据与一个较“大”的数据一起运算时,系统将自动将“小”数据转换成“大”数据,再进行运算。而在方法调用时,实际参数较“小”,而被调用的方法的形式参数数据又较“大”时(若有匹配的,当然会直接调用匹配的方法),系统也将自动将“小”数据转换成“大”数据,再进行方法的调用,自然,对于多个同名的重载方法,会转换成最“接近”的“大”数据并进行调用。
这些类型由“小”到“大”分别为 (byte,short,char)--int--long--float—double。这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。
请看下面的示例:
①下面的语句可以在Java中直接通过:
byte b; int i=b; long l=b; float f=b; double d=b;
②如果低级类型为char型,向高级类型(整型)转换时,会转换为对应ASCII码值,例如
char c='c'; int i=c;
System.out.println("output:"+i);
输出:output:99;
③对于byte,short,char三种类型而言,他们是平级的,因此不能相互自动转换,可以使用下述的强制类型转换。
short i=99 char c=(char)i;
System.out.println("output:"+c);
输出:output:c;
④对象多态中若有方法: f(byte x){……}; f(short x) {……}; f(int x) {……}; f(long x) {……}; f(float x) {……}; f(double x) {……};
又有:char y=’A’;那么,语句f(y)会调用哪一个方法呢?答案是:f(int x) {……}方法,因为它的形参比实参“大”且是最“接近”的。
而对于方法: f(float x) {……}; f(double x) {……};
(window.cproArray = window.cproArray || []).push({ id: "u3054369" }
又有:long y=123L;那么,语句f(y)调用的方法则是f(float x) {……}。
⑵强制转换
将“大”数据转换为“小”数据时,你可以使用强制类型转换。即你必须采用下面这种语句格式: int n=(int)3.14159/2;
可以想象,这种转换肯定可能会导致溢出或精度的下降。 注:
①当字节类型变量参与运算,java作自动数据运算类型的提升,将其转换为int类型。
byte b; b=3;
b=(byte)(b*3);//必须声明byte。 ②带小数的变量默认为double类型。
float f;
f=1.3f;//必须声明f。
⑶包装类过渡类型转换
一般情况下,我们首先声明一个变量,然后生成一个对应的包装类,就可以利用包装类的各种方法进行类型转换了。例如: ①当希望把float型转换为double型时: float f1=100.00f; Float F1=new Float(f1);
double d1=F1.doubleValue();//F1.doubleValue()为Float类的返回double值型的方法
②当希望把double型转换为int型时: double d1=100.00;
Double D1=new Double(d1); int i1=D1.intValue();
简单类型的变量转换为相应的包装类,可以利用包装类的构造函数。即:Boolean(boolean value)、Character(char value)、Integer(int value)、Long(long value)、Float(float value)、Double(double value)
而在各个包装类中,总有形为××Value()的方法,来得到其对应的简单类型数据。利用这种方法,也可以实现不同数值型变量间的转换,例如,对于一个双精度实型类,intValue()可以得到其对应的整型变量,而doubleValue()可以得到其对应的双精度实型变量。
3.字符串与其它类型间的转换 ⑴其它类型向字符串的转换
①调用类的串转换方法:X.toString(); ②自动转换:X+“”;
③使用String的方法:String.volueOf(X);
⑵字符串作为值,向其它类型的转换
Java二维数组的声明、初始化和引用
二维数组的声明、初始化和引用与一维数组相似,这里不再详讲。 二维数组的定义 type arrayName[ ][ ]; type [ ][ ]arrayName;
只是形式上的差别,大家可以根据自己的习惯来选择。 二维数组的初始化 1.静态初始化
int intArray[ ][ ]={{1,2},{2,3},{3,4,5}};
Java语言中,由于把二维数组看作是数组的数组,数组空间不是连续分配的,所以不要求二维数组每一维的大小相同。
2.动态初始化
1) 直接为每一维分配空间,格式如下:
arrayName = new type[arrayLength1][arrayLength2]; int a[ ][ ] = new int[2][3];
2) 从最高维开始,分别为每一维分配空间: arrayName = new type[arrayLength1][ ]; arrayName[0] = new type[arrayLength20]; arrayName[1] = new type[arrayLength21];
arrayName[arrayLength1-1] = new type[arrayLength2n];
3) 例:
二维简单数据类型数组的动态初始化如下: int a[ ][ ] = new int[2][ ]; a[0] = new int[3]; a[1] = new int[5];
对二维复合数据类型的数组,必须现金网96y.org首先为最高维分配引用空间,然后再顺次为低维分配空间。而且,必须为每个数组元素单独分配空间。例如: String s[ ][ ] = new String[2][ ];
s[0]= new String[2];//为最高维分配引用空间 s[1]= new String[2]; //为最高维分配引用空间
s[0][0]= new String(Good);// 为每个数组元素单独分配空间 s[0][1]= new String(Luck);// 为每个数组元素单独分配空间 s[1][0]= new String(to);// 为每个数组元素单独分配空间 s[1][1]= new String(You);// 为每个数组元素单独分配空间 二维数组元素的引用
对二维数组中的每个元