【JAVA复习系列】第一部分

导语:

本系列文章仅仅用于自己的复习以及分享交流。它随着时间的推移,内容也会有所改变,假设这系列文章获得了一些回复,那我应该也会将其中有价值的内容做一些补充附录之类的东西。

目前这系列文章暂无明确的标题,等到它的结构较为明确的展现出来之后会再次补充。

一、了解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匹,请计算出让宝本周击杀数量的总和。

解题思路,先将击杀数量存进数组中,对数组进行遍历,将各个索引中的数据累加起来。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值