关键字 标识符 注释 常量和变量 运算符 语句 函数 数组
关键字(起名字别用)
定义:被Java语言赋予了特殊含义的单词
特点:关键字中所有字母都为小写
标识符(遵循阿里巴巴编码规范)
程序中自定义的一些名称,变量名,类名,方法名等
首先必须是字符/数字/下划线/$/组成
不可以使用关键字、不允许以数字开头
严格区分大小写,这是Java的强语言特性
$为了规范不要使用,不是代码规定,但是建议别用。
规范的形式:
包名 :多单词组成时所有字母都小写。
xxx.yyy.zzz
类名、抽象类名、接口名、枚举名 :多单词组成时,所有单词的首字母大写。
XxxYyyZzz
变量名和函数名: 多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写。
xxxYyyZzz
常量名 :所有字母都大写。多单词时每个单词用下划线连接。
XXX_YYY_ZZZ
其它的代码规约,请遵照阿里巴巴编程规范,或《代码整洁之道》。
三种注释(代码记得写好注释)
注解说明解释程序的文字就是注释,简单说就是给人看,而不是给机器看的。
Java中提供了三种注释格式:
单行注释
格式: //注释文字
多行注释
格式: /* 注释文字 */
文档注释
格式:/** 注释文字 */
对于单行和多行注释,被注释的文字,不会被JVM(java虚拟机)解释执行。
对于文档注释,是java特有的注释,其中注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。注释是必须要做的,除非你的代码自注释非常好。
常量与变量
常量
常量表示不能改变的数值。
Java中常量的分类:
1,整数常量。所有整数
2,小数常量。所有小数
3,布尔(boolean)型常量。较为特有,只有两个数值。true或false。
4,字符常量。将一个数字字母或者符号用单引号( ' ' )标识。
5,字符串常量。将一个或者多个字符用双引号("")标识。
6,null常量。只有一个数值就是:null.
对于整数:有四种表现形式。
二进制:0,1 ,满2进1。用0b或0B开头表示
八进制:0-7 ,满8进1. 用0开头表示。
十进制:0-9 ,满10进1.
十六进制:0-9,A-F,满16进1. 用0x或0X开头表示。
负数的二进制表现形式为补码。
小数的存储,参考IEEE754标准。
变量
内存中的一个存储区域。
该区域的数据可以在同一类型范围内不断变化。
变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值。
为什么要定义变量:
用来不断的存放同一类型的常量,并可以重复使用。用于在内存中保存数据。
使用变量注意:
1、Java 中每个变量必须先声明,初始化值,后使用;
2、使用变量名来访问这块区域的数据;
3、变量的作用域:其定义所在的一对{}内;
4、变量只有在其作用域内才有效;
5、同一个作用域内,不能定义重名的变量;
在方法体外,类体内声明的变量称为成员变量。
在方法体内部声明的变量称为局部变量。
定义变量的格式:
数据类型 变量名 = 初始化值;
注:格式是固定的,记住格式,以不变应万变。
Java语言是强类型语言,对于每一种数据都定义了明确的具体数据类型,在内存总分配了不同大小的内存空间。
整数与小数
长整数要加L或者l
单精度的浮点数要加F或者f
char和boolean
1、char 型数据用来表示通常意义上'字符'(2字节)
2、Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。
3、字符型变量的三种表现形式:
字符常量是用单引号('')括起来的单个字符。例如:char c1 = 'a'; char c2 = '中'; char c3 = '9'。
Java中还允许使用转义字符''来将其后的字符转变为特殊字符型常量。例如:char c3 = '\n'; //'\n'表示换行符。
直接使用Unicode值来表示字符型常量:'\uXXXX'。其中,XXXX代表一个十六进制整数。如:\u000a 表示\n。
char类型是可以进行运算的。因为它都对应有Unicode码。
boolean 类型用来判断逻辑条件,一般用于程序流程控制:
if条件控制语句;
while循环控制语句;
do-while循环控制语句;
for循环控制语句;
boolean类型数据只允许取值true和false,无null。
不可以使用0或非0 的整数替代false和true,这点和C语言不同。
Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false用0表示。———《java虚拟机规范8版》
类型转换
自动类型转换/强制类型转换
byte a = 12;
byte b = 10;
byte c = a + b;//编译不通过
byte a = 12;
int b = 10;
byte c = a + b;//编译不通过
float a = 12.0f;
float b = 10;
float c = a + b;
double d = a + b;
char a = 'a';
char b = 98;
char a1 = a + b;//编译报错
int a2 = a + b;
char a = 'a';
byte d1 = 1;
byte d11 = a + d1;//编译报错
int d12 = a + d1;
short d2 = 2;
int d3 = 3;
short d22 = d2 + d3;//编译报错
int d23 = d2 + d3;
表达式的数据类型自动提升
byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型。
boolean类型不能与其它数据类型运算。
当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型。
如果一个操作数是long型,计算结果就是long型。
如果一个操作数是float型,计算结果就是float型。
如果一个操作数是double型,计算结果就是double型。
可以这么理解,double > float > long > 其他
从左到右,有左边的那就没右边的事儿了。其他里面不管是什么,都是int,也就是byte,short,char之间不相互转换,直接转成int类型参与运算。
short s=1, s = s+1; 编译不通过 1是int s+1自动提升为int int赋值给short 报错
short s=1, s+=1; +=是一个操作符,不涉及到类型的提升,也可以理解为相当于s = (short)(s + 1)
也就是隐含了自动强制转换
强制类型转换可能造成精度降低或溢出。
运算符
算术运算符/赋值运算符/比较运算符/逻辑运算符/位运算符/三元运算符
算术运算符
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1 但被模数是负数就另当别论。
换句话说是符号跟%前面的一致。
整数之间除号“/” 是取整。
“+”除字符串相加功能外,还能把非字符串转换成字符串,如果与字符串+ 可以当做是连接符。
赋值运算符
当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。
支持连续赋值。
= , +=, -=, *=, /=, %=
右边的赋值给左边变量 X= 运算符的形式,aX=b; 等同于a=aXb; X为+ - * / %
比较运算符
结果只有true或者false 两种
逻辑运算符
逻辑运算符用于连接布尔型表达式 Java中不可以写成1<x<8,应该写成x>1 & x<8 。
或只要有一个为真则为真
与两个都为真才为真
单个的不会短路,也就是无论如何两侧都会计算
双个的会短路 一旦结果可以推断出来,不在继续计算
异或是两个不同才为真
位运算符
直接对二进制进行运算
<< | 左移 | 空位补0,被移除的高位丢弃,空缺位补0。 | |||
---|---|---|---|---|---|
>> | 右移 | 被移位的二进制最高位是0,右移后,空缺位补0; 最高位是1,空缺位补1。 | |||
>>> | 无符号右移 | 被移位二进制最高位无论是0或者是1,空缺位都用0补。 | |||
& | 与运算 | 二进制位进行&运算,只有1&1时结果是1,否则是0; | |||
或运算 | 二进制位进行 | 运算,只有0 | 0时结果是0,否则是1; | ||
异或运算 | 相同二进制位进行 ^ 运算,结果是0;1^1=0 , 0^0=0 不相同二进制位 ^ 运算结果是1。1^0=1 , 0^1=1 | ||||
~ | 反码 |
一个数据针对另一个数据位异或两次,该数不变。
移位运算可以快速乘除2的N次方
三元运算符
运算符的优先级(从高到低)
如果在程序中,要改变运算顺序,可以使用()。
优先级 | 描述 | 运算符 | ||
---|---|---|---|---|
1 | 括号 | ()、[] | ||
2 | 正负号 | +、- | ||
3 | 自增自减,非 | ++、--、! | ||
4 | 乘除,取余 | *、/、% | ||
5 | 加减 | +、- | ||
6 | 移位运算 | <<、>>、>>> | ||
7 | 大小关系 | >、>=、<、<= | ||
8 | 相等关系 | ==、!= | ||
9 | 按位与 | & | ||
10 | 按位异或 | |||
11 | 按位或 | |||
12 | 逻辑与 | && | ||
13 | 逻辑或 | |||
14 | 条件运算 | ?: | ||
15 | 赋值运算 | =、+=、-=、*=、/=、%= | ||
16 | 位赋值运算 | &=、 | =、<<=、>>=、>>>= |
程序流程控制
顺序结构/选择结构(分支结构/判断结构)/循环结构
顺序结构
顺序就是自上而下按照顺序执行语句
选择结构
if语句
if语句控制的语句体如果是一条语句,是可以省略大括号的;如果是多条,不能省略。
建议永远不要省略。
当多个条件是“互斥”关系时,条件判断语句及执行语句间顺序无所谓当多个条件是“包含”关系时,“小上大下/ 子上父下”。
switch语句
switch语句选择的类型:byte,short,int ,char,JDK5增加枚举 ,JDK7增加String。
case后面只能是常量,不能是变量,而且,多个case后面的值不能出现相同的。
case之间与default没有顺序。先执行第一个case,没有匹配的case执行default。
结束switch语句的两种情况:遇到break,或者执行到switch语句结束。
如果匹配的case或者default没有对应的break,那么程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束。
default可以省略,但是最好不要,除非你很确定结果。
循环结构
while循环
do-while循环
for循环
虽然形式上三种循环可以互换,但是for中的变量结束后消亡,while中继续存活。
for更适合个数有限的,while更适合次数不明的。
while(true)和for(;;)是无限循环。
优先考虑使用for循环。
循环嵌套/break/continue/return
break(跳出),continue(继续) return 返回退出方法
break语句:应用范围:选择结构和循环结构。 中断当前
continue语句:应用于循环结构。跳出当次循环继续执行。
break和continue还可以带标签 ,但没有什么必要用。
数组
一、数组的概述
1.数组的理解:数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。也可以看成是一个容器。
2.数组的相关概念:
数组名
元素
角标、下标、索引
数组的长度:元素的个数
3.数组的特点:
1)数组属于引用类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。
2)创建数组对象会在内存中开辟一整块连续的空间;
3)数组的长度一旦确定,就不能修改;
4)数组是有序排列的。
4.数组的分类:
按照维数:一维数组、二维数组、三维数组……
按照数组元素类型:基本数据类型元素的数组、引用类型元素的数组
二、数组的使用
格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例:int[] arr = new int[5];
格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,……};
int[] arr = new int[]{3,5,1,7};
int[] arr = {3,5,1,7};
//1. 一维数组的声明和初始化
int num; //声明
num = 10; //初始化
int id = 1001; //声明 + 初始化
int[] ids; //声明
//1.1静态初始化:数组的初始化和数组元素的赋值操作同时进行
ids = new int[]{1001,1002,1003,1004};
//1.2动态初始化:数组的初始化和数组元素的赋值操作分开进行
String[] names = new String[5];
//错误的写法:
//int[] arr1 = new int[]; //未赋值、未指明长度
//int[5] arr2 = new int[5];
//int[] arr3 = new int[3]{1,2,3};
//也是正确的写法:
int[] arr7 = {1,2,3,5,4};//类型推断
三、数组的默认值
数组元素的默认初始化值
数组元素是整形:0
数组元素是浮点型:0.0
数组元素是char型:0或'\u0000',而非'0',即显示为空字符。
数组元素是boolean型:false
数组元素是引用数据类型:null
四、多维数组
格式1
数据类型[][] 变量名 = new 数据类型[m][n];
m表示这个二维数组有多少个一维数组
n表示每一个一维数组的元素个数
举例:
int[][] arr = new int[3][2];
定义了一个二维数组arr
这个二维数组有3个一维数组,名称是arr[0],arr[1],arr[2]
每个一维数组有2个元素,可以通过arr[m][n]来获取
表示获取第m+1个一维数组的第n+1个元素
格式2
数据类型[][] 变量名 = new 数据类型[m][];
m表示这个二维数组有多少个一维数组
这一次没有直接给出一维数组的元素个数,可以动态的给出。
举例:
int[][] arr = new int[3][];
arr[0] = new int[2];
arr[1] = new int[3]
arr[2] = new int[1];
格式3
数据类型[][] 变量名 = new 数据类型[][]{{元素…},{元素…},{元素…}};
简化版格式:
数据类型[][] 变量名 = {{元素…},{元素…},{元素…}};
举例:
int[][] arr = {{1,2,3},{4,6},{6}};
还有多维数组
int[][][][][][][] arr = new int[8][7][6][5][4][3][2];
其实不管多少维数组,都是二维数组,只不过是嵌套了多层,都是数组的数组,数组的元素仍旧是数组。