这是我学习Java的第一周,写这个博客更多的时为了总结自己这一周的学习情况,如果有人看到我写的博客,有什么问题的话,可以问我。虽然我也是一个小白,但我会尽力回答你。
跨平台 Windows .exe Linux .out macOs .out UNIX .out 面向对象
Java因为拥有JVM,能够帮助Java程序可以支持不同的平台。
Java ==> .class字节码文件 ==> JVM在不同的平台之上给予不同解释,可以满足很多地方同时运行
编译执行和解释执行 编译执行是直译性语言 C C++ 编译的结果直接交给我们的CPU运作执行,效率较高,但是不能跨平台
解释执行是解释性语言 Java 编译结果需要通过解释器解释之后在交给CPU执行,效率较低 Java借助于JIT技术,现在的执行效率已经可以接近于C++。
Java语言是 先编译,再解释
尽量从官网获取对应的安装包
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;
因为我现在都是在cmd中试验java代码的,所以dos命令比较需要。 开启命令提示符 Windows + R 弹出对话框 输入cmd
dir 查看当前工作目录的所有文件和文件夹
cd 切换工作目录 格式 cd 路径 路径【小重点】 相对路径 我在你隔壁,隔离老刘 . 当前工作目录 … 当前工作目录的父目录 绝对路径 xx省xx市xx县xx路xx号 唯一性
mkdir 创建文件夹 格式 mkdir 文件夹名 例如: mkdir test mkdir a b c d 同时创建四个文件夹
rd 删除文件夹 【注意事项】
echo [了解] 格式 echo 123>1.txt
文件拓展名 文件后缀名 【重点】 .exe .doc .ppt .pdf .java .php .py .mp4 .avi .rmvb .txt .htm .html 涉及到文件操作,一定要带有文件后缀名,没有文件后缀名的文件可以认为不是一个文件
del 删除普通文件 操作的过程中必须带有文件后缀名!!! 【注意事项】
方向键上下 查看之前的命令
cls 清理屏幕
exit 退出终端 装 后期操作某些软件为了防止不必要的麻烦
Java之父是谁? 詹姆斯.高斯林(原谅我这个渣渣没找到点点在哪儿)
Java由来 1995年推出的面向对象的编程语言。
jdk的版本变更懒得打了,感兴趣的去看看。
JVM(Java virtual machine) 虚拟机 使用软件在不同的操作系统中模拟相同的环境
JRE(Java runtime environment) 运行环境 包含JVM和解释器,完整的Java运行环境
JDK(Java devolepment kit)开发环境 包含 JRE+类库+开发工具包(编译器+调试工具)
准备工作和基础常识了解完后,我们就可以来尝试写第一句代码了。
首先准备编写代码的工具,我这里推荐的是Notepad++ 下载安装完成后 a. 设置 --> 首选项 --> 新建 环境选择 windows 编码集 ANSI b. 设置 --> 首选项 --> 自动完成 全部反选
在学习初期,我们就要养成良好的代码编写习惯。
class FirstJava {
public static void main(String[] args) {
System.out.println("武汉加油,中国加油!");
}
}
这是代码在Notepad++中的情况,注意红笔标记的地方,注意规范。
javac 编译工具 javac 源文件名.java 例如: javac FirstJava.java 编译之后会生成一个 FirstJava.class文件,.class字节码文件,二进制文件,需要借助于JVM执行解释给 CPU
java 执行工具 java 类名 例如: java FirstJava 终端: 武汉加油,中国加油!
参考AJCG 阿里巴巴Java开发规约来完成的
程序可以正常运行后,说明你的运行环境已经没有什么问题了。接下来我们来了解一下变量。
a. 变量是定义在计算机内存中
1. 明确的数据类型
2. 明确的变量名
3. 明确的对应数据
b. 基本的定义格式
1. 数据类型 变量名;
变量名 = 对应数据类型的值; = 赋值
2.数据类型 变量名 = 对应数据类型的值;
c. 变量分类
1. 基本数据类型
八大基本数据类型
整数
小数
布尔
字符
2. 引用数据类型
字符串
数组
整型 | 占用内存空间大小 | 取值范围 |
---|---|---|
byte | 1字节 | -128~127 |
short | 2字节 | -(2^15) ~ (2^15)-1 |
int | 4字节 | -(2^31) ~ (2^31)-1 |
long | 8字节 | -(2^63) ~ (2^63)-1 |
浮点型 | 占用内存空间大小 | 取值范围 |
---|---|---|
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;
VariableTest.java:44: 错误: 可能尚未初始化变量num
System.out.println(num);
^
1 个错误
//Java中规定,一个变量在没有被赋值的情况下,不能参与除赋值之外的其他任何操作。避免了没有必要的野值问题。
VariableTest.java:46: 错误: 找不到符号
num = 10;
^
符号: 变量 num
位置: 类 VariableTest
1 个错误
//Java中规定,变量未定义不能使用,必须先定义,后使用
英文单引号包含的单个元素
\ 转义字符标记 将带有特定含义字符转换为无意义字符 或者把无意义字符,转换成带有一定含义字符
常用: ’ " \n 回车 \t tab键 制表符
转义字符有且只能处理一个字符 \ 表示一个反斜杠 \\ 表示两个反斜杠
有且只允许使用字符本身!!! 不推荐使用ASC表。 ‘A’ ‘a’
优势: 1. 阅读性好 2. 保证数据类型一致化 3. 减少了没有必要的歧义
字符和字符串什么关系? 羊肉和羊肉串关系就可以认为是字符和字符串的关系 字符串特定标记 “” 英文双引号包含的所有内容都是字符串本身,并且是一个常量,不可以修改 String字符串数据类型
小数据类型转换到大数据类型
强制类型转换,是从大数据类型到小数据类型的转换过程。 double类型数据保存到int类型,这里需要强制类型转换。
格式: double num1 = 3.5; int num2 = (int) num1; //这里存在数据精度丢失,并且是不可以逆
【个人建议】 对于基本数据类型的强制类型转换,个人不建议使用,这里会导致数据精度的丢失,并且有可能导致其他问题。
强制类型转换在面向对象开发中,可以用来操作对象直接的关系
+ - * / % ()
% 7 ÷ 3 = 2 …… 1 2 相除的结果 1 是余数
优先级问题: 简单粗暴加括号
= 赋值号 作用是将赋值号右侧的数据,赋值给左侧的【变量】
算术运算符优化 +=, -=, *=, /=, %= 例如: int num1 = 10; int num2 = 20;
num2 = num1 + num2; ==> num2 += num1;
> < >= <= == !=
关系运算符的结果有且只有 true or false 用于在开发中的条件判断使用
&& 与,并且 同真为真,有假【即】假
|| 或,或者 有真【即】真,同假为假
! 非,取反 强牛 犟,假变真来,真变假
逻辑运算符: 一般用于组合条件的判断,条件过滤,多情况分析。 断路原则 【补充知识点 逻辑运算符断路原则问题】
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);
}
}
【注意事项】
++: 在变量之后,首先执行变量所在行语句,再执行自增1操作 在变量之前,首先执行变量自增1操作,再执行所在行语句
–: 在变量之后,首先执行变量所在行语句,再执行自减1操作 在变量之前,首先执行变量自减1操作,再执行所在行语句
格式: 条件判断 ? true处理方式 : false处理方式;
条件运算符/三目运算符使用局限性较大,类似于if - else结构。
学习初期不着急记这个,可以暂时用CV大法。
// 导包
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("让你爹穿着拖鞋来学校一趟!!!");
}
}
}
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都是不合法的!!!
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选项的一些特殊情况。
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--");
}
}
}
存在于代码块中的变量!!!
开发中我们会使用一些功能代码多次,如果使用CV大法,治标不治本!!!会出现一下一些问题: 1. 代码过于臃肿!!!AJCG要求一个方法代码行数最多80行!!! 2. 代码阅读性极差!!! 3. 代码维护性极差!!!
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循环结构可以用于一些特定场景。
for (/* 循环条件初始化 */; /* 循环条件判断 */; /* 循环条件变更 */) {
// 循环体
}
/*
for循环优势
for循环小括号里面的条件可以简要的推出当前循环的执行次数和结束条件,后期使用到数组,算法中非常常见。
*/
字面含义: 打破!!!
在switch - case功能中,跳出case选择或者是default选择。 break在循环中使用是用于跳出循环!!!
字面含义: 继续!
功能: 结束本次循环,直接进入下一次循环!!!
使用注意事项: 1. 在while循环和do - while循环使用,需要注意continue关键字和循环条件变更之间的位置关系,防止出现死循环情况! 2. for循环中使用continue关键字没有太多的顾虑。
使用循环解决了一部分代码复用的问题,但是治标不治本。代码依然会出现一下问题 1. 代码过于臃肿!!! 2. 阅读性极差!!! 3. 维护性极差!!!
public static void main(String[] args) {
// 方法体
}
/*
public static :不要问!!!这个比较复杂,后边细说。
void: 返回值类型,这里void表示没有返回值
main: 方法名,需要符合小驼峰命名法,见名知意,动宾结构
(String[] args): 形式参数列表
{
方法体
}
方法的模版:
public static ReturnType MethodName(Arguments) {
Method Body
}
方法定义的位置,是在class大括号以内,其他方法之外
*/
/*
需求
展示一个烤羊排~~~,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. 考虑方法的名字,见名知意,动宾结构,小驼峰命名法 3. 形式参数列表 4. 返回值类型的选择和对应含义解释
分步骤完成 可以注释完成每一步需要做的事情 实现代码 不要认为自己的代码一定是对的 验证过程 1. 正确情况下代码运行是否OK 2. 使用错误的情况,验证代码的健壮性是否OK
/**
* 对于当前方法的整体解释,可以把方法的分析过程,利害关系全部写上
*
* @param argumentName参数名字 对于当前参数的功能解释,提一些要求. 有多少个参
* 数就需要完成多少@param
* @return 返回值解释,数据类型,返回值的含义,状态,要求。
*/
1. 判断用户输入的字符是不是英文字符,如果是输出yes,不是输出no
2. 判断用户输入的工资是不是在5000以上,如果是,输出需要缴税,如果不是,输出不需要缴税
3. 用户输入一个年份,判断这个年份是不是一个闰年。
4. 输入两个整数,打印两数之差的绝对值。
5. 输入一个数, 判断是否是偶数,如果是偶数,输出YES,如果是奇数.输出NO
6. 输入一个人的年份, 检测这个是否是80后,如果是输出YES,如果不是输出NO(1980-1989年)
7. 展示0 ~ 100以内的所有偶数
8. 展示0 ~ 100以内的所有奇数
9. 计算1 - 150 的和
10. 逢7过!!!
11. 多种方法打印26个小写字母
12. 例如:
输入 5 8;
计算 5 + 6 + 7 + 8;
输出 26.
13. 整数逆序输出, 例如输入一个整数12345,输出5 4 3 2 1
14.
*****
*****
*****
*****
*****
15.
*
**
***
****
*****
16.
*
***
*****
*******
*********
17.
*
***
*****
*******
*********
*******
*****
***
*
18.
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDCBA
ABCBA
ABA
A
19.
###*###
##*#*##
#*###*#
*#####*
#*###*#
##*#*##
###*###
20.
自己完成一个爱心~~~~❥(^_-) ❥(^_-)❥(^_-)
21. 完成一个9*9乘法表
22. 将一个正整数进行分解质因数操作 例如: 输入90 结果 2*3*3*5
23. 使用循环完成30位以内的斐波那契数列
1 1 2 3 5 8 13 21...
24. 利用循环完成15的阶乘
25. 使用do - while循环和switch - case 完成点菜功能
要求:
a. 展示菜单
b. 自动计算总价
c. 用户选择下单后退出循环
最好把这些代码用方法封装起来,练习方法的使用。
好了,这就是第一周的学习情况。千里之行,始于足下,忍住枯燥,反复练习,才有可能成功。