Java语法基础

48 阅读12分钟

关键字 标识符 注释 常量和变量 运算符 语句 函数 数组


关键字(起名字别用)

定义:被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

1char 型数据用来表示通常意义上'字符'(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;
或运算二进制位进行运算,只有00时结果是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];

其实不管多少维数组,都是二维数组,只不过是嵌套了多层,都是数组的数组,数组的元素仍旧是数组。

五、数组的内存模型