本文是学习Java时所记录的学习笔记,本节包含了Java数据类型、基本运算、流程控制和数组的使用,是从《疯狂Java讲义第四版》中学习,提取了部分我觉得是重点的内容。欢迎留言、私信交流~~
文章目录
数据类型和运算符
Java是一门强类型语言。强类型包含两方面的含义:
- 所有变量必须先声明、后使用
- 指定类型的变量只能接受类型与之匹配的值
数据处理常用的语法
注释
Java语言的注释一共有三种:
- 单行注释:在需要注释的内容前面加上
//
- 多行注释:以
/*
开始,到*/
结尾,中间内容就是注释 - 文档注释:以斜线后紧跟两个星号
/**
开始,到*/
结尾,中间内容就是文档注释
API文档下载
- 访问 http://www.oracle.com/technetwork/java/javase/downloads/index.html
- 找到“Additional Resources”,在里面下载。
提取开发程序的注释生成API文档:
- 新建xxxTest.java类(xxx为自定义名字),增加文档注释
- 在xxxTest.java类所在的文件目录下,执行cmd命令:
//这一条只会提取文档注释
javadoc -d apidoc -windowstilte 测试 -doctitle 学习javadoc工具的测试API文档 -header 我的类 *Test.java
//使用-version和-author后,会提取“@”的注解
javadoc -d apidoc -windowstilte 测试 -doctitle 学习javadoc工具的测试API文档 -header 我的类 -version -author *Test.java
//指定对lee包和yeeku包生成API文档(包里面可以有package.html包描述文件)
javadoc -d apidoc -windowstilte 测试 -doctitle 学习API文档 -header 我的类 lee yeeku
- 此时java文件所在目录下,会新生成一个apidoc文件夹,文件夹里的内容就是生成的API文档。
javadoc常用标记 | 说明 |
---|---|
@author | 指定Java程序的作者 |
@version | 指定源文件的版本 |
@deprecated | 不推荐使用的方法 |
@param | 方法的参数说明信息 |
@return | 方法的返回值说明信息 |
@see | “参见”,用于交叉参考的内容 |
@exception | 抛出异常的类型 |
@throws | 抛出的异常,和exception相同 |
注意:标记使用的位置有限制
标识符和关键字
名称 | 说明 |
---|---|
分号 | 语句结尾采用分号“;”。 |
花括号 | 作用是定义一个代码块“{}”,成对出现。 |
方括号 | 主要作用是访问数组元素“[]”。 |
圆括号 | 定义方法、调用方法时会用到,用途很多“()”。 |
空格 | 分隔一条语句的不同部分。 |
圆点 | 通常作为类/对象和他的成员之间的分隔符“.”。 |
- Java语言区分大小写。
- Java一共50个关键字。
数据类型
Java语言支持的变量类型有两种
- 基本类型(Primitive Type)
- 引用类型(Reference Type)
基本类型包括
- boolean类型
- 数值类型
- 整数类型(byte、short、int、long、char)
- 浮点类型(float和double)
引用类型包括:
- 类
- 接口
- 数组类型
- 特殊的null类型(空类型(null type):特殊直接量。可以转换为任何引用类型。)
基础数据类型
基础数据类型 | 说明 |
---|---|
整数类型 | byte(1个字节)/short(2个字节)/int(4个字节)/long(8个字节) |
字符类型 | char(2个字节) |
浮点类型 | float(4个字节)/double(8个字节) |
布尔类型 | boolean |
数据类型原则
- 二进制转换为十进制:补码-反补-原码
- 字符型必须使用单引号“’”括起来。
- char是单引号,单字符。String是字符串双引号,字符串。
- 如字符串中包含特殊字符,应使用转义字符的表示形式,比如“\”写成“\”。
- double类型数值占8字节64位
- float类型数值占4字节32位
- 浮点数除以0可以得到正无穷大或负无穷大。
- 除以0异常:ArithmeticException:/by zero
- JAVA7中引入了新功能:可以在数值中使用下划线。
- boolean类型数值只有两个:true和false
- 数值类型转换方式有两种:
- 自动类型转换
- 强制类型转换:(targetType)value
- 二进制最左边的1位是符号位,1就是负数,0就是正数。
- ASCII(American Standard Code for Information Interchange,美国信息互换标准代码,ASCⅡ)
基本运算语句
算数运算符 | 说明 |
---|---|
+ | 加法运算符也可作为字符串的连接运算符。 |
- | 减法运算符也可可作为求负运算符。 |
* | 乘法运算符。 |
/ | 除法运算符。 |
% | 求余运算符。 |
++ | 自加1。放在左边表示先参与运算再自加1,放在右边表示先自加1再参与运算。 |
– | 自减1。和自加效果相似。 |
其他复杂运算符例如乘方、开方等运算 | 可以借助java.lang.Math类的工具方法完成。 |
赋值运算符 | 说明 |
---|---|
= | 将一个直接量值赋给变量。 |
位运算符 | 说明 |
---|---|
& | 按位与。同时为1返回1。 |
| | 按位或。一位是1返回1。 |
~ | 按位非。全不取反(包括符号位)。 |
^ | 按位异或。相同返回0,不同返回1。 |
<< | 左移运算符。例如5<<2表示5的二进制左移两位,右边用0填充。 |
>> | 右移运算符。右移制定位数,多出的部分用符号位填充。和左移运算符相似。 |
>>> | 无符号右移运算符。和右移运算符相似,只不过多出的部分用0填充。 |
逻辑运算符 | 说明 |
---|---|
&& | 与。前后两个操作数必须都是true才返回true,否则是false。 |
& | 不短路与。 |
|| | 或。只要有一个是true,就可以返回true。 |
| | 不短路或。 |
! | 非。取相反。 |
^ | 异或。两个不相同才返回true,相同返回false。 |
三目运算符 | 说明 | 示例 |
---|---|---|
?: | 先执行expression求值,如果为true,则返回“:”前面部分。如果为false,则返回“:”后面部分。三目运算符是作为if else的精简写法 | (expression)?if-true-statement:if-false-statement; |
数据处理概念
- 表达式类型自动提升
- 一个表达式中包含多个基本类型值时,会自动提升到表达式中最高等级的类型。等级高低如下:
char>int>long>float>double byte>short>int>long>float>double
- 一个表达式中包含多个基本类型值时,会自动提升到表达式中最高等级的类型。等级高低如下:
- 强制转换类型
- 从高等级转向低等级时需要使用强制类型转换。可以直接加(int),或者通过基本类型对应的包装类转换字符串parseXxx(String str)。
- 移位运算遵循规则
- 低于int类型的自动转换为int类型/int类型移位数大于32时,先与32求余,结果才是真正移位的位数/long类型和int类型相似,大于64时。
- 单目运算符、赋值运算符和三目运算符是从右到左运算。
- 运算符优先级可以参考“运算符优先级表”,上一行优先于下一行
流程控制
两种基本的流程控制结构:分支结构和循环结构。
顺序结构
从上往下逐行执行。
分支结构
两种常见语句分别为“if”语句和“switch”语句
-
if语句
- 如果if、else if和else后面代码块只有一行语句时,可以省略花括号。
- 如果if括号中的表达式为真,则执行if下方的代码块
if(logic expression){ statement... }
-
if…else语句
- 如果if括号中的表达式为真,则执行if下方的代码块,否则执行else下方的代码块
if(logic expression){ statement... }else{ statement... }
-
if…else if…else语句
- 如果第一个if括号中的表达式为真,则执行第一个if下方的代码块。如果为假则执行第一个else后面的if语句。这时相当于进入了一个新的if判断逻辑
if(logic expression){ statement... }else if(logic expression){ statement... }else{ statement... }
-
switch语句
- case后面的花括号可以省略。
- 必须要有break;,否则后面的语句会不进行判断,强制执行。
- JAVA7,控制表达式只能是java.lang.String类型,不能是StringBuffer或StringBuilder。
- 先对expression求值,然后匹配conditon,匹配的话执行对应代码块,不匹配则执行default的代码块。
switch(expression) { case condition1: { statement(s) break; } case condition2: { statement(s) break; } default: { statement(s) } }
循环结构
循环语句包含初始化语句、循环条件、循环体和迭代语句。
- while
- 先判断条件,为真时执行循环体。为假则退出循环。
- 先对test_expression条件求值,如果为true,则运行循环体部分。
while(test_expression) { //具体业务代码 }
- do while
- 先执行循环体,执行后判断条件,为真重复执行,为假退出循环。
- do while的循环条件处必须有分号,这是和while不同的地方。
do { statement; [iteration_statement] }while (test_statement);
- for
- 先执行初始化语句,再判断循环条件,若为真执行循环体,若为假结束本次循环。若为真则在执行完循环体后执行循环迭代语句,接着开始循环。
- 循环迭代语句会执行一遍,并不会因为循环体中有结束本次次循环的命令而不执行。
- 建议不要在循环体内修改循环变量的值,容易造成死循环。
- 选择循环变量时,习惯选择i、j、k来做循环变量。
- [init_statement]代表初始化一个变量,[test_expression]代表表达式,如果这个表达式为真,则继续循环,如果为假则退出循环,[iteration_statement]代表初始化的变量每次循环后进行自增或自减操作
for([init_statement];[test_expression];[iteration_statement]) { statement; }
- foreach循环
- foreach中的循环变量相当于一个临时变量。
- 循环遍历数组和集合。type是数组元素或集合元素的类型,variableName是一个形参名,foreach循环自动将数组元素一次赋给该变量。
for(type variableName : array | colection) { //variableName自动迭代访问每个元素... }
控制循环结构
关键字 | 说明 | 详细说明 |
---|---|---|
break | 终止所在的循环,跳出循环体。 | 可以增加标签来指定结束到某个外层标签。例如:在最外层循环之前添加“outer:”,然后在内循环中添加“break outer;”,就表示跳出最外层循环。 |
continue | 结束本单次循环后面部分的语句,接着下一次循环。 | 和break一样,可以增加标签,如果增加在最外层循环的开始处,则表示结束外层循环的本次循环。 |
return | 结束方法 |
数组
数组概念
- 所有的数组元素都需要具有相同的数据类型。
- 通常使用type[] arrayName;这种语法来定义数组。
- 定义数组时不能指定数组的长度。
- 数组的初始化有两种方式:
- 静态初始化
- 动态初始化
- 数组索引是从0开始的。
- 数组初始化内容:
- 整数类型(byte、short、int和long):0
- 浮点类型(float、double):0.0
- 字符类型(char):’\u0000’
- 布尔类型(boolean):false
- 应用类型(类、接口和数组):null
定义数组
定义数组类型
定义数组
type[] arrayName;
type arrayName[];
arrayName = new type[length];
二维数组
type[][] arrayName; //定义二维数组
arrayName = new type[length][]; //初始化
//静态初始化二维数组
String[][] str1 = new String[][]{new String[3],new String[]{"hello"}};
String[][] str2 = {new String[3],new String[]{"hello"}};
内存中的数组
-
实际的数组对象被存储在堆内存中。
-
数组应用变量如果是局部变量,那么它被存储在栈内存中。
- 堆内存:程序中创建一个对象时,会把对象保存到运行时数据区中,这个运行时数据区就是堆内存。该区的对象不会随着方法结束而销毁。
- 栈内存:随着方法结束被销毁。
-
数组运行机制
- 数组分为两个部分,一个部分是数组引用,存储在内存中。还有一部分是实际的数组对象,这部分存储在堆内存中,只能通过数组引用变量来访问。
-
引用类型数组,引用类型的数组元素是引用。数组引用相当于是指针。
-
二维数组
- 二维数组的第一个括号中是引用类型,指向第二个括号中的存储空间。如果需要三维或更多维,则可以定义Object[]类型,便可以实现N维数组。
String[][]
-
二维数组初始化
- 因为二维数组的第二维是一维数组,所以需要指定多个一维数组来初始化。
int[][] a; a = new int[4][]; a[0] = new int[2]; a[0][1] = 6;
相关知识
当初学习时懵逼的问题
- p44 从哪里获得标记信息?
- 答:常用的javadoc标记信息可以从官方文档中获取。
- p50 较小整数值赋给byte或short变量,系统会自动把这个整数当成byte或者short类型来处理。
- 答:这就是自动类型转换的概念,整数、byte和short是相似的,只是长短不一样,所以他们之间可以互相转换,短一点的可以转换到长一点的,并且不会丢失内容。
参考资料
- 《疯狂Java讲义(第4版)》 李刚 第三章、第四章