前言:
Java数据类型和C的有什么相同和不同之处。
Java变量和常量有什么特殊之处。
Java不同类型的数据+-*/之间有什么不一样的秘密。
为什么又说Java是 Write once,Run anywhere?
Java数据类型:
Java数据类型分为两种:
与C语言不同点:
1、Java中多了两个类型,一个是字节型byte,一个是布尔型。
2、Java中字符型char占2个字节,字节型占1个字节。
3、整形和浮点型都是带有符号的
4、整型默认为int型,浮点型默认为double
5、Java中无论是32位机器还是64位,这些类型的大小是不变的,同时也就可以说明Java:Write once,Run anywhere。(不论是在16位系统还是32位系统,int都占用4个字节,long都占8个字节)
Java变量:
定义变量语法格式:
数据类型 变量名 = 初始值 ;
变量名和初始值的数据类型必须匹配。
public static void main(String[] args) {int i = 7.2;float b = 8.3;System.out.println(i);System.out.println(b);}
如果这样写是不对的,原因很简单,由于浮点型7.2默认为double类型,所以类型不匹配了。
但是,如果是这样:
public static void main(String[] args) {long i = 7;float b = 3;double c = 4;System.out.println(i);System.out.println(b);System.out.println(c);}
如果左边的变量是比右边初始值的占用内存大或者相等,也是可以存的,因为存的下,只是右边的数会进行提升,提升成和左边一样的大小。
整型变量常见的错误:
在sout之前变量必须赋值!
这样是不可以的:
这样是可以的:
当然如果想要打印int类型的最大值和最小值,可以这样:
System.out.println(Integer.MIN_VALUE);System.out.println(Integer.MAX_VALUE);
Integer是int的封装,后面会讲解。
长整型变量常见的错误:
一般我们为了区分长整型和整型,我们一般在初始值的后面加上L
例如:
public static void main(String[] args) {int i = 10;long a = 20L;System.out.println(a);System.out.println(i);}
字符型变量:
Java中字符型变量初始化和C语言是一样的,都是用单引号引起来,不同点是Java中字符型占2个字节,也就是字符的数量比C要多,所以Java采用的是Unicode表示字符,而C语言中采用的是ASCALL表表示字符。
Java中可以表示字符的范围更广,甚至可以表示一个汉字。
public static void main(String[] args) {char a = '好';System.out.println(a);}
布尔型变量:
这个变量在C语言中没有,C语言中只有bool返回值,而且0表示假,非0表示真。
但是在Java中没有这一说,Java中真就是true,假就是false。
例如:
public static void main(String[] args) {int b = 2;int c = 3;System.out.println(b == c);System.out.println(b > c);System.out.println(b < c);System.out.println(b != c);}
当然我们也可以定义变量:
类型转换:
自动类型转换:
int a = 100;
long b = 10L;
b = a; // a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值
a = b; // 编译报错,long的范围比int范围大,会有数据丢失,不安全
强制类型转换:
强制类型转换:当进行操作时,代码需要经过一定的格式处理,不能自动完成。特点:数据范围大的到数据范围小的。
例如:
public static void main(String[] args) {long a = 3L;int b = 2;b = (int)a;}
注意事项:
1. 不同数字类型的变量之间赋值 , 表示范围更小的类型能隐式转换成范围较大的类型2. 如果需要把范围大的类型赋值给范围小的 , 需要强制类型转换 , 但是 可能精度丢失3. 将一个字面值常量进行赋值的时候 , Java 会自动针对数字范围进行检查4. 强制类型转换不一定能成功,不相干的类型不能互相转换
类型提升:
1. int与long之间:int会被提升为long
例如:
public static void main(String[] args) {int a = 10;long b = 20;int c = a + b; // 编译出错: a + b==》int + long--> long + long 赋值给int时会丢失数据long d = a + b; // 编译成功:a + b==>int + long--->long + long 赋值给long}
2. byte与byte的运算
如果是byte和byte之间进行运算,会不会报错呢?
例如:
public static void main(String[] args) {byte a = 10;byte b = 20;byte c = a + b;System.out.println(c);}
发现其实是会报错的。
结论:
byte 和 byte 都是相同类型 , 但是出现编译报错 . 原因是 , 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算 , 得到的结果也是 int, 这是赋给 c, 就会出现上述错误 .
字符串类型:
字符串类型在Java中比较特殊,在C语言中没有字符串类型,只有字符类型,用字符数组存字符串,但是在Java中有字符串类型!
当然字符串不仅能打印,还能进行拼接:
字符串+字符串就是将两个字符串进行拼接。
public static void main(String[] args) {String s1 = "hello";String s2 = " world";System.out.println(s1);System.out.println(s2);System.out.println(s1+s2); // s1+s2表示:将s1和s2进行拼接}
int转成string
int num = 10;
// 方法1
String str1 = num + "";
// 方法2
String str2 = String.valueOf(num);
string转成int
String str = "100";
int num = Integer.parseInt(str);