1.前言
1.1 Java语言背景介绍
语言:人与人交流沟通的表达方式
计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言
Java语言:是美国Sun公司(Stanford University Network)在1995年推出的计算机语言
Java之父:詹姆斯·高斯林(James Gosling)
2009年,Sun公司被甲骨文公司收购,所以我们现在访问oracle官网即可:https://www.oracle.com
java语言的三个版本:
JavaSE: Java 语言的(标准版),用于桌面应用的开发,是其他两个版本的基础
JavaME: Java 语言的(小型版),用于嵌入式消费类电子设备
JavaEE: Java 语言的(企业版),用于 Web 方向的网站开发
1.2 Java语言跨平台原理
——Java程序并非是直接运行的,Java编译器将Java源程序编译成与平台无关的字节码文件(class文件),然后由Java虚拟机(JVM)对字节码文件解释执行。所以在不同的操作系统下,只需安装不同的Java虚拟机即可实现java程序的跨平台。
1.3 JRE和JDK
JVM(Java Virtual Machine),Java虚拟机;
JRE(Java Runtime Environment),Java运行环境,包含了JVM和Java的核心类库(Java API);
JDK(Java Development Kit)称为Java开发工具,包含了JRE和开发工具;
总结:我们只需安装JDK即可,它包含了java的运行环境和虚拟机。
1.4 JDK的下载和安装
1.4.1 下载
通过官方网站获取JDK
注意:针对不同的操作系统,需要下载对应版本的JDK。
1.4.2 安装
傻瓜式安装,下一步即可。但默认的安装路径是在C:\Program Files下,为方便统一管理建议修改安装路径,将与开发相关的软件都安装到一个目录下,例如:E:\develop。
注意:安装路径不要包含中文或者空格等特殊字符(使用纯英文目录)。
1.4.3 JDK的安装目录介绍
一、JAVA-编程环境与基础语法
1.1 JDK环境变量的配置
1.1.1 常用DOS命令
在接触集成开发环境之前,我们需要使用命令行窗口对java程序进行编译和运行。 所以需要知道一些常用DOS命令。
1、打开命令行窗口的方式:win + r打开运行窗口,输入cmd,回车。
2、常用命令及其作用
1.1.2 配置环境变量
——开发Java程序,需要使用JDK提供的开发工具(比如javac.exe、java.exe等命令),而这些工具在JDK的安装目录的bin目录下,如果不配置环境变量,那么这些命令只可以在该目录下执行。我们不可能把所有的java文件都放到JDK的bin目录下,所以配置环境变量的作用就是可以使bin目录下的java相关命令可以在任意目录下使用。
-(1)鼠标右键 “此电脑” 选择属性,之后会出现一个弹窗,点击 “高级系统设置”
点击高级系统设置
-(2)点击 “环境变量” 然后会看到这样的画面:
点击环境变量
-(3)关键是下面的内容,找到系统变量:
点击新建
Path里有很多的内容,在这里我们新建一个
然后点确定保存,出去之后再点确定,然后再点确定,至此环境变量配置完毕,接下来就是测试环境变量配置有没有问题了。
!!!PS:
问题:在配置环境时,因为我的电脑已存在另一版本的jdk(原为jdk17现需jdk8),造成配置完成jdk8的环境变量以后,在cmd中存在java javac两条指令显示不同的jdk版本
处理:进入环境配置中path系统变量,将配置好的jdk8的%JAVA_HOME%\bin上移到第一位,使其但凡有需要java的时候首选jdk8
问题原因:配置完成的jdk8的变量位置太靠后
1.2 HelloWorld案例
(1)在进行记事本编写之前,我们先来对JDK环境配置进行一个检验:
输入 java ,回车执行:
再输入 javac ,回车执行:
输入java -version、javac -version(为了检查JDK版本是否一致),回车执行:
(2)HelloWorld案例的编写
HelloWorld案例的编译和运行:
存文件,打开命令行窗口,将目录切换至java文件所在目录,编译java文件生成class文件,运行class文件。
(3)注意事项
——未保存修改后的代码且未重新编译,会导致运行结果依旧是上一次的运行结果;
——非法字符问题—>会直接在运行框中显示错误原因(代码下的小箭头代表错误出现在其附近,不一定就是被指向的代码):
——大小写问题
——系统中显示文件的扩展名—>避免出现隐藏文件扩展名时存在.java .txt同时存在的情况,会出现:
——后缀问题(在cmd中输入命令时)
—编译命令后的java文件名需要带文件后缀.java的原因是需要编译java文件使其变为字节码文件(.class文件)
—运行命令后的class文件名(类名)不带文件后缀:因为文件名即类名,已经包含了.class,所以不需要重复输入
1.3 Notepad++软件的安装和使用
——Notepad++功能比windows中的自带记事本功能强大,除了可以用来制作一般的纯文字说明文件,也十分适合编写计算机程序代码。Notepad++有行号,能够快速定位问题位置,还有语法高亮度显示、代码折叠等功能。而且它是免费的。
1.4 基础语法
1.4.1 注释
注释是对代码的解释和说明文字,可以提高程序的可读性,因此在程序中添加必要的注释文字十分重要。Java中的注释分为三种:
(1)单行注释。单行注释的格式是使用//,从//开始至本行结尾的文字将作为注释文字。
(2)多行注释。多行注释的格式是使用/* 和 */将一段较长的注释括起来。
(3)文档注释。文档注释以/**
开始,以*/
结束。
1.4.2 关键字
关键字是指被java语言赋予了特殊含义的单词。
关键字的特点:
关键字的字母全部小写。
常用的代码编辑器对关键字都有高亮显示,比如现在我们能看到的public、class、static等。
1.4.3 常量与变量
(1)常量:在程序运行过程中,其值不可以发生改变的量。
Java中的常量分类:
字符串常量 用双引号括起来的多个字符(可以包含0个、一个或多个),例如"a"、“abc”、"中国"等
整数常量 整数,例如:-10、0、88等;
小数常量 小数,例如:-5.5、1.0、88.88等;
字符常量 用单引号括起来的一个字符,例如:‘a’、‘5’、‘B’、'中’等;
布尔常量 布尔值,表示真假,只有两个值true和false;
空常量 一个特殊的值,空值,值为null;不能直接在println里面直接被打印,但是可以赋值给一个变量
——除空常量外,其他常量均可使用输出语句直接输出。
(2)变量:在程序运行过程中,其值可以发生改变的量。
——变量的使用:
直接引用变量名就可以使用变量
从本质上讲,变量是内存中的一小块区域,其值可以在一定范围内变化。
变量的有效范围只在直接包裹该变量的一对花括号{}里有效。
变量的本质:内存中的一块存储空间
——问题描述:在变量的定义中,我的电脑出现了一个编译问题:
刚开始以为是符号打错了,后面再三检查还是没解决,直到上网搜索了一下发现错误是“编码GBK的不可映射字符”。
也就是说 javac 默认按照本机语言(GBK) 编译代码 而我们的代码是 utf-8 编码,所以会报错。
——问题解决:运行指定编码格式:javac -encoding UTF-8 XXX.java
——变量的注意事项:
(1)在同一对花括号中,变量名不能重复,
另写一个方法后可以使用同一变量名(即不同花括号内);
(2)变量在使用之前,必须初始化(赋值),
即变量的定义和赋值可以分开写,只是变量赋值的数据类型一定要跟数据类型保持一致;
(3)定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太大可能超出int范围;
(4)定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是double, double的取值范围是大于float的,类型不兼容。
(3)(4)可以类比为:是在做一个强制的类型转换
(5)Java中默认整数用int类型,浮点数默认double类型。
1.4.4 数据类型
1.4.5 键盘录入
通过 Scanner 类来获取用户的输入。使用步骤如下:
(1)导包。Scanner 类在java.util包下,所以需要将该类导入。导包的语句需要定义在类的上面。
import java.util.Scanner;
(2)创建Scanner对象。
Scanner sc = new Scanner(System.in);// 创建Scanner对象,sc表示变量名,其他均不可变
(3)接收数据
int i = sc.nextInt(); // 表示将键盘录入的值作为int数返回。
1.4.6 标识符
标识符是用户编程时使用的名字,用于给类、方法、变量、常量等命名。
1.4.7 类型转换
(1)隐式转换
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。
小——>大
这种转换方式是自动的,直接书写即可。例如:
double num = 10; // 将int类型的10直接赋值给double类型
System.out.println(num); // 输出10.0
类型从小到大关系图:
——整数默认是int类型,byte、short和char类型数据参与运算均会自动转换为int类型。
——boolean类型不能与其他基本数据类型相互转换。
(2)强制转换
把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量。
大——>小
强制类型转换格式:目标数据类型 变量名 = (目标数据类型)值或者变量;
例如:
double num1 = 5.5;
int num2 = (int) num1; // 将double类型的num1强制转换为int类型
System.out.println(num2); // 输出5(小数位直接舍弃)
1.5 案例
案例代码:
byte a = 3;
byte b = 4;
byte c = a + b; //错误。因为两个byte变量相加,会先提升为int类型
byte d = 3 + 4; //正确。常量优化机制
常量优化机制:
在编译时,整数常量的计算会直接算出结果,并且会自动判断该结果是否在byte取值范围内,
在:编译通过
不在:编译失败
二、JAVA-运算符
2.1 按功能分类
2.1.1 算术运算符
2.1.2 自增自减运算符
注意事项:
(1)++和-- 既可以放在变量的后边,也可以放在变量的前边。
(2)单独使用的时候, ++和-- 无论是放在变量的前边还是后边,结果是一样的。
(3)参与操作的时候,如果放在变量的后边(即i++),先拿变量参与操作,后拿变量做++或者–。
(4)参与操作的时候,如果放在变量的前边(即++i),先拿变量做++或者–,后拿变量参与操作。
最常见的用法:单独使用。
2.1.3 赋值运算符
2.1.4 关系运算符
注意事项:
关系运算符的结果都是boolean类型,要么是true,要么是false。
千万不要把“”误写成“=”,**"“是判断是否相等的关系,”="是赋值**。
2.1.5 逻辑运算符
2.1.6 短路逻辑运算符
————在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。
- 逻辑与&,无论左边真假,右边都要执行。
- 短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
- 逻辑或|,无论左边真假,右边都要执行。
- 短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
2.1.7 三元运算符
2.2 案例
2.2.1 数值拆分
需求:
键盘录入一个三位数,将其拆分为个位,十位,百位,打印在控制台
题目分析:
假如录入的数以变量形式为:num,若num=122
个位:(num%100)%10,即(122%100)%10= 22%10=2
十位:(num%100)/10,即(122%100)/10=22/10=2
百位:num/100,即122/100=1
结果:
2.2.2 三元运算符案例1
需求:
一座寺庙里住着三个和尚,已知他们的身高分别为150cm、210cm、165cm,请用程序实现获取这三个和尚的最高身高。
题目分析:
需要用到两个三元运算符,先两两比较,将其高的保存于临时变量中,与最后一个数进行最后比较。
public class OperatorTest02 {
public static void main(String[] args) {
//1:定义三个变量用于保存和尚的身高,单位为cm,这里仅仅体现数值即可。
int height1 = 150;
int height2 = 210;
int height3 = 165;
//2:用三元运算符获取前两个和尚的较高身高值,并用临时身高变量保存起来。
int tempHeight = height1 > height2 ? height1 : height2;
//3:用三元运算符获取临时身高值和第三个和尚身高较高值,并用最大身高变量保存。
int maxHeight = tempHeight > height3 ? tempHeight : height3;
//4:输出结果
System.out.println("maxHeight:" + maxHeight);
}
}
2.2.3 三元运算符案例2
import java.util.Scanner;
public class VerUseDemo1{
public static void main(String[] args){
//将一个三位数的个十百位分别输出,并用三元运算符找出其中最大值
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数:");
int num = sc.nextInt();
int bit,ten,hundred;
bit=(num%100)%10;
ten=(num%100)/10;
hundred=num/100;
System.out.println("输入的数为:"+num);
System.out.println("个位:"+bit);
System.out.println("十位:"+ten);
System.out.println("百位:"+hundred);
int t,max;
t=(bit<ten)?ten:bit;
max=(t<hundred)?hundred:t;
System.out.println("三个数中最大的是:"+max);
}
}
三、JAVA-流程控制
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。所以,我们必须清楚每条语句的执行流程。而且,很多时候要通过控制语句的执行顺序来实现我们想要的功能。
3.1 顺序结构
顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。
顺序结构执行流程图:
3.2 分支结构
3.1.1 if语句
if语句格式1(理解)
格式:
if (关系表达式) {
语句体;
}
执行流程:
①首先计算关系表达式的值
②如果关系表达式的值为true就执行语句体
③如果关系表达式的值为false就不执行语句体
④继续执行后面的语句内容
if语句格式2
格式:
if (关系表达式) {
语句体1;
} else {
语句体2;
}
if语句格式3
格式:
if (关系表达式1) {
语句体1;
} else if (关系表达式2) {
语句体2;
}
…
else {
语句体n+1;
}
示例:
定义一个在0-100之间的变量a, 90-100优秀,80-89良好,70-79中等,60-69及格,0-59请努力加油!
public class Demo3If {
public static void main(String[] args){
int score = 65;
if(score >= 90 && score <= 100){
System.out.println("优秀");
}else if (score >= 80 && score <= 89){
System.out.println("良好");
}else if (score >= 70 && score <= 79){
System.out.println("中等");
}else if (score >= 60 && score <= 69){
System.out.println("及格");
}else if (score >= 0 && score <= 59){
System.out.println("请努力加油");
}else{
System.out.println("成绩有误!");
}
}
}
**——if的嵌套
import java.util.Scanner;
public class IfTest02 {
public static void main(String[] args){
// 1. 使用Scanner录入考试成绩
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的成绩:");
int score = sc.nextInt();
// 2. 判断成绩是否在合法范围内 0~100
if(score >=0 && score <= 100){
// 合法成绩
// 3. 在合法的语句块中判断成绩范围符合哪一个奖励
if(score >= 95 && score <= 100){
System.out.println("自行车一辆");
}else if(score >= 90 && score <= 94){
System.out.println("游乐场一次");
}else if(score >= 80 && score <= 89){
System.out.println("变形金刚一个");
}else {
System.out.println("挨顿揍, 这座城市又多了一个伤心的人~");
}
}else{
// 非法的话, 给出错误提示
System.out.println("您的成绩输入有误!");
}
}
}
3.1.2 switch语句
表达式类型不能是boolean类型,可以是byte,int,char,String,枚举
常用于等值判断
多情况判断,采用switch语句实现
public static void main(String[] args){
// 1. 键盘录入星期数据,使用变量接收
Scanner sc = new Scanner(System.in);
System.out.println("请输入");
int week = sc.nextInt();
// 2. 多情况判断,采用switch语句实现
switch(week){
// 3. 在不同的case中,输出对应的减肥计划
case 1:
System.out.println("跑步");
break;//break代表结束语句,结束整段switch
case 2:
System.out.println("游泳");
break;
case 3:
System.out.println("慢走");
break;
case 4:
System.out.println("动感单车");
break;
case 5:
System.out.println("拳击");
break;
case 6:
System.out.println("爬山");
break;
case 7:
System.out.println("好好吃一顿");
break;
default:
System.out.println("您的输入有误");
break;
}
}
}
switch语句case穿透
——概述 : 如果switch语句中,case省略了break语句, 就会开始case穿透。
————注意事项:
(1)case后面的值只能是常量,不能是变量,且不能出现重复;
(2)表达式中取值可以是byte、short、char,JDK1.5后可以用枚举,JDK7之后可以用String;
后不能用long类型的数据,因为switch表达式里不能进行强制转换?
(3)switch和if都是选择结构,switch判断是等值判断,if既可以等值判断,也可以范围判断;
(4)switch适用于列举有限种情况的分支结构,if适用于所有的分支结构。
3.1.3 if语句和switch语句的区别
(1)switch和if都是选择结构,switch判断是等值判断,if既可以等值判断,也可以范围判断;
(2)switch适用于列举有限种情况的分支结构,if适用于所有的分支结构。
3.3 循环结构
3.3.1 for循环
表达式的结果是boolean类型
常用于区间判断
- 循环:
— 循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形 成死循环。
——循环结构的组成:
循环初始化条件
循环判断条件
循环体
循环迭代条件
执行流程:
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
for循环案例
for循环案例-求1-100偶数和
- 需求:求1-100之间的偶数和,并把求和结果在控制台输出 }
分析: - 示例代码:
public class ForTest03 {
public static void main(String[] args) {
//求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
int sum = 0;
//对1-100的数据求和与1-5的数据求和几乎完全一样,仅仅是结束条件不同
for(int i=1; i<=100; i++) {
//对1-100的偶数求和,需要对求和操作添加限制条件,判断是否是偶数
if(i%2 == 0) {
sum += i;
}
}
//当循环执行完毕时,将最终数据打印出来
System.out.println("1-100之间的偶数和是:" + sum);//2250
}
}
3.3.2 while循环
————while循环执行流程:
①执行初始化语句
②执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
③执行循环体语句
④执行条件控制语句
⑤回到②继续
while循环案例-珠穆朗玛峰
- 需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
- 示例代码:
public class WhileTest {
public static void main(String[] args) {
//定义一个计数器,初始值为0
int count = 0;
//定义纸张厚度
double paper = 0.1;
//定义珠穆朗玛峰的高度
int zf = 8844430;
//因为要反复折叠,所以要使用循环,但是不知道折叠多少次,这种情况下更适合使用while循环
//折叠的过程中当纸张厚度大于珠峰就停止了,因此继续执行的要求是纸张厚度小于珠峰高度
while(paper <= zf) {
//循环的执行过程中每次纸张折叠,纸张的厚度要加倍
paper *= 2;
//在循环中执行累加,对应折叠了多少次
count++;
}
//打印计数器的值
System.out.println("需要折叠:" + count + "次");
}
}
3.3.3 do…while循环
执行流程:
① 执行初始化语句
② 执行循环体语句
③ 执行条件控制语句
④ 执行条件判断语句,看其结果是true还是false
如果是false,循环结束
如果是true,继续执行
⑤ 回到②继续
3.3.4 三种循环的区别
- 三种循环的区别
- for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)。
- do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)。
- for循环和while的区别:
- 条件控制语句所控制的自增变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了。
- 条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用。
3.3.5 死循环
死循环(无限循环)的三种格式
- for( ; ; ){}
- while(true){}
- do {} while(true);
——死循环的案例
3.3.6 跳转控制语句
- 跳转控制语句(break)
- 跳出循环,结束循环
- 跳转控制语句(continue)
- 跳过本次循环,继续下次循环
- 注意: continue只能在循环中进行使用!
import java.util.Scanner;
public class Test {
/*
需求:程序运行后,用户可多次查询星期对应的减肥计划,直到输入0,程序结束
步骤:
1. 不明确用户操作几次, 使用死循环包裹业务逻辑
2. 匹配到0的时候,使用break结束循环死循环
*/
public static void main (String[] args){
//将while循环命名为lo,方便循环中可以编写语句以直接退出这个死循环
lo:while(true){
System.out.println("请输入您要查看的星期数:");
System.out.println("(如无需继续查看,请输入0退出程序)");
// 1. 键盘录入星期数据,使用变量接收
Scanner sc = new Scanner(System.in);
int week = sc.nextInt();
// 2. 多情况判断,采用switch语句实现
switch(week){
// 3. 在不同的case中,输出对应的减肥计划
case 0:
System.out.println("感谢您的使用");
break lo;//用于退出整个while的死循环,如果只有break将不会退出死循环只能退出case 0的这一次循环,达不到退出程序的目的
case 1:
System.out.println("跑步");
break;
case 2:
System.out.println("游泳");
break;
case 3:
System.out.println("慢走");
break;
case 4:
System.out.println("动感单车");
break;
case 5:
System.out.println("拳击");
break;
case 6:
System.out.println("爬山");
break;
case 7:
System.out.println("好好吃一顿");
break;
default:
System.out.println("您的输入有误");
break;
}
}
}
}
3.4 Random函数
—概述:
- Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能
——Random函数案例:
——猜数字
需求:
程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少?
当猜错的时候根据不同情况给出相应的提示
A. 如果猜的数字比真实数字大,提示你猜的数据大了
B. 如果猜的数字比真实数字小,提示你猜的数据小了
C. 如果猜的数字与真实数字相等,提示恭喜你猜中了
import java.util.Random;
import java.util.Scanner;
public class ConstDemo{
public static void main(String[] args){
Random r = new Random();//创建对象
int num = r.nextInt(100);
lo:while(true){
Scanner sc = new Scanner(System.in);
System.out.println("请输入你猜的数字:");
int guess = sc.nextInt();
if(guess<num){
System.out.println("你猜小了");
}else if(guess>num){
System.out.println("你猜大了");
}else if(guess==num){
System.out.println("你猜对了!!");
break;
}else{
System.out.println("请重新输入:");
}
}
}
}
总结
在学习JAVA基础语法的过程中,因为有一点编程基础所以刚开始上手还是比较迅速的,但是容易忽略一些细节,学习JAVA还是需要养成良好的习惯,耐心的琢磨代码案例,有不明白的应该及时去解决。