本系列文章仅仅用于自己的复习以及分享交流。它随着时间的推移,内容也会有所改变,假设这系列文章获得了一些回复,那我应该也会将其中有价值的内容做一些补充附录之类的东西。
目前这系列文章暂无明确的标题,等到它的结构较为明确的展现出来之后会再次补充。
Java是什么?
是一门高级编程语言。
Java是哪家公司研发的,现在属于哪家公司?
sun公司、Oracle公司。
Java之父是谁啊?
詹姆斯.高斯林 Java能做什么?
基本上什么都可以干,主要做互联网系统的开发。
Java有哪些技术平台?
JavaSE(标准版)、JavaEE(企业版)、JavaME(小型版)
1.什么是JDK?
JDK(Java Development Kit): Java开发工具包
2.JDK的作用?
必须安装JDK才能使用Java语言
PS.JDK中的LTS指的是?
long-term support:长期支持版
3.JDK的组成?
JDK由JVM,核心类库,开发工具组成。
1.JVM是什么?
Java Virtual Machine:Java虚拟机, 真正运行Java程序的地方。
2.核心类库是什么?
Java自己写好的程序,给程序员自己的程序调用的。
PS.JVM与核心类库构成了JRE。
JRE(Java Runtime Environment): Java的运行环境。
PSS.理解记忆的思路是:
因为“虚拟机”这东西在日常生活中可以拿来尝试运行一些不知是否安全的app什么的,因此自己搞出来的JAVA程序先在虚拟机(JVM)里运行一下也没什么问题。在学习的过程中会调用各种人家准备好的方法,例如Scanner之类的,所以在运行环境JRE中,核心类库也得有
3.开发工具是什么
java,javac等
PSSS.这里需要提到JAVA开发的三个步骤:编写代码,编译代码和运行代码
具体过程:
首先编写代码,生成一个源代码文件(.java),之后使用javac编译代码,得到一个字节码文件(.class)然后使用java运行代码。
也因此,JAVA能够跨平台是因为不同的操作系统能够提供不同的JVM。
名称 | 单行注释 | 多行注释 | 文档注释 |
样式 | //内容 | /*内容*/ | /**内容 */ |
快捷键(IDEA) | ctrl+/ | ctrl+shift+/ | /**+enter |
PS.注释在编译后的class文件中不存在。
1.变量是什么,有什么作用?
变量是内存中的一块区域。
其作用是存储一个数据的,且存储的数据可以被替换。
2.变量的格式是什么?
数据类型 变量名称 = 初始值;
3.变量的分类
1.局部变量 2.成员变量 2.1 实例成员变量 2.2 静态成员变量
1.数据类型的分类:
引用数据类型:String,自己写的类
基本数据类型:
数据类型 | 关键字 |
整数 | byte |
short | |
int(默认) | |
long | |
浮点数 | float |
double(默认) | |
字符 | char |
布尔 | boolean |
2.类型之间的转换
(1)自动类型转换
类型范围小的变量,可以直接赋值给类型范围大的变量。
【byte 其中:int类型 , 加上L/l就是long类型,double类型,加上F/f就是float类型 在表达式中,小范围类型的变量会自动转换成当前较大范围的类型再运算。 表达式的最终结果类型由表达式中的最高类型决定。 在表达式中,byte、short、char 是直接转换成int类型参与运算的。 (2)强制类型转换 类型范围大的数据或者变量,不能直接赋值给类型范围小的变量,会报错。 格式:数据类型 变量2 = (数据类型)变量1、数据 强制类型转换可能造成数据(丢失)溢出; 浮点型强转成整型,直接丢掉小数部分,保留整数部分返回。 3.变量的基本特点是什么? (1)变量中只能存一个值 (2)变量中存的值是可以替换的 PS.定义变量时需要注意的是: (1)变量要先声明再使用 (2)变量声明后,不能存储其他类型的数据。 比如假设int类型的变量不能存double类型的数据。 (3)变量定义的时候可以没有初始值,但是使用的时候必须给初始值。 比如说先随便定义一些 int a; int b; 之类的,但我想用a的时候它得有个值。 (4)变量存在访问范围、同一个范围变量名不能重复。 定义:在JAVA中有特殊作用的词。 比如public之类的 定义:说白了就是名字 取名规则: (1)由数字、字母、下划线(_)和美元符($)等组成 (2)不能以数字开头、不能是关键字、区分大小写 ps有关于什么驼峰模式我去找找看怎么弄比较好记 (1)十进制转二进制的算法:除二取余法 除了1B = 8b这种单位之外,我们还要了解一下,计算机中会有很多文件形式,比如文本,声音与图像 字符在计算机中的存储有例如ASCII编码表的方式 PS字符’A’对应的数字是 65 ,字符’a’对应的数字是 97 ,字符’0’对应的数字是 48。这些可以记一记,说不定有用(?) 图片由像素点组成,像素点的颜色的表示也有很多方法,比如百分之几,或者0 - 255*255*255 声音的波纹每一点可由二进制的数据表示 4.3.1.1 通用内容 定义:对字面量或者变量进行操作的符号。 内容:+,-,*,/,% PS.如果两个整数做除法,其结果一定是整数,因为最高类型是整数。 小案例题(后期案例应该也会整理出来) Q:请将一个三位数的个位,十位,百位拆分开,打印在控制台 解题思路:这个题就是要利用数据类型的特点和运算符来算 以574举例 对于百位来说,574/100得到的是5.74,但是因为int类型是整数,所以5就有了 对于个位来说,574%10得到的是(商570)余4 把十位先整到个位的位置上,再用个位的计算方法来算就好了 最后总结一下: 个位 :数值 % 10 十位 :数值 / 10 % 10 百位 :数值 / 10 / 10 % 10 千位 :数值 / 10 / 10 / 10 % 10; ... 4.3.1.2 “+”用法 对于数字而言,就是数学的简单运算,而出现字符串的时候,就会变成连接运算 小案例题 Q:请写出以下输出语句的结果(大家复制IDE中的时候不要忘记写main方法,笑死。另外右键控制台的选项卡,在move to中可以把运行结果放右边,更好对比) 在结果中我们可以发现,'a'在能够计算的时候,是按照97这个ASC2值来计算的,而字符串就单纯的被连接了起来。 4.3.1.3 自增自减运算符 举例:int i = 0; i++ 具体实用的案例:点一下大拇指,就多一个赞。 注意: (1)++ 、-- 只能操作变量 (2)++、--如果不是单独使用(如在表达式中、或者同时有其它操作),放在变量前后会存在明显区别: 放在变量的前面,先对变量进行+1、-1,再拿变量的值进行运算. 放在变量的后面,先拿变量的值进行运算,再对变量的值进行+1、-1. 这个比较好记 比如我先设定一个 int i = 3; 然后让 int j = i++; 在看的时候,就是先看到i,我们把i先赋值给j,然后再让i自加, 那么此时的j=3,i=4; 而假设int j = ++i; 先看到的是++,那就给i先自加再说 最后j=4,i=4; 小案例题 请写出此代码的运算结果 在计算的时候应该做好笔记,这样不容易出错 例如画上表格 把变量名和初始值都写好 第一步(1):算的是c++,因为加号写在后面,所以先运算再自增,所以是10+ 第二步(2):c的值变为11 大概这样理解 4.3.1.4 赋值运算符 即“=” 扩展: 符号 作用 说明 += 加后赋值 a+=b 等价于 a = (a的数据类型)(a+b); 将a + b的值给a -= 减后赋值 a-=b 等价于 a = (a的数据类型)(a-b); 将a - b的值给a *= 乘后赋值 a*=b 等价于 a = (a的数据类型)(a*b); 将a * b的值给a /= 除后赋值 a/=b 等价于 a = (a的数据类型)(a/b); 将a / b的商给a %= 取余后赋值 a%=b 等价于 a = (a的数据类型)(a%b); 将a % b的商给a PS.扩展的赋值运算符隐含了强制类型转换。 比如大的类型要强转才能赋值给小类型,下面的代码一个出错一个不出错 4.3.1.5 关系运算符 符号 说明 == a==b,判断a和b的值是否相等,成立为true,不成立为false != a!=b,判断a和b的值是否不相等,成立为true,不成立为false > a>b, 判断a是否大于b,成立为true,不成立为false >= a>=b,判断a是否大于等于b,成立为true,不成立为false < a <= a<=b,判断a是否小于等于b,成立为true,不成立为false 关系运算符得到的值是布尔类型 4.3.1.6 逻辑运算符 功能:可以把多个条件的布尔结果放在一起运算,最终返回一个布尔结果。 符号 介绍 说明 & 逻辑与 必须都是true,结果才是true; 只要有一个是false,结果一定是false。 | 逻辑或 只要有一个为true、结果就是true ! 逻辑非 你真我假、你假我真。 !true=false 、 !false= true ^ 逻辑异或 如果两个条件都是false或者都是true则结果是false。两个条件不同结果是true。 短路逻辑运算符 符号 介绍 说明 && 短路与 判断结果与“&”一样。过程是左边为 false,右边则不执行。 || 短路或 判断结果与“|”一样。过程是左边为 true, 右边则不执行。 对比: 逻辑与 “&” 、逻辑或“|”: 无论左边是 false还是 true,右边都要执行。 实际开发中、常用的逻辑运算符还是:&& 、 || 、 ! 4.3.1.7 三元运算符(我记得也叫三目运算符) 写法:条件表达式 ? 值1 : 值2; 运算流程:先计算表达式,若值为true就得到值1,false得到值2 小案例题 Q:请找出三个数中的最大值。 不要忘了找个变量接一下结果。 4.3.1.8 运算符的优先级 因为网络上很好查到,所以我这里就来整理一下记忆的思路 优先级最高的是括号,这个很好理解,就是肯定先括起来谁就先算谁,我们一般的习惯也是这样 第二高的是!非,~取反,++,--。也就是对这个数据本身有变化意涵的都会更先执行。 第三高的是乘除取余,数学规律 第四是加减,数学规律 小案例题 Q:请写出代码的输出结果 程序执行的常见形式有顺序结构,分支结构,循环结构 顺序结构是默认的执行流程 分支结构是通过判断某条件是否成立来选择某段程序执行 4.4.1.1 if语句 if语句的格式与执行流程: 格式1: if (条件表达式) { 语句体; } 执行流程:首先判断条件表达式的结果,如果为true执行语句体,为 false 就不执行语句体。 PS.if 语句中,如果大括号控制的只有一行代码,则大括号可以省略不写。 格式2: if (条件表达式) { 语句体1; } else { 语句体2; } 执行流程:首先判断条件表达式的结果,如果为true执行语句体1,为 false 就执行语句体2。 格式3: if (条件表达式1) { 语句体1; } else if (条件表达式2) { 语句体2; } else if (条件表达式3) { 语句体3; } . . . else { 语句体n+1; } 执行流程:先判断条件1的值,如果为true则执行语句体1,分支结束;如果为false则判断条件2的值 如果值为true就执行语句体2,分支结束;如果为false则判断条件3的值 ... 如果没有任何条件为true,就执行else分支的语句体n+1。 小案例题 1.设置几个考试成绩分数段,不同成绩打印出不同的奖惩结果。 2.设置一个正确的密码,让用户输入密码,当用户输入密码正确时打印“正确”,错误时打印“错误” 4.4.1.2 switch语句 相比起if语句,它的结构和格式更好看一些,适合做值匹配的分支 格式: switch(表达式){ case 值1: 执行代码...; break; case 值2: 执行代码...; break; … case 值n-1: 执行代码...; break; default: 执行代码n; } 这里的default还挺容易被忘掉的。 执行流程:先执行表达式的值,拿着这个值去与case后的值进行匹配。 匹配哪个case的值为true就执行哪个case,遇到break就跳出switch分支。 如果case后的值都不匹配则执行default代码。 注意: (1)表达式类型只能是byte、short、int、char,JDK5开始支持枚举,JDK7开始支持String、不支持double、float、long。 这是因为假设设定一个double类型的变量,double a = 0.1+0.2;它输出的结果会是0.30000000……这样 (2)case给出的值不允许重复,且只能是字面量,不能是变量。 (3)不要忘记写break,否则会出现穿透现象。 就是判断符合结果却没有跳出这个分支,而是继续向下走。 但穿透其实也可以利用 例如case1和case2要执行的代码一样的话,我们可以写成这样,就会更加简单 switch(表达式){ case 值1: 执行代码1; case 值2: 执行代码2; … case 值n-1: 执行代码n-1; break; default: 执行代码n; // break; } 循环结构是重复执行某段程序多次 4.4.2.1 for循环 格式: for (初始化语句; 循环条件; 迭代语句) { 循环体语句【也就是重复执行的代码】; } 案例: 输出3次HelloWorld for (int i = 0; i < 3; i++) { System.out.println("Hello World"); } 执行的流程: 循环一开始,执行int i = 0 一次。 然后判断循环条件:0 < 3 返回true ,进入到循环体中执行输出 :helloWorld , 然后执行迭代语句i++ , 此时i=1了。 然后判断循环条件:1 < 3 返回true ,进入到循环体中执行输出 :helloWorld , 然后执行迭代语句i++ , 此时i=2了。 然后判断循环条件:2 < 3 返回true ,进入到循环体中执行输出 :helloWorld, 然后执行迭代语句i++ , 此时i=3了。 然后判断循环条件:3 < 3 返回false, 循环立即结束 小案例题 (1)求1-5之间的数字和,并把求和结果在控制台输出。 解题思路: 写循环语句循环1-5 并设置一个变量来累加数据 (2)求1-10之间的奇数和,并把求和结果在控制台输出。 解题思路:判断是否为奇数,就是看这个数字除以二的余数是一还是零 (3)在控制台输出所有的“水仙花数” 【水仙花数是一个三位数。水仙花数的个位、十位、百位的数字立方和等于原数】 解题思路:之前我们已经练习过如何得到三位数的个位,十位,百位。然后通过循环语句遍历所有的三位数,再使用if语句判断它是否是水仙花数,如果是的话输出就好了 (4)在控制台输出所有的“水仙花数”,输出水仙花数的个数 解题思路:要知道个数,只需要再设置一个变量,让它自增 4.4.2.2 while循环 格式: 初始化语句; while (循环条件) { 循环体语句【被重复执行的代码】; 迭代语句; } 什么时候用for循环,什么时候用while循环? 它们在功能上是完全一样的,for能解决的while也能解决。 使用规范是:知道循环几次:使用for;不知道循环几次建议使用:while。 小案例题 世界最高山峰是珠穆朗玛峰(8848.86米=8848860毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,折叠多少次,可以折成珠穆朗玛峰的高度。 解题思路: 不知道循环几次所以使用while。 纸的初始厚度为0.1,对折一次翻一倍。 4.4.2.3 do while循环 do-while循环的特点:一定会先执行一次循环体。 格式: 初始化语句; do { 循环体语句; 迭代语句; } while (循环条件); 使用案例 :先执行的这种循环在实际使用案例中就像抢票一样,抢了之后判断一下抢到没有。 三种循环的对比 for循环 和 while循环(先判断后执行) do...while (第一次先执行后判断) for循环中,控制循环的变量只在循环中可以使用。While循环中,控制循环的变量在循环后还可以继续使用。 4.4.2.4 死循环 定义:一直循环的执行下去,如果没有干预不会停止下来。 格式: for(;;) { System.out.println("Hello World"); } 【while的最为常用】 while(true) { System.out.println("Hello World"); } do { System.out.println("Hello World"); } while (true); PS.在IDEA中,添加死循环的快捷键是Ctrl+alt+t 小案例题: 设定一个系统密码,请用户不断的输入密码验证,如果验证不对就输出:密码错误,验证成功输出:欢迎进入系统,并停止程序。 解题思路: 将输入与验证都包含进死循环当中,if判断正确的话使用break跳出循环 4.4.2.5 循环嵌套 循环之间是可以嵌套的,例如: for(int i = 0; i < 3; i++) { for(int j = 0; j < 5; j++) { System.out.println("这是一个循环嵌套"); } } 嵌套循环的特点:外部循环每循环一次,内部循环全部执行完一次。 小案例题: 在控制台输入5行5列的*号组成的矩形 解题思路: 内循环负责打出5列的*,外循环负责换行 break : 跳出并结束当前所在循环的执行。 只能用于结束所在循环, 或者结束所在switch分支的执行。 continue: 用于跳出当前循环的当次执行,进入下一次循环。只能在循环中进行使用。 小案例题: 你是一位攘夷志士,为了成为桂先生的心腹每天兢兢业业,这一天,桂先生安排你在未来五天每天去江户公园投喂六只猫咪,你领命,每天认真撸猫并拍摄照片上传到攘夷志士公众号做宣传。 (1)你投喂到了第三天,可恶的税金小偷最近四处巡逻,桂先生为了你的安全着想,让你不要去了。 解题思路:外循环是控制五天的,内循环是控制投喂六只猫咪的。但由于第四天的时候不能继续投喂了,因此当i等于4时使用break跳出循环。 (2)你投喂到了第三天,家里的速食荞麦面吃光了,需要进行补充,而超市特价还能顺便买些牛肉来吃火锅,桂先生派你去抢购食材,这一天就别去投喂猫咪了。 解题思路:外循环是控制五天的,内循环是控制投喂六只猫咪的。但由于第四天的时候有事,无法投喂了,因此当i等于4时使用continue跳出本次循环,明天继续投喂。 功能:用于在程序中生成随机数 使用方法: (1)导包:告诉程序去JDK的哪个包中找随机数技术【至少IDEA会帮我们导进来,我们不用管】 (2)new一个随机数对象 (3)调用随机数的功能来获取随机数。 用int来接的话就调用nextInt,并且nextInt(n) 功能只能生成: 0 至 n-1之间的随机数,不包含n。 如果想生成3到15之间的随机数要怎么做呢? 解法: 先给3和15都减3,就会变成0到12,然后写 这样就能得到0到12的随机数了 然后再加上3 小案例题: 随机生成一个1-100之间的数字,让用户来猜,猜大提示过大,猜小提示过小,直到猜中结束游戏 解题思路:先随机生成一个符合条件的数字,然后把整个输入和if判断都放进死循环里,猜到了的话就break跳出循环。 定义:用来存储一批同种类型数据的容器。 例如我定义一个int类型的数组 int arr[] = {1,2,3}; 里面只能存储int类型的数据 PS.这个[]写在int后面或者数组名后面都行,因为我最开始学的C语言,所以写后面比较习惯 也就是:定义数组的时候直接给数组赋值。 4.6.1.1 数组基本知识 书写格式:数据类型[] 数组名 = new 数据类型[]{元素1,元素2 ,元素3… }; eg. int[] ages = new int[]{12, 24, 36}; 简化后的书写格式:数据类型[] 数组名 = { 元素1,元素2 ,元素3,… }; eg. int[] ages = {12, 24, 36}; 数组的原理 以int[] ages = {12, 24, 36};这个数组为例 首先在内存中开辟一块存储数组变量ages的区域,然后再开辟一块连续的区域存储对象{12, 24, 36}【可以想象他们一人一个房间】它们有一个地址【门牌号】 int[] ages = {12, 24, 36};语句是从右往左执行的,这个等于号就会把【门牌号】交给变量来存储。 在使用过程中,变量可以通过地址找到数组,访问数据 PS.数组也是引用类型。【就是其中装着地址】 4.6.1.2 数组的访问 访问数组中元素的格式:数组名称[索引] 为数组赋值:数组名称[索引] = 数据; 数组的最大索引值为:数组名. length – 1 PS.在元素个数大于零的情况下才能使用。 补充:数组一旦定义出来,长度、类型就固定了。 也就是:定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据。 书写格式:数据类型[] 数组名 = new 数据类型[长度]; eg. int[] arr = new int[3]; 对比:两种数组定义时的特点和场景有什么区别? 当前已经知道存入的元素值,用静态初始化。 当前还不清楚要存入哪些数据,用动态初始化。 两种格式的写法是独立的,不可以混用。 eg. int[] arrs = new int[3]{30,40,50}; 这样是错的。 两个数组变量可以同时指向一个数组对象,也就是两个数组变量保存着同一个数组地址 如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常) 如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常) 用案例来展示如何遍历数组 eg.int[] ages = {20, 30, 40, 50}; for (int i = 0; i < ages.length; i++) { System.out.println(ages[i]); } 小案例题: (1)在本周壁外调查的过程中,让宝的巨人击杀数量分别是:3,4,2,0,5匹,请计算出让宝本周击杀数量的总和。 解题思路,先将击杀数量存进数组中,对数组进行遍历,将各个索引中的数据累加起来。
3.3 JAVA中的关键字
3.4 JAVA中的标识符
四、JAVA语言比基础稍微高一点的东西
4.1 各种进制的转换
4.2 计算机中数据的存储
4.3 数据的运算
4.3.1 运算符
int a = 5;
System.out.println("abc" + 'a');
System.out.println("abc" + a);
System.out.println(5 + a);
System.out.println("abc" + 5 + 'a');
System.out.println(15 + "abc" + 15);
System.out.println(a + 'a');
System.out.println(a + "" + 'a');
System.out.println(a + 'a' + " abc");
System.out.println("abc" + a + 'a');
System.out.println("abc" + (a + 'a'));
符号
名称
作用
++
自增运算符
写在变量的前面或后面,使变量自身的值加1
--
自减运算符
写在变量的前面或后面,使变量自身的值减1
int c = 10;
int d = 5;
int rs3 = c++ + ++c - --d - ++d + 1 + c--;
System.out.println(rs3);
System.out.println(c);
System.out.println(d);
c
10(初始值)
(2)11
(3)12
(11)11
d
5(初始值)
(5)4
(7)5
rs3
不知道
(1)10+
(4)10+12
(6)10+12-4
(8)10+12-4-5
(9)10+12-4-5+1
(10)10+12-4-5+1+12
byte a = 2;
int b = 5;
a = a/b;
a /= b;
int a = 2;
int b = 5;
int c = 4;
int d = a > b ? a:b;
int max = d>c?d:c;
System.out.println(max);
System.out.println(10 > 3 || 10 > 3 && 10 < 3);
System.out.println( (10 > 3 || 10 > 3 ) && 10 < 3);
4.4 程序流程控制
4.4.1分支结构
4.4.2 循环结构
4.4.3 跳转控制语句
4.5 随机数Random
Random r = new Random();
int number = r.nextInt(10);
int number = r.nextInt(13);
int number = r.nextInt(13)+3;
4.6 数组
4.6.1 静态化初始数组
4.6.2 动态化初始数组
4.6.3 数组使用时可能存在的问题
元素默认值规则
数据类型
具体类型
默认值
基本类型
byte、short、char、int、long
0
float、double
0.0
boolean
false
引用类型
类、接口、数组、String
null
4.6.3 数组遍历