1.1. 字符编码集(码表)
ASCII:英文码表,每个字符占1个字节,256个字符。A是65,a是97
GB2312-80:80年代版本,兼容ASCII,包含中文,是GBK的早期版本,后收入简体字成为GBK。
BIG5:台湾地区使用。早期台湾游戏要经过转码,否则会出现乱码。
Unicode:国际码表,每个字符占2个字节,十六进制表示,65536个字符,有位置是空着的。Java中存储char类型就是使用的Unicode编码。90年开始研发,94年正式公布。
UTF-8:国际码表,英文占1个字节,中文占3个字节。
2. Java语法
2.1. 基本格式
所有Java代码都应该在一个class(类)中。
Java是严格区分大小写的。 (java是自由格式的语言,怎么理解?)
Java代码分为结构定义语句和功能执行语句。结构定义语句以大括号 { } 结束。功能执行语句最后必须以分号 ; 结束。
2.2. 进制
计算机中数据在硬盘上都是以二进制方式存储的。
为什么不使用十进制保存呢?假使使用十进制,用的电压段多,判断次数多降低效率。
高低电平(作为了解)
电池电压1.5V;民用电压220V;工业电压380V
0—2.4V 低电平 0
3.6—5.4V 高电平 1
计算机只检测3.6V,大于这个值——高电平;低于这个值——低电平。这是一个大小而不是有无的问题。
Ø 十进制
由0到9的数字组成,逢十进一
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
Ø 二进制
由0和1组成,逢二进一
计算机中存储任何数据都是以二进制的形式进行存储的
0 1 10 11 100 101 110 111 1000
Ø 八进制
由0到7的数字组成,逢八进一
八进制在程序中以0开头(以零开头标记)
0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20
Ø 十六进制
由0到9的数字和A-F的字母组成,逢十六进一
十六进制在程序中以0x开头(以零X开头标记)
0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20
2.2.1. 进制之间转换
a. 十进制转二、八、十六进制
除法取余,不断除以进制数,取余数,直到商数等于0为止。将所有余数从下往上反转列出就是对应的二进制表现形式。
b.二、八、十六进制转十进制
乘法,将要转换进制编号,编号从0开始,每一位的数乘以进制数的编号次幂,将所有结果相加就是十进制表现形式。
例:二进制数10010转十进制
10010=1*2^4 + 1*2^1 + 0 =18
八进制数012345转十进制
012345=1*8^4 +2*8^3+3*8^2+4*8^1+5*8^0 = 534
十六进制0x3af转十进制
0x3af=3*16^2+10*16^1+15*16^0=943
2.2.2. 特殊转换:
c.二进制和八进制互转
八进制的每一位对应二进制的三位。
例:二进制数110011111转八进制
110011111→110—011—111→6—3—7,加上八进制的标记“0”,所得的八进制数:0637
从低位开始划,三位划一格,高位没有就用0补。
a. 二进制和十六进制互转
十六进制的每一位对应二进制的四位。
例:二进制110011111转十六进制
11001111→0001—1001—1111→1—9—f,加上十六进制的标记“0x”,所得的十六进制数:0x19f
2.2.3. 负数的进制表现形式
算机中存储的二进制数最高位是0则是正数,是1则是负数。
计算一个负数的二进制表现形式就是这个负数忽略符号的正数对应的二进制“取反加一”
正数的原码、反码、补码都是其本身
负数原码:是其本身;反码:是其每一位取反;补码:反码+1;
二进制加减乘除(作了解,不整理)
2.3. 注释
·单行注释: // 注释内容
·多行注释: /* 注释内容 */
多行注释不能嵌套多行注释,例:/*..../*......*/.......*/,因为java会自动寻找*/截止,多余出来的.......*/编译时会报错。
·文档注释是Java中特有的一种注释,它可以通过JDK中的工具(javadoc.exe)解析,生成HTML格式的帮助文档。
格式: /** 注释内容 */ ,使用时注意,不能/* *.........*/ 格式(**中间多了一个空格)。
好的注释习惯会增加你面试成功机会。或许你的项目经理因为你良好的注释习惯而留下你。
为什么注释符号是会是 / * 呢?
答:开发人员发现,在键盘数字区,有除号/ 和乘号*两个键,非常方便操作。
2.4. 标识符
Ø 什么是标识符
可以理解为程序中我们自定义的一些名称,包括:包名、类名、接口名、函数名、变量名、常量名。
2.4.1. 标识符命名规则
命名符号:大小写字母(a-z、A-Z)、数字(0—9)、下划线 _ 和 美元符号 $ 。共有64个
规则:开头不能是数字、不能使用关键字。
思考:为什么不能以数字开头?
答:如果以数字开头,1F、23L,JAVA读取第一位是数字就认为是数字而不是标识符,数字的特殊格式决定了不能第一位是数字。
大家以后使用标示符的时候,尽量使用全英文。
例:_1_2_3 (对)
______ (对)
$_$ (对)
bye() (错)
#_# (错)
问:class 是关键字么?
答:不是,对应java中特定功能。
2.4.2. 标识符通用规范
类名、接口名:
所有单词首字母大写,驼峰式命名,例如:XxxYyyZzz
变量名、函数名:
第一个单词首字母小写,其他单词首字母大写,例如:xxxYyyZzz
常量名:
所有字母都大写,单词之间用下划线 _ 链接,例如:XXX_YYY_ZZZ
包名:
全部小写,例如:xxx.yyy.zzz
2.5. 关键字
JAVA中有49个关键字,标志符中不能使用关键字。
2.6. 数据类型
定义:简单来说,数据类型是计算机内数据的储存格式。
相同格式的数据对应的数据类型一定相同。
不同格式的数据对应的数据类型一定不相同。
JAVA中,数据类型分为两个大类:基本数据类型和复合数据类型
问:JAVA有几种数据类型?
答:两种。基本数据类型、复合数据类型。
2.6.1. 基本数据类型
a.基本数据类型: 8种
整型:
byte 1个字节,最小值:-128,最大值:127 0
short 2个字节,最小值:-32768,最大值:32767 0
int 4个字节,最小值:-2147483648,最大值:2147483647 0
long 8个字节,最小值:- 9223372036854775808,最大值:9223372036854775807 0L
浮点型:
float 4个字节,最小值:1.4E-45,最大值:3.4028235E38 0.0F
double 8个字节,最小值:4.9E-324,最大值:1.7976931348623157E308 0.0D
字符型:
char 2个字节,最小值:0,最大值:65535 Unicode字符 \u0000 ~ \uffff
布尔型:
boolean 1个字节,true或false
b.引用数据类型:
类、接口、数组都是引用数据类型,除了8种基本数据类型,其他所有类型都是引用数据类型。
思考:为什么要划分int \short\byte\long数据类型呢?
2.7. 常量
程序执行过程中保持不变的量。
共分五类:整型常量;实型常量;布尔型常量;字符型常量;字符串常量
一个特殊的常量:null
2.7.1. 整型常量
表示所有的整数,常用十进制,八进制,十六进制形式表示,而且有正负之分。
long型常量必须带有后缀l(或L)。
默认整数都是int类型。
例:4122 默认情况下是int类型。
2.7.2. 实型常量
表示所有的浮点数(小数)。
实型常量分为两种:
·单精度实数(float),数字后面加字符f(或F)
·双精度实数(double) ,数字后面加字符d(或D或省略)
实型常量(小数)如无字母标识,默认为双精度实数。
例如:3.14 默认情况下是double类型。
实型常量表示形式分两种
十进制:由数字与小数点组成 0.12 .12 12. 12.0
科学计数法:1.23e3 123E1 12.3e2 0.123E4 -5E9 2.5E2 31415926e-7
2.7.3. 布尔型常量
真(true)或假(false),1个字节。
2.7.4. 字符型常量
·用单引号括起来的单个字符。占2个字节。
‘a’ ‘A’ ‘@’ ‘1’ ‘x’ ‘&’
注:System.out.print(‘’);//编译报错。加入一个空格可以。
System.out.println('\u2288');// ? \u Unicode转义字符,打印对应的Unicode值。
System.out.println(‘1’);
System.out.println(1);//两行打印结果是一样的,但是在内存中存储格式是不一样的,‘1占’2个字节,1 占4个字节。
·转义字符
在字符常量中,斜杠(\)是转义字符,具有特殊的含义。
\’ \” \\ \n \r \b \t
详细含义:
'\r' 光标移动到行首
'\n' 光标移动到下行
'\t' 制表占位符,不足8位补齐,超过8位重新开始计算
'\b' 光标退格,替换当前内容
例:abcef\b\b1 →abc1f
转义字符 \ 无法直接表示,必须加上一个斜杠 \ 来才能显示。
例:想要打印e:\program files\drivers
必须:System.out.printlt(“e:\\program files\\drivers”);
2.7.5. 字符串型
是由字符加上“”组成的,可以包含任意数量的字符(包括0个)。
例:“jock” “theme” “class” “hello world”
0个字符的字符串叫空字符串。
例:System.out.println(“”);//与字符规范不同,字符串允许打印空字符串。
注:字符串中如需表示引号字符,需添加转义字符。
“今年北京流行\“PM2.5\”微小颗粒” “我就是传说中的\“IT男\””
而且双引号中允许出现单引号,转义字符+单引号的写法也可以。
2.7.6. null常量(作为了解)
null常量描述了一个不存在的引用。
System.out.print(null);//编译报错
String s=null;System.out.println(s);//编译通过
2.8. 变量
程序执行过程中,变量值可以改变,是在内存中开辟的一片空间,对应内存中的一块存储区域。(对内存的一种描述)
不同的变量对应内存中不同的储存结构就是数据类型(数据在内存中的格式)。
变量在内存中地址都是以16进制保存的。
Java中的同一类型变量中只能存储同一种类型的数据。
变量在被取值之前必须初始化(第一次给变量赋值)。
2.8.1. 变量定义规则
命名一定要有意义,以后命名尽量使用 numOne,numTwo 不要使用a,b,c这样的的命名方式。
数据类型 变量名;
例:int a ;
数据类型 变量名1,变量名2;
例:int a,b;
数据类型 变量名 = 值;
例:double d = 2.0d;
数据类型 变量名1 = 值1,变量名2 = 值2…;
例:boolean b = true, bb;
数据类型 变量名1,变量名2 = 值,变量名3…;
例:int a,b =2, c;
2.8.2. 变量作用域
变量的作用域即从变量定义位置开始,到其所在的大括号 {} 结束处。
System.out.println(xiaoShu);
double xiaoShu= 23D;//编译报错,找不到符号
2.8.3. 变量的作用域与生命周期
作用域:变量定义在哪一级大括号中,哪个大括号的范围就是这个变量的作用域。相同的作用域中不能定义两个同名变量。
生命周期:变量的生命周期从定义时开始,超出作用域后结束。变量生命周期以外不能使用。
2.9. 数据类型转换
将一种数据类型转换成另一种数据类型。
数据类型转换的前提:数据的类型必须可转换(兼容)。例:boolean和int无法转换。
2.9.1. 隐型/自动 类型转换/造型 (系统自动完成)
在byte、short、char参与运算的时候会自动提升为int,相当于将一个占空间较小的值放入了一个较大的空间。
例:
int x = 1; x与y类型不同,运算时先
long y = 2; 将x的类型转换成y的类型,
y = x + y; 然后再进行运算
int a = 10; a与d类型不同,赋值时先
long d; 将a的类型转换成d的类型,
d = a; 然后再进行赋值
byte b;
b=1+2;
S.o.p(b);//编译通过没有问题
当只有常量参与运算且不超过范围情况下,自动转换。
byte b;
byte bb=126;
b=bb+1;//编译报错,有变量参与,表达式int,无法自动转换。
2.9.2. 显型/强制 类型转换/造型 (手工完成)
可以将一个占空间较大的值使用(类型)的形式强制放入一个较小的空间,有可能损失精度。
例:
int a = 10;
long d = 20L;
a = (int)d;
int x = 1;
long y = 2;
x =(int)( x + y);
面试题:
byte a =1;
int b=2;
long c=(byte)(a+b) ;//编译通过没有问题
注:当转换前对应的数据所表示的范围在转换后的类型范围内时,转换完成后与原始数据数据域转换后数据相同。
否则强制类型转换后数据有可能与原始数据没有任何关系。
2.9.3. 字符串转换
任何值和字符串相加都会得到字符串。
2.9.4. 数据类型转换总结
Ø 赋值运算时:
·如果表达式只有常量,则在不超过变量数据范围情况下,不同数据,发生隐式转换。
例:short s=1;
short ss=s+1;//编译通过
·如果表达式类型比变量的类型低时,发生隐式转换。
例:float f = 35L;
·如果表达式的类型比变量的类型高时,必须手动转换。
例:short s =(short)10;
·实型转换整型时必须使用强制造型,结果取实型整数部分。(小数变整数当然只取整数部分)
例:long a =(long) 12.53F;//结果12
long a =(long)12.53e2F;//结果1253
Ø 二元运算时:
·类型不同,低转高,再运算。
例:float f=1.5f;
int a =10;
float ff=f+a;//通过编译,表达式先自动提升为float再进行赋值操作。
·运算结果不足int(必须有变量参与运算),自动提升为int
例:面试题
short a=2;
byte b=1;
short res= b+c;
S.o.p(res);//编译报错,需要short,找到int
2.9.5. 数据类型转换与算术运算的关系
两个要点:
·当参与算术运算的两个操作数类型不同时,低类型转换为高类型。
·当运算过程中有变量参与时,运算结果类型不足int升为int。
·如果表达式只有常量,则在不超过变量数据范围情况下,类型不同会发生自动转换。
高类型与低类型
byte
short
int
long
float
double
float与double类型转换成整型时只取整数部分