导语:
本系列文章仅仅用于自己的复习以及分享交流。它随着时间的推移,内容也会有所改变,假设这系列文章获得了一些回复,那我应该也会将其中有价值的内容做一些补充附录之类的东西。
目前这系列文章暂无明确的标题,等到它的结构较为明确的展现出来之后会再次补充。
一、了解JAVA
Java是什么?
是一门高级编程语言。
Java是哪家公司研发的,现在属于哪家公司?
sun公司、Oracle公司。
Java之父是谁啊?
詹姆斯.高斯林 Java能做什么?
基本上什么都可以干,主要做互联网系统的开发。
Java有哪些技术平台?
JavaSE(标准版)、JavaEE(企业版)、JavaME(小型版)
二、使用JAVA语言的前置条件
2.1 JDK的相关知识
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。
三、JAVA语言的基础
3.1 JAVA中的注释
名称 | 单行注释 | 多行注释 | 文档注释 |
样式 | //内容 | /*内容*/ | /**内容 */ |
快捷键(IDEA) | ctrl+/ | ctrl+shift+/ | /**+enter |
PS.注释在编译后的class文件中不存在。
3.2 JAVA中的变量
1.变量是什么,有什么作用?
变量是内存中的一块区域。
其作用是存储一个数据的,且存储的数据可以被替换。
2.变量的格式是什么?
数据类型 变量名称 = 初始值;
3.变量的分类
1.局部变量 2.成员变量 2.1 实例成员变量 2.2 静态成员变量
数据类型
1.数据类型的分类:
引用数据类型:String,自己写的类
基本数据类型:
数据类型 | 关键字 |
整数 | byte |
short | |
int(默认) | |
long | |
浮点数 | float |
double(默认) | |
字符 | char |
布尔 | boolean |
2.类型之间的转换
(1)自动类型转换
类型范围小的变量,可以直接赋值给类型范围大的变量。
【byte<short/char<int<long<float<double】
其中: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)变量存在访问范围、同一个范围变量名不能重复。
3.3 JAVA中的关键字
定义:在JAVA中有特殊作用的词。
比如public之类的
3.4 JAVA中的标识符
定义:说白了就是名字
取名规则:
(1)由数字、字母、下划线(_)和美元符($)等组成
(2)不能以数字开头、不能是关键字、区分大小写
ps有关于什么驼峰模式我去找找看怎么弄比较好记
四、JAVA语言比基础稍微高一点的东西
4.1 各种进制的转换
(1)十进制转二进制的算法:除二取余法
4.2 计算机中数据的存储
除了1B = 8b这种单位之外,我们还要了解一下,计算机中会有很多文件形式,比如文本,声音与图像
字符在计算机中的存储有例如ASCII编码表的方式
PS字符’A’对应的数字是 65 ,字符’a’对应的数字是 97 ,字符’0’对应的数字是 48。这些可以记一记,说不定有用(?)
图片由像素点组成,像素点的颜色的表示也有很多方法,比如百分之几,或者0 - 255*255*255
声音的波纹每一点可由二进制的数据表示
4.3 数据的运算
4.3.1 运算符
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中可以把运行结果放右边,更好对比)
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'));
在结果中我们可以发现,'a'在能够计算的时候,是按照97这个ASC2值来计算的,而字符串就单纯的被连接了起来。
4.3.1.3 自增自减运算符
符号 | 名称 | 作用 |
++ | 自增运算符 | 写在变量的前面或后面,使变量自身的值加1 |
-- | 自减运算符 | 写在变量的前面或后面,使变量自身的值减1 |
举例: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;
小案例题
请写出此代码的运算结果
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 |
把变量名和初始值都写好
第一步(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.扩展的赋值运算符隐含了强制类型转换。
比如大的类型要强转才能赋值给小类型,下面的代码一个出错一个不出错
byte a = 2;
int b = 5;
a = a/b;
a /= b;
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<b, 判断a是否小于b,成立为true,不成立为false |
<= |
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:请找出三个数中的最大值。
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);
不要忘了找个变量接一下结果。
4.3.1.8 运算符的优先级
因为网络上很好查到,所以我这里就来整理一下记忆的思路
优先级最高的是括号,这个很好理解,就是肯定先括起来谁就先算谁,我们一般的习惯也是这样
第二高的是!非,~取反,++,--。也就是对这个数据本身有变化意涵的都会更先执行。
第三高的是乘除取余,数学规律
第四是加减,数学规律
小案例题
Q:请写出代码的输出结果
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.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 循环结构
循环结构是重复执行某段程序多次
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列的*,外循环负责换行
4.4.3 跳转控制语句
break : 跳出并结束当前所在循环的执行。 只能用于结束所在循环, 或者结束所在switch分支的执行。
continue: 用于跳出当前循环的当次执行,进入下一次循环。只能在循环中进行使用。
小案例题:
你是一位攘夷志士,为了成为桂先生的心腹每天兢兢业业,这一天,桂先生安排你在未来五天每天去江户公园投喂六只猫咪,你领命,每天认真撸猫并拍摄照片上传到攘夷志士公众号做宣传。
(1)你投喂到了第三天,可恶的税金小偷最近四处巡逻,桂先生为了你的安全着想,让你不要去了。
解题思路:外循环是控制五天的,内循环是控制投喂六只猫咪的。但由于第四天的时候不能继续投喂了,因此当i等于4时使用break跳出循环。
(2)你投喂到了第三天,家里的速食荞麦面吃光了,需要进行补充,而超市特价还能顺便买些牛肉来吃火锅,桂先生派你去抢购食材,这一天就别去投喂猫咪了。
解题思路:外循环是控制五天的,内循环是控制投喂六只猫咪的。但由于第四天的时候有事,无法投喂了,因此当i等于4时使用continue跳出本次循环,明天继续投喂。
4.5 随机数Random
功能:用于在程序中生成随机数
使用方法:
(1)导包:告诉程序去JDK的哪个包中找随机数技术【至少IDEA会帮我们导进来,我们不用管】
(2)new一个随机数对象
Random r = new Random();
(3)调用随机数的功能来获取随机数。
int number = r.nextInt(10);
用int来接的话就调用nextInt,并且nextInt(n) 功能只能生成: 0 至 n-1之间的随机数,不包含n。
如果想生成3到15之间的随机数要怎么做呢?
解法:
先给3和15都减3,就会变成0到12,然后写
int number = r.nextInt(13);
这样就能得到0到12的随机数了
然后再加上3
int number = r.nextInt(13)+3;
小案例题:
随机生成一个1-100之间的数字,让用户来猜,猜大提示过大,猜小提示过小,直到猜中结束游戏
解题思路:先随机生成一个符合条件的数字,然后把整个输入和if判断都放进死循环里,猜到了的话就break跳出循环。
4.6 数组
定义:用来存储一批同种类型数据的容器。
例如我定义一个int类型的数组
int arr[] = {1,2,3};
里面只能存储int类型的数据
PS.这个[]写在int后面或者数组名后面都行,因为我最开始学的C语言,所以写后面比较习惯
4.6.1 静态化初始数组
也就是:定义数组的时候直接给数组赋值。
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.在元素个数大于零的情况下才能使用。
补充:数组一旦定义出来,长度、类型就固定了。
4.6.2 动态化初始数组
也就是:定义数组的时候只确定元素的类型和数组的长度,之后再存入具体数据。
书写格式:数据类型[] 数组名 = new 数据类型[长度];
eg. int[] arr = new int[3];
对比:两种数组定义时的特点和场景有什么区别?
当前已经知道存入的元素值,用静态初始化。
当前还不清楚要存入哪些数据,用动态初始化。
两种格式的写法是独立的,不可以混用。
eg. int[] arrs = new int[3]{30,40,50}; 这样是错的。
两个数组变量可以同时指向一个数组对象,也就是两个数组变量保存着同一个数组地址
4.6.3 数组使用时可能存在的问题
如果访问的元素位置超过最大索引,执行时会出现ArrayIndexOutOfBoundsException(数组索引越界异常)
如果数组变量中没有存储数组的地址,而是null, 在访问数组信息时会出现NullPointerException(空指针异常)
元素默认值规则
数据类型 | 具体类型 | 默认值 |
基本类型 | byte、short、char、int、long | 0 |
float、double | 0.0 | |
boolean | false | |
引用类型 | 类、接口、数组、String | null |
4.6.3 数组遍历
用案例来展示如何遍历数组
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匹,请计算出让宝本周击杀数量的总和。
解题思路,先将击杀数量存进数组中,对数组进行遍历,将各个索引中的数据累加起来。