(1)面向对象
(2)简单
(3)跨平台
Java因为拥有JVM,能够帮助Java程序可以支持不同的平台
Java ==>.class字节码文件 ==>JVM在不同的平台之上给予不同的解释,可以满足很多地方同时运行
编译执行是直译性语言
C C++
编译的结果直接交给我们的CPU运作执行,效率较高,但是不能跨平台
解释执行是解释性语言
Java
编译结果需要通过解释器解释之后在交给CPU执行,效率较低
Java借助于JIT技术,现在的执行效率已经可以接近于C++
从官网中获取对应的安装包
bin:
binary 二进制目录
都是二进制可以执行文件,包含.exe文件
java.exe
javac.exe
javap.exe
javadoc.exe
db:
JDK自带的小型数据库
include:
系统接口目录!!!
jre:
Java运行环境 Java Runtime Environment
lib:
资源库目录,存在一些.jar文件 Jar包
src.zip
源文件代码
Java的完整源代码
作为参考的标准,学习的参照物
Windows + E 我的电脑
我的电脑空白处 ==> 属性 ==> 高级系统设置 ==> 环境变量 ==>
系统变量修改:
新建:
变量名:JAVA_HOME
变量值:D:\Program Files\Java\jdk1.8.0_211
新建:
变量名:CLASS_PATH
变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
修改:
变量名:path
添加内容:
;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
开启命令提示符
#Windows + R 弹出对话框 输入cmd
dir
查看当前工作目录的所有文件和文件夹
cd
切换工作目录
格式 cd 路径
路径【小重点】
相对路径
#我在你隔壁,隔离老刘
. 当前工作目录
.. 当前工作目录的父目录
绝对路径
河南省郑州市二七区航海中路60号海为科技园C区10/12楼 唯一性
mkdir
创建文件夹
格式 mkdir 文件夹名
例如: mkdir test
#mkdir a b c d 同时创建四个文件夹
rd
删除文件夹
【注意事项】
1. 慎用 粉碎性删除
2. 无法删除非空文件夹
echo
【了解】
格式 echo 123>1.txt
# 文件拓展名 文件后缀名 【重点】
.exe .doc .ppt .pdf .java .php .py .mp4 .avi .rmvb
.txt .htm .html
涉及到文件操作,一定要带有文件后缀名,没有文件后缀名的文件可以认为不是一个文
件
.dll
第一源动力
无所不能 问题能力,动手能力,阅读能力,搜索能力
del
删除普通文件
操作的过程中必须带有文件后缀名!!!
【注意事项】
1. 慎用,删除文件是直接抹掉数据不是放入回收站
方向键上下
回顾之前的命令
*
通配符,匹配
cls
清理屏幕
exit
退出终端
装 后期操作某些软件为了防止不必要的麻烦
javac 源文件名.java
例如:
javac FirstJava.java
编译之后会生成一个 FirstJava.class文件,
.class字节码文件,二进制文件,需要借助于JVM执行解释给CPU
java 执行工具
java 类名
1. 注意拼写错误!!!
大小写错误,单词拼写错误
2. 标点符号问题
Java代码中基本上所有的开发使用标点符号都是英文标点符号
3. 成双成对的标点符号一起写完
{} [] () <> "" ''
4. 编码问题
Notepad++ 编码 ==> 转为ANSI即可!!!2. 代码规范【重点】参考AJCG 阿里巴巴Java开发规约来完成的2.1 标识符是什么刘晓磊 骚磊 翘臀 46号技师 老骚猴 老骚
1. 标识符可以使用的字符范围,英文字母(A ~ Z a ~ z) 数字(0 ~ 9) 唯一可以使用的标点符号 _
2. 标识符要求必须英文字母开头
3. 标识符严格区分大小写,大写A和小写a完全不一样!
4. 标识符没有严格的长度限制,但是会根据实际需求来限制标识符的长度
5. 标识符组需要做到见名知意,动宾结构!!!
规范格式
studentAge studentScore 见名知意
getStudentAge setStudentAge 动宾结构
title logo banner
payTime
不允许格式:
int a, b, c, d, e, f, g;
img0 img1 img2 img3 img4 img5
payBeizhu 不允许
tsgly 图书管理员!!! 不允许
6. 推荐使用驼峰命名法和下划线命名法
小驼峰命名法:【适用于 变量名,方法名】
标识符首字母小写,之后的每一个单词首字母大写
studentAge studentScore 见名知意
getStudentAge setStudentAge 动宾结构
iPhone iMac iTouch
大驼峰命名法:【适用于 类名,接口名】
标识符所有的单词首字母全部大写
FirstJava String
下划线命名法:
所有的字母都是大写的情况下,为了区分单词直接的间隔,使用下划线命名法
JAVA_HOME CLASS_PATH
DEFAULT_CAPACITY
7. 已经被Java使用的关键字和保留字不得用于自定义标识符使用
变色的不能使用,大写开头的不能使用3. 变量【重点】3.1 基本定义
a. 变量是定义在计算机内存中
1. 明确的数据类型
2. 明确的变量名
3. 明确的对应数据
b. 基本的定义格式
1.
数据类型 变量名;
变量名 = 对应数据类型的值; = 赋值
2.
数据类型 变量名 = 对应数据类型的值;
c. 变量分类
a. 基本数据类型
八大基本数据类型
整数
小数
布尔
字符
b. 引用数据类型
字符串
数组
整型占用内存空间大小取值范围
byte 1字节
short 2字节
int 4字节
long 8字节
浮点型占用内存空间大小取值范围
float 4字节 10^38
double 8字节 10^308
布尔类型占用内存空间大小取值范围
boolean 1字节 true/false
字符型占用内存空间大小取值范围
char 2字节能 够保存中文
class VariableTest {
public static void main(String[] args) {
/* 整型变量 */
byte byteNumber = 10;
short shortNumber = 20;
int intNumber = 30;
long longNumber = 40L;
/* 整型变量展示 */
System.out.println(byteNumber);
System.out.println(shortNumber);
System.out.println(intNumber);
System.out.println(longNumber);
/* 浮点型变量 */
float floatNumber = 3.14F;
double doubleNumber = 0.618;
/* 浮点型变量展示 */
System.out.println(floatNumber);
System.out.println(doubleNumber);
/*
字符型变量
字符常量:
单引号包含的单个元素 'a'
*/
char ch1 = 'A';
char ch2 = '中';
/* 字符型变量展示 */
System.out.println(ch1);
System.out.println(ch2);
/* 布尔类型 */
boolean ret1 = true;
boolean ret2 = false;
/* 布尔类型变量展示 */
System.out.println(ret1);
System.out.println(ret2);
// int num;
// System.out.println(num);
// num = 10;
}
}
VariableTest.java:16: 错误: 不兼容的类型: 从double转换到float可能会有损失
float floatNumber = 3.14;
^
1 个错误
计算机为了保证数据的精度,同时为了数据后期的延展性,会默认把所有的小数都认为是double类型,double占用的内存空间是8字节,而float是4字节,会报错。这里需要告诉计算机3.14是一个float类型,在小数之后加上一个大写F
修改:
float floatNumber = 3.14F;
【要求】
给予long类型的数据需要在常量之后加上一个大写L,明确告知计算机这里使用的是一个long类型数据
修改:
long longNumber = 40L;3.4.3 Java中变量未赋值不能使用
VariableTest.java:44: 错误: 可能尚未初始化变量num
System.out.println(num);
^
1 个错误
Java中规定,一个变量在没有被赋值的情况下,不能参与除赋值之外的其他任何操作。
避免了没有必要的野值问题。
VariableTest.java:46: 错误: 找不到符号
num = 10;
^
符号: 变量 num
位置: 类 VariableTest
1 个错误
Java中规定,变量未定义不能使用
必须先定义,后使用
英文单引号包含的单个元素
\ 转义字符标记
将带有特定含义字符转换为无意义字符
或者把无意义字符,转换成带有一定含义字符
常用:
\'
\"
\n 回车
\t tab键 制表符
转义字符有且只能处理一个字符
\\ 表示一个反斜杠
\\\\ 表示两个反斜杠
有且只允许使用字符本身!!!
'A' 'a'
优势:
1. 阅读性好
2. 保证数据类型一致化
3. 减少了没有必要的歧义5. 字符串【初次相识】5.1 字符串数据类型
字符和字符串什么关系?
羊肉和羊肉串关系就可以认为是字符和字符串的关系
字符串特定标记
"" 英文双引号包含的所有内容都是字符串本身,并且是一个常量,不可以修改
String字符串数据类型6. 类型转换【了解】
小数据类型转换到大数据类型
强制类型转换,是从大数据类型到小数据类型的转换过程。
double类型数据保存到int类型,这里需要强制类型转换
格式:
double num1 = 3.5;
// 这里存在数据精度丢失,并且是不可以逆
int num2 = (int) num1;
【个人建议】
对于基本数据类型的强制类型转换,个人不建议使用,这里会导致数据精度的丢失,并且有可能导致其他问题。
强制类型转换在面向对象开发中,可以用来操作对象直接的关系
< >= <= == !=
关系运算符的结果有且只有 true or false
用于在开发中的条件判断使用1.2 逻辑运算符
&&
与,并且
同真为真,有假【即】假
||
或,或者
有真【即】真,同假为假
!
非,取反
强牛 犟,假变真来,真变假
一般用于组合条件的判断,条件过滤,多情况分析。
断路原则1.3 自增自减运算符【注意事项】
1. 自增自减运算符有且只能操作变量!!!
2. 自增自减运算符独立存在!!!单独成行,减少代码中的歧义!!!
3. 【个人建议】
使用 += 1 和 -= 1 替代自增自减运算符
Swift取消了
++:
在变量之后,首先执行变量所在行语句,再执行自增1操作
在变量之前,首先执行变量自增1操作,再执行所在行语句
--:
在变量之后,首先执行变量所在行语句,再执行自减1操作
在变量之前,首先执行变量自减1操作,再执行所在行语句
+ - * / % ()
1. 从左至右计算
2. 先乘除后加减
3. 有括号先处理括号里面的内容
4. 除数不能为0
%
7 ÷ 3 = 2 …… 1
2 相除的结果
1 是余数
优先级问题:
简单粗暴加括号
= 赋值号
作用是将赋值号右侧的数据,赋值给左侧的【变量】
算术运算符优化
+=, -=, *=, /=, %=
例如:
int num1 = 10;
int num2 = 20;
num2 = num1 + num2; ==> num2 += num1
class Demo4 {
public static void main(String[] args) {
int num = 10;
boolean ret = 10 > 15 && num++ >= 10;
/*
断路原则问题:
逻辑与断路元素问题
10 > 15 该表达式结果为false,已经决定了当前整个
逻辑与表达式的结果为false,计算机为了提高效率,
从逻辑与false条件开始,之后的表达式不再运行。
*/
System.out.println("num : " + num);
System.out.println("ret : " + ret);
int num1 = 10;
boolean ret1 = 10 > 5 || ++num1 > 5;
/*
断路原则问题
逻辑或断路原则问题
在逻辑或表达式中,出现了第一个为true条件,整个
表达式结果已经明确为true,不需要在进行之后的判
断,节约计算机资源,提供效率。
*/
System.out.println("num1 : " + num1);
System.out.println("ret1 : " + ret1);
}
}
获取int类型数据 sc.nextInt();
获取double类型数据 sc.nextDouble();
获取String类型字符串数据 sc.next(); sc.nextLine();
获取一个char类型字符数据 sc.next().charAt(0);
sc.nextLine().charAt(0);
if (/* 布尔类型的表达式 true or false */) {
// 语句体
}
// 后续代码
/*
执行流程
首先判断布尔类型的表达式 true还是false
true 执行语句体
false 执行后续代码
*/
if (/* 布尔类型的表达式 true or false */) {
// true语句体
} else {
// false语句体
}
/*
执行流程:
首先判断if之后小括号里面的布尔类型数据到底是什么
如果为true,执行true语句体
如果为false,执行false语句体
世界上最遥远的距离是,我在if里,你在else里
*/
/*
学生的成绩划分:
>= 90 优秀
>= 80 良好
>= 70 中等
>= 60 及格
< 60 不及格
*/
if (/* 布尔条件1 */) {
// 处理方式1
} else if (/* 布尔条件2*/) {
// 处理方式2
} else if (/* 布尔条件3 */) {
// 处理方式3
} else {
// 无匹配项处理方式
}
/*
执行流程
使用已有条件匹配if之后的布尔条件
匹配到任何一个布尔条件,指定对应的处理结果,结束if - else if结构,执行后续代码
如果没有任何一个条件匹配,执行 else里面语句,然后在执行后续代码
注意
else可以省略!!!
*/【补充知识点 用于输入数据的合法性判断问题】
在实际开发中,存在生活中数据的合法性和程序运行的语法要求冲突问题。
在程序的运行过程中,我们需要用户输入的数据进行合法性判断,如果用户输入的数据不是合法范围以内的,需要给予用户提示,并且不可以进入正常的代码运行过程中。
学生的成绩 0 ~ 100, 超出0~100都是不合法的!!!
1. 不能大于100 score > 100
2. 不能小于0 score < 0
3. 满足任何一个条件都是非法情况!!!
score > 100 || score < 0
4. if 判断
// 导包
import java.util.Scanner;
class Demo8 {
public static void main(String[] args) {
int score = 0;
// Scanner扫描器变量
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生的成绩:");
score = sc.nextInt();
// 用户输入数据合法性判断问题
if (score < 0 || score > 100) {
System.out.println("亲,您输入的数据不对哦~~~秋咪~~~");
// 程序退出
System.exit(0);
}
// if - else if
if (score >= 90) {
System.out.println("秀儿");
} else if (score >= 80) {
System.out.println("良儿");
} else if (score >= 70) {
System.out.println("中儿");
} else if (score >= 60) {
System.out.println("过儿");
} else {
System.out.println("让你爹穿着拖鞋来学校一趟!!!");
}
}
}
switch (/* 变量|表达式 */) {
case 值1:
// 处理方式1;
break;
case 值2:
// 处理方式2;
break;
default:
// 最终处理方式
break;
}
/*
执行流程:
取出switch小括号里面的数据匹配对应的case选择
如果存在case匹配,执行对应的处理方式
如果没有任何的一个case匹配。执行default处理方式
switch case使用注意事项
1. break关键字作用是用于跳出对应的case选项
2. break省略之后,执行对应的case选择,会继续运行到下一个break或者大括号结尾终止switch - case运行
3. 在case选项中不允许出现相同的选择,语法错误!!!
4. 在switch case语句体中,能够执行的代码有且只能是case之后或者default之后的代码,其他代码都不可以执行!!!
5. default可以省略,按照自己的业务逻辑需要考虑是否省略default选择,default可以处理用户在输入过程中超出case选项的一些特殊情况。
*/
格式:
条件判断 ? true处理方式 : false处理方式;
条件运算符/三目运算符
使用局限性较大,类似于if - else结构。
class Demo11 {
public static void main(String[] args) {
int score = 89;
if (score >= 90) {
if (score >= 95) {
System.out.println("A+");
} else {
System.out.println("A-");
}
} else {
System.out.println("A--");
}
}
}
存在于代码块中的变量!!!
1. 局部变量有且只能在当前所处的代码块中使用,超出当前代码块范围无效!!!【作用域问题】
2. 在作用域范围以内,任何的地方可以直接使用对应的变量
3. 在一个变量的作用域范围以内,不能重定义同名变量,报错!
4. 局部变量未赋值不能使用
1. 完成条件:判断是否是闰年
能被4整除,但是不能被100整除,或者可以被400整除
a. year % 4 == 0
b. year % 100 != 0
c. year % 400 == 0
(year % 4 == 0 && year % 100 != 0) || year % 400 == 0
2. 完成条件:判断一个字符是不是大写英文字符
A ~ Z
'A' <= ch <= 'Z' 错误的!!!
ch >= 'A' && ch <= 'Z'
3. 完成条件:判断一个字符是不是英文字符
a. 英文字符中大写靠前,小写靠后
b. 大写和小写英文字符之间有其他字符
(ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')
4. 使用if判断完成对应90后00后判断,用户输入年龄,判断情况。
5. 用户输入一个数值,判断是不是偶数
6. 用户输入自己的工资,判断是否需要缴税
class HomeWork4 {
// 使用if判断完成对应90后00后判断,用户输入年龄,判断情况。
public static void main(String[] args) {
int age = 0;
if (age >= 11 && age <= 20) {
System.out.println("00后");
} else if (age >= 21 && age <= 30) {
System.out.println("90后");
} else {
System.out.println("老的算80后,小的算10后");
}
}
}
class HomeWork5 {
// 用户输入一个数值,判断是不是偶数
public static void main(String[] args) {
int num = 0;
if (num % 2 == 0) {
System.out.println("偶数");
} else {
System.out.println("奇数");
}
}
}
class HomeWork6 {
// 用户输入自己的工资,判断是否需要缴税
public static void main(String[] args) {
double salary = 0.0;
if (salary > 5000) {
System.out.println("我为国家做贡献,武汉加油,中国加油");
} else {
System.out.println("在我们GP班不要出现这种情况");
}
}
}
while (/* 循环条件判断 */) {
// 循环体
// (循环条件变更)
}
/*
执行流程:
首先判断while之后小括号里面的内容结果如何
如果为true,执行循环体,回到循环条件判断
如果为false,终止循环!!!
注意事项:
1. 学会循环过程推理,避免死循环
2. 如果出现了死循环,Ctrl + C 终止循环
*/
do {
// 循环体
// (循环条件变更)
} while (/* 循环条件判断 */);
/*
执行流程:
首先do - while循环结构会执行一次循环体,然后再来判断while之后的条件
如果循环条件为true,循环继续运行
如果循环条件为false,终止循环!!!
while循环每一次执行的循环体,都是在可控范围以内的!每一次循环的执行都是在循环条件的控制之下来完成的。
do while循环中第一次执行循环体是没有进行任何的条件判断,这里存在一定的隐患。
【个人建议】
1. 能使用while完成的,尽量少用do while结构
2. do while循环结构可以用于一些特定场景。1.2.3 for循环
for (/* 循环条件初始化 */; /* 循环条件判断 */; /* 循环条件变更 */) {
// 循环体
}
for循环小括号里面的条件可以简要的推出当前循环的执行次数和结束条件,后期使用到数组,算法中非常常见。
字面含义:
打破!!!
在switch - case功能中,跳出case选择或者是default选择。
break在循环中使用是用于跳出循环!!!1.4 continue关键字
字面含义:
继续!
功能:
结束本次循环,直接进入下一次循环!!!
使用注意事项:
1. 在while循环和do - while循环使用,需要注意continue关键字和循环条件变更之间的位置关系,防止出现死循环情况!
2. for循环中使用continue关键字没有太多的顾虑。
1. 学会找出代码中运行的规律,完成对于循环的实现。
数组,集合,数据遍历,算法...
2. 时时刻刻要注意循环中的一个坑
死循环,continue...
3. 学会循环变量的变量推理过程
for循环循环次数,循环终止条件...
4. 学会使用嵌套循环
5. 模块化处理的思想
6. 普适性代码,已经代码延展性的考虑2. 方法2.1 为什么要使用方法
上午使用循环解决了一部分代码复用的问题,但是治标不治本。代码依然会出现一下问题
1. 代码过于臃肿!!!
2. 阅读性极差!!!
3. 维护性极差!!!
/*
需求
展示一个烤羊排~~~,sout
方法分析
public static 固定格式,不要问
返回值类型: void
方法名: bbq
形式参数列表: ()
方法声明:
public static void bbq()
*/
/**
* 打印烤羊排~~~
*/
public static void bbq() {
System.out.println("烤羊排!!!");
}
/*
什么是参数
当前方法执行所需的外部数据
例如: 登陆时需要的账号和密码,取现金时银行卡和密码
需求
展示一个int类型数据
方法分析:
public static 固定格式,不要问
返回值类型:
void 没有返回值,Sysout不是一个返回值,是一个展示数据的方式,是一种
反馈
方法名:
printIntNumber 见名知意,动宾结构,小驼峰命名法
形式参数列表:
这里需要打印int类型数据
(int num)
方法声明:
public static void printIntNumber(int num);
*/
/**
* 展示一个int类型数据
*
* @param num 要求用户传入一个int类型数据
*/
public static void printIntNumber(int num) {
System.out.println("用户提供的int类型数据为:" + num);
}
/*
需求
打印两个int类型数据之和
方法分析:
public static 固定格式,不要问
返回值类型:
功能是展示数据,打印数据,这里不需要返回值。
方法名:
printSumOfTwoNumber 见名知意,动宾结构,小驼峰命名法
形式参数列表:
这里需要两个int类型数据
(int num1, int num2)
方法声明:
public static void printSumOfTwoNumber(int num1, int num2)
*/
/**
* 打印两个int类型数据的和
*
* @param num1 需要用户提供的int类型数据
* @param num2 需要用户提供的int类型数据
*/
public static void printSumOfTwoNumber(int num1, int num2) {
System.out.println("Sum : " + (num1 + num2));
}
/*
调用时注意事项:
1. 带有参数的方法一定要提供对应的数据类型,实际参数
2. 调用调用带有参数的方法,给予实际参数时,数据类型一致化
3. 多参数方法中,需要在调用的过程给予方法对应的参数,个数不允许缺少
4. 多参数方法中,形式参数列表中声明的参数类型和实际参数类型必须完成一致,一一对应,不允许一锅乱炖
method(int num1, float num2, char ch, double num3);
10 'a' 3.5F 5.5
method(10, 3.5F, 'a', 5.5) √
*/
/*
return关键字
1. 结束当前方法的运行
方法运行到return之后,方法运行结束,return之后的代码不再执行。
2. 可以返回到方法之外数据
在return关键字之后的数据,可以返回到方法之外,利用返回值。
什么是返回值:
返回值是当前方法对于方法之外提供的数据和表现。
这里需要对应返回的数据,声明对应的返回值类型。
【注意】
方法中如果需要返回值,必有有一个明确的return
1. 方法需要返回值,没有retrun报错
2. 方法需要返回值,return存在于一个非必须执行代码中,会报错。
方法中返回值类型是void,那么可以使用return作为方法的结束,return之后不能有任何数据。
需求:
give Me Five
需要返回一个int类型数据5
方法分析:
public static 固定格式,不要问
返回值类型:
这里需要返回的数值为5,是一个int类型
int
方法名:
giveMeFive
形式参数列表:
不需要参数
()
方法声明:
public static int giveMeFive()
*/
/**
* 返回一个int类型数据5
*
* @return 返回值为int类型数据5
*/
public static int giveMeFive() {
// return之后的数据会被返回到方法之外
return 5;
}
/*
需求:
计算两个int类型数据之和,返回结果
方法分析:
public static: 固定格式,不要问
返回值类型:
int完全够用
方法名:
getSumOfTwoNumber √
returnSumOfTwoNumber 见名知意,动宾结构,小驼峰命名法
形式参数列表:
需要两个int类型数据
(int num1, int num2)
方法声明:
public static int getSumOfTwoNumber(int num1, int num2);
*/
/**
* 计算两个int类型数据,并且通过返回值返回
*
* @param num1 int类型数据
* @param num2 int类型数据
* @return 两个int类型数据的之后,返回值类型为int类型
*/
public static int getSumOfTwoNumber(int num1, int num2) {
return num1 + num2;
}
返回值
方法名
形式参数列表
【个人建议】
尽量减少黑盒方法的使用。
1. 返回值类型需要考虑对应的含义。
计算结果,状态监控,判断情况....
2. 选择合适的返回值类型
a. 不要答非所问!!!
b. 要考虑数据的延展性!!!
3. 一个方法有且只能有一个返回值类型。
4. 目前的建议:
当下不要考虑使用数组作为返回值类型。
1. 见名知意,动宾结构,小驼峰命名法!!!
2. 希望大家的代码是一个好的代码。
3. 不允许简拼,不允许出现拼音
4. 全英文,不会的查词典。
不允许打开有道词典划屏取词和鼠标取词
1. 整个方法运行过程中,需要的必要外来数据!
2. 调用方式时,形式参数列表和实际参数列表数据类型是完全一致!顺序也是一致的!
3. 考虑好对应的数据类型。2.2 方法的封装过程
需求分析
1. 分析需求的作用是什么?
2. 考虑方法的名字,见名知意,动宾结构,小驼峰命名法
3. 形式参数列表
4. 返回值类型的选择和对应含义解释
分步骤完成
可以注释完成每一步需要做的事情
实现代码
不要认为自己的代码一定是对的
验证过程
1. 正确情况下代码运行是否OK
2. 使用错误的情况,验证代码的健壮性是否OK
3.
1. 功能单一化!!!
考虑后期的复用性,可移植性,模块化...
2. 减少代码中return的使用,提高代码阅读性
3. 找出特定的情况优化代码,提高效率4. 方法文档注释规范
/**
* 对于当前方法的整体解释,可以把方法的分析过程,利害关系全部写上
*
* @param argumentName参数名字 对于当前参数的功能解释,提一些要求. 有多少个参
* 数就需要完成多少@param
* @return 返回值解释,数据类型,返回值的含义,状态,要求。
*/