《疯狂Java讲义(第4版)》-----第3章【数据类型与运算符】
Java的官方API下载
Java语言是一门强类型语言。强类型含义:
- 所有变量必须先声明,后使用;
- 指定类型的变量只能接受类型与之匹配的值
注释
//单行注释
/*
多行注释
*/
/**
*文档注释
*/
标识符
字母、下划线、美元符号、数字组成。字母、下划线、美元符号开头。(据说这里的字母不仅限于26个英文字母,)
标识符不能是Java关键字和保留字。也不能是true,false,null这三个直接量(literal)。保留字的意思是未来的Java版本中可能会使用的关键字,如goto,const。
数据类型
Java语言支持两种数据类型:基本类型(Primitive Type)和引用类型(Reference Type)
- 基本类型:boolean,byte,short,int,long,char,float,double
- 引用类型:类、接口、数组、null
整型(byte,short,int,long)
byte | 1个字节(-27~27-1) |
short | 2个字节(-215~215-1) |
int | 4个字节(-231~231-1) |
long | 8个字节(-263~263-1) |
- 整数默认是int类型
- 把较小的整数值(在byte,short范围内)赋给byte,short,系统会自动把这个整数值当成byte,short
- 直接把一个超过int范围的整数赋值给long类型变量,这个整数(int)不会自动转为long类型,会报错,因为Java还是认为这个数是int类型,超出了int表示的范围。正确处理方式是在这个整数后加L或l
- 二进制整数开头是0b或0B,八进制整数开头是0,十六进制数开头是0x或0X
字符型(char)
-
Java语言采用16位Unicode字符集作为编码方式(’\u0000’’\uFFFF’,前256个’\u0000’’\u00FF’和ASCII码对应)。char相当于无符号整型(0-65535)。
-
字符型三种写法:‘x’,’\’,’\u0a18’(四位十六进制数)
-
注意在路径中用\而不是用\,不然就当成转义字符处理了。
浮点型(float,double)
按照IEEE754标准
float:4个字节
double:8个字节
表示方法:5.12,5.12e2
- 用科学计数法表示的数哦都市浮点数
- 浮点数默认是double类型,float数必须末尾加F或f
- 浮点数从表示原理上只能精确到一定的精度,小数点后位数过多的时候就不能精确了
关于负无穷、正无穷、非数
public class HelloWorld{
public static void main(String[] args){
//正数除以0得到Infinity---必须是浮点数之间的运算
System.out.println(1.0/0);
//负数除以0得到-Infinity---必须是浮点数之间的运算
System.out.println(-1.0/0);
//0.0/0.0得到NaN(非数)
System.out.println(0.0/0.0);
//1/0报错java.lang.ArithmeticException: / by zero---不是浮点数之间的运算
//System.out.println(1/0);
//所有的正无穷都相等
System.out.println(1.0/0==Double.POSITIVE_INFINITY);
//所有的负无穷都相等
System.out.println(Double.NEGATIVE_INFINITY==Float.NEGATIVE_INFINITY);
//NaN不和任何数值相等,甚至两个非数不想等
System.out.println(Double.NaN==0.0/0.0);
System.out.println(Double.NaN==Float.NaN);
}
}
char c = 9_7;
//整型数可以用下划线分隔,位数多的时候方便看出多少位
System.out.println(c);
布尔型(boolean)
布尔型只有两个取值:true、false,不能用0或非0代表。boolean类型之间不能做算术运算。
下面代码将输出truefalse,boolean类型可以自动转成字符串!
String str = true + "" + false;
System.out.println(str);
基本类型的类型转换
自动类型转换
总体而言,小范围的可以自动转换成表示范围大的。就好比小瓶子里的水倒进大瓶子里面可以装得下。具体如下。
-
任何基本类型和字符串连接都会转换成字符串
-
字符串类型都可以通过八种基本类型的包装类的静态方法parseXxx(String s)转换成相应的基本类型
String str = "2.32"; double d = Double.parseDouble(str);
-
八种基本类型的包装类:Boolean,Byte,Short,Character,Integer,Long,Float,Double
-
表达式类型中数据类型的自动提升也是根据这个图。表达式的类型严格保持和表达式中最高等级操作数的类型相同。
强制类型转换
根据上面自动类型转换的图,逆过来得强制类型转换,可能会造成数据丢失。可以从底层数据二进制表示的原理进行解释。比如int转为byte,就是把int的低8位给了byte。
直接量
boolean b = true;
int a = 8;
char c = 'c';
long l = 2L;
float f = 2.3f;
double d = 2.3;
String str = "hello";
String s = null;
能进行直接量赋值的只有:八大基本类型、null、字符串。
字符串直接量的常量池
第一次使用字符串直接量时,Java会把这个字符串常量放在常量池里缓存起来,程序再次用到的时候就会直接使用这个字符串,不会再新建了。
public class HelloWorld{
public static void main(String[] args){
String s1 = "hello";
String s2 = "hello";
String s3 = "hell" + "o";
//输出true
System.out.println(s1==s2);
//输出true
System.out.println(s1==s3);
}
}
运算符
%:求余。求余也是要进行除法运算的,得到余数,所以当两个整数做求余运算的时候,除数为0会报错。
++,–:针对变量。不能用于表达式、直接量、常量。>>>
:无符号右移位。及其他移位具体细节用时再看课本深究吧
==:System.out.println(8==8.0);//返回true
&,|,^:这几个既是位运算符又是逻辑运算符!注意区别!
发现问题积累
在命令行运行程序,输出中文乱码怎么办?
命令行默认是GBK编码方式,可以设置成UTF-8方式编码。
查看当前编码方式(默认是936,即GBK方式):
C:\Users\xxx\Desktop>chcp
活动代码页: 936
修改成UTF-8(65001):
C:\Users\xxx\Desktop>chcp 65001
Active code page: 65001
现在再用命令行运行Java程序,打印中文字符串,就不会有乱码了。
随机生成小写英文字母组成的字符串的方法?
可以先随机生成小写字母,再拼起来。可以随机生成97-122之间的数,强转成char即可。下面以随机生成6位的字符串为例子完成代码:
public class HelloWorld{
public static void main(String[] args){
String str = "";
for(int i=0;i<6;i++){
int intValue = (int)(Math.random()*26+97);
str += (char)intValue;
}
System.out.println(str);
}
}
+=的奇妙?
byte a = 5;
a = a+5;//报错
byte a = 5;
a+=5;//正确,这就和+=符号底层设计有关了