Java入门
Java简介
Java是一门非常优秀的计算机语言
语言:人与人交流沟通的表达方式
计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言
Java之父:詹姆斯·高斯林(James Gosling)
Java的三大技术平台
1、JavaSE
2、JavaME
3、JavaEE
JDK的下载和安装
JDK:(JavaDevelopment Kit):Java开发工具包,也就是说必须要有JDK才能开发Java程序
所以,我们得先安装了JDK,然后才能进行Java程序的开发。
JDK的版本:
知道三个版本就可以了,这里我们标红了:JDK8,JDK11,JDK17。JDK8是企业用的最多的版本,JDK11和JDK17是后续长期支持更新的版本。
JDK的下载:
- 通过官方网站获取JDK(https://www.oracle.com/)
- 直接下载地址: https://www.oracle.com/java/technologies/javase-downloads.html
- 注意:针对不同操作系统,下载对应的JDK
JDK下载图解:
第一步:双击启动下载好的JDK软件,在弹出框界面选择是
第二步:看到如下界面,点击下一步
第三步:看到如下界面,不要着急安装,因为它默认会安装到C:\Program Files下面,在这里点击更改
第四步:看到如下界面,修改安装路径
修改路径后的界面如下,然后点击确定
第五步:看到如下界面,点击下一步,等待安装
第六步:看到如下界面,说明安装成功,点击关闭即可
JDK安装完成后,我们到安装目录下去看看JDK的安装目录:
目录解释:
到此,我们就完成了JDK的安装,大家赶快根据老师提供的JDK软件,完成JDK的安装吧。
第一个程序
JDK安装完毕后,下面我们来开发自己的第一个Java程序。
首先,我们来说一下,Java程序的开发流程:
开发一个Java 程序,需要三个步骤:编写程序,编译程序,运行程序。如图
知道了Java程序的开发流程后,下面我们来实现第一个程序:
第一步:编写程序
① 在D盘根目录下新建一个文本文档文件,修改文件名为HelloWorld.java
② 选中HelloWorld.java文件,用Windows系统自带的记事本打开
③ 书写如下程序内容
注意:
- 文件后缀名是.java,文件类型是java文件
- 文件名和代码中类名一致
如果后缀名还是文本文档文件,需要按照下面的步骤,勾选文件扩展名
程序编写完毕后,要进行编译和运行程序。而编译和运行程序目前需要在DOS窗口下进行,因此我们先说一下如何打开DOS窗口
说完了如何打开DOS窗口,接下来,我们来学习编译和运行程序。
第二步:编译程序
- 格式:javac 文件名.java
- 范例:javac HelloWorld.java
第三步:运行程序
- 格式:java 类名
- 范例:java HelloWorld
如图所示:
最终再控制台输出了:HelloWorld。
常见问题
1:单词拼写问题
2:中英文符号问题
而关于中英文符号问题,早期的windows系统报错信息如下
这两个常见的小问题呢,大家了解一下即可,因为很快我们将会使用一款非常优秀的开发工具,这些问题将不会存在了。但是,如果出现类似的问题,我们要学会阅读并解决问题。
最后,再给大家补充一个小知识,JDK11的新特性:
JDK11开始支持 java命令直接运行.java文件
- 格式:java 文件名.java
- 范例:java HelloWorld.java
常用DOS命令
- 直接在地址栏输入cmd,回车即可
- 通过运行窗口打开
第一种方式,我们已经用过了。这里我们重点说第二种方式,通过运行窗口打开:
① 按下win+R
② 输入cmd
③ 按下回车键
常用的DOS命令:
Path环境变量
前面我们使用过JDK的bin目录下的javac和java命令,为什么我们能够直接使用呢?这里我们来讲解一下原理。而要讲解这个原理,我们就不得不提一下Path环境变量。
Path环境变量的作用:
- 它提供了windows命令行中指令的可执行文件(比如:.exe文件)路径,让我们在命令行中输入命令时,能够找到对应的可执行文件执行
- 简单说:让命令在命令行中使用有效
为了让大家更好的理解这句话,我们来做一个操作,验证一下:
- 在Path环境变量中配置QQ软件的命令行方式启动
- C:\Program Files (x86)\Tencent\QQ\Bin
如何配置呢?按照下图配置即可
配置完毕之后,我们到DOS窗口中,通过qq指令,就可以启动QQ软件了。
由此可见,我们把.exe文件所在的路径配置到Path环境变量中,就可以使用.exe结尾的指令来启动程序了。这个时候,我们来说一下,为什么开始的时候我们能够直接使用javac和java指定了。
但是,由于这种配置,只配置了较少的命令,而我们在JDK的bin目录下还有很多的命令可以使用,比如:jps,jpackage,jmap等。所以,我们要自己配置JDK的环境变量,为了后续的一些软件能够找到JDK的安装目录,我们分两步来完成Java环境变量的配置:
第一步:配置JAVA_HOME变量
第二步:编辑Path变量
到此,我们就知道了环境变量的原理,并且完成了自己配置Java的环境变量。
IDEA
IDEA的下载和安装
下载:https://www.jetbrains.com/idea
安装:建议修改安装路径
安装图解:可以根据如下步骤完成IDEA的安装
IDEA中HelloWorld
安装完IDEA后,下面我们就来使用IDEA完成HelloWorld案例。
首先,我们来启动IDEA,启动的时候还有一些基本的配置,一起来看一下:
第一步:双击桌面上的IDEA图标,选择Do not import settings,点击OK
第二步:看到如下界面
选择:Evaluate for free,点击Evaluate
第三步:看到如下界面,点击Continue
第四步:看到如下界面,启动配置成功
接着,我们来完成HelloWorld案例:
IDEA中的代码结构
接着,我们说一下IDEA中完成HelloWorld案例的基本流程:
① 新建一个空项目(javase_code)
② 新建一个新模块(idea_test)
③ 在idea_test模块的src下新建一个包(com.bcsbj)
④ 在com.itheima包下新建一个类(HelloWorld)
⑤ 在HelloWorld类中编写代码(main回车,sout回车)
⑥ 在IDEA中运行HelloWorld
下面,我们就一起来完成IDEA中HelloWorld案例的编写,编译和运行
① 新建一个空项目(javase_code):
第一步:点击New Project
第二步:选择Empty Project,点击Next
第三步:修改项目名称,修改项目存储路径,点击Finish,弹出一个窗体,然后点击Create
第四步:看到如下界面,空项目创建成功
② 新建一个新模块(idea_test)
第一步:选择File,点击Project Structure...
第二步:在弹出的窗体中,按照1,2,3的步骤选择,来新建一个模块
第三步:在弹出的窗体中,默认选择Java模块,JDK选择的也是17,点击Next即可
第四步:在弹出的窗体中,修改模块名称,点击Finish
第五步:然后点击OK即可
这样我们建好了一个模块:
③ 在idea_test模块的src下新建一个包(com.bcsbj)
第一步:展开模块,按照1,2,3的步骤选择,来新建一个包
第二步:在弹出框里面输入包名,然后回车即可
这样我们建好了一个包:
④ 在com.itheima包下新建一个类(HelloWorld)
第一步:选中com.itheima这个包,按照1,2,3的步骤选择,来新建一个类
第二步:在弹出框里面输入类名,然后回车即可
这样我们建好了一个类:
⑤ 在HelloWorld类中编写代码(main回车,sout回车)
在类中编写代码,可以手动编写,也可以采用快捷方式编写
⑥ 在IDEA中运行HelloWorld
在代码中,右键选择Run 'HelloWorld.main()' 运行
在控制台输出了结果:
这样我们就完成了IDEA中HelloWorld案例。
IDEA中基本配置&注释
第一个:修改背景主题为白色
第二个:修改字体大小
按照1,2,3,4进行设置即可
至于其他的设置,后面我们用到的时候再去讲解。
讲解完IDEA的这两个基本设置后,下面,我们说一下注释,那什么是注释呢?
- 注释是指在程序中添加的说明性信息
- 注释不参与程序运行,仅起到说明作用
这里我们再来介绍一下注释的分类:
下面我们来对前面讲解过的HelloWorld案例添加注释:
/*
Java程序中最基本的组成单位是类
类的定义格式是:
public class 类名 {
}
*/
public class HelloWorld {
/*
这是main方法
main方法是程序的入口方法,代码的执行是从main方法开始的
*/
public static void main(String[] args) {
//这是输出语句,能够将""里面的内容输出到控制台,并且""里面的内容是可以修改的
System.out.println("HelloWorld");
System.out.println("Java");
}
}
IDEA中常用快捷键
为了提高我们后续写程序的效率,这里呢,我们来讲一些IDEA中常用的快捷键:
-
快速生成main方法和输出语句
- main方法:main或者psvm,回车
- 输出语句:sout,回车
-
常用快捷键
- Ctrl+D:复制数据到下一行
- Ctrl+X:剪切数据,可以用来删除所在行
- Ctrl+Alt+L:格式化代码,建议自己写代码的时候就注意格式
- Ctrl+/:对选中的代码添加单行注释,如果想取消注释,再来一次即可
- Ctrl+Shift+/:对选中的代码添加多行注释,如果想取消注释,再来一次即可
IDEA中模块操作
IDEA的基本使用我们掌握了,最后呢,我们再来说一下,IDEA中的模块操作,而关于模块操作呢,分为三种:
- 新建模块
- 删除模块
- 导入模块
下面我们分别来操作一下。
新建模块:HelloWorld案例中讲解过了,这里就不再讲解了,想不起来了,翻到上面去看看
删除模块:删除模块又分为从工作区删除和从硬盘删除,你可以根据自己的需要,选择对应的方式进行删除
导入模块:
建议把模块复制到空项目所在路径下,然后找到新建模块的地方,只不过这一次不是新建模块,而是导入模块,所以,要选择Import Module
找到要导入的模块,点击OK
然后一路next,直到出现如下的界面,点击Overwrite即可
看到下面的界面,点击Finish
最后点击OK即可
这样我们就成功的导入了一个模块:
导入模块的注意事项:
- 把模块复制到空项目所在路径下
- 出现如下错误,知道如何处理
导入模块的注意事项:
- 把模块复制到空项目所在路径下
- 出现如下错误,知道如何处理
基础语法
字面量
什么是字面量呢?
- 直接写出来的人可以理解的数据,在java中叫做字面量
- 举例:“HelloWorld”,666,13.14
那Java中有哪些类型的字面量呢?
知道了Java中的字面量后,下面我们到IDEA中去演示一下字面量的使用:
/*
字符串字面量: 用双引号括起来的内容。"HelloWorld","黑马程序员"
整数字面量: 不带小数的数字。666,-88
小数字面量: 带小数的数字。13.14,-5.21
字符字面量: 用单引号括起来的内容。'A','0','我'
布尔字面量: 布尔值,表示真假。true,false
*/
public class LiteralDemo {
public static void main(String[] args) {
//字符串字面量
System.out.println("HelloWorld");
System.out.println("编程狮笔记");
//整数字面量
System.out.println(666);
System.out.println(-88);
//小数字面量
System.out.println(13.14);
System.out.println(-5.20);
//字符字面量
System.out.println('A');
System.out.println('0');
System.out.println('我');
//布尔字面量
System.out.println(true);
System.out.println(false);
}
}
数据类型
那为什么会有不同的数据类型呢?因为
- 不同的数据类型分配了不同的内存空间
- 不同的内存空间,所存储的数据大小是不一样的
在讲解不同的数据类型前,这里我们先普及一个小知识,就是字节的概念:
计算机中存储数据的最小单位是:字节(byte),用B表示。
我们可以看一下硬盘存储的文件:以字节为单位
为了帮助大家更好的理解字节这个单位,我们来说一下,常见的存储单位:
1TB = 1024GB
1GB = 1024MB
1MB = 1024KB
1KB = 1024B
这样呢,我们对字节就能有一个基础认知。有了一个基础的认知之后,我们再来说Java中的数据类型
在这里,我们给出每种基本数据类型的内存占用和取值范围,大家了解一下:
说明:E+38表示:乘以10的38次方。同理E-45表示:乘以10的负45次方
整数默认是:int类型
浮点数默认是:double类型
变量
什么是变量呢?
- 变量就是内存中的存储空间
- 空间中存储的数据是可以发生改变
知道了,什么是变量后,下面我们来说一下变量的定义格式:
-
格式:数据类型 变量名 = 变量值;
-
范例:int price = 1998;
根据变量名进行使用,可以输出,也可以修改值
了解了变量的定义格式和使用方式后,下面我们到IDEA中去演示一下:/* 格式:数据类型 变量名 = 变量值; */ public class VariableDemo01 { public static void main(String[] args) { //定义一个int类型的变量,用来表示价格 int price = 1998; //输出变量 System.out.println(price); //修改变量的值 price = 1888; //再次输出变量的值 System.out.println(price); } }
变量的案例
需求:分析下图指定数据,看看哪些可以通过变量表示,并思考采用那种数据类型,最后通过程序实现
指定数据:京东价,重量,颜色
分析:
① 京东价,重量,选择颜色这些字都是固定的,但是他们后面的数据是变化的,所以要用变量表示
② 价格,可以用double或者int类型来表示,这里我们用int类型表示;
重量,用double类型表示;颜色,用String类型表示
分析完毕之后,下面我们到IDEA中去实现一下:
/*
手机信息描述
*/
public class VariableTest01 {
public static void main(String[] args) {
//定义秒杀价变量
double price = 199.00;
//定义颜色变量
String color = "蓝色";
//定义版本变量,纪录的是内存大小
int size = 8;
// System.out.println(price);
// System.out.println(color);
// System.out.println(size);
//为了输出效果好看一些,我加上一些内容
System.out.println("秒杀价是:"+price);
System.out.println("你选择的颜色是:"+color);
System.out.println("你选择的版本是:"+size);
//字符串字面值+任意的数据=字符串数据
}
}
变量的注意事项
变量的注意事项:
- 变量名不能重复
- 变量未赋值,不能使用
- 定义long类型变量,数据后面加L
- 定义float类型变量,数据后面加F
IDEA中代码演示如下:
/*
变量使用的注意事项
*/
public class VariableDemo02 {
public static void main(String[] args) {
int age = 10;
// int age = 20;
// int money;
//// money = 20;
// System.out.println(money);
long money = 1666666666L;
float price = 12.34F;
}
}
关键字
关键字:就是被Java语言赋予了特定含义的单词
关键字的特点:
- 关键字的字母全部小写
- 常用的代码编辑器,针对关键字有特殊的颜色标记,非常直观
知道了关键字的特点后,这里我们给大家看看Java中的关键字:
标识符
标识符:就是给类,方法,变量等起名字的符号
比如,我们前面写类的时候,起的名字:HelloWorld,变量的时候,价格,price等,这就是标识符。
那这个符号你能随便写呢,当然是不能的,这里我们来看一下标识符的组成规则:由数字、字母、下划线(_)和美元符($)组成
了解了组成规则后,这里我们还得说一下注意事项:
- 不能以数字开头
- 不能是关键字
- 区分大小写
判断下面哪些标识符不符合规则
bj b2 2b _2b class helloworld
按照我们讲解的规则,大家应该能够判断出来:2b和class是不符合规则的。
知道了标识符的组成规则和注意事项后,这里我们再说一下起名字常用的命名约定:
- 小驼峰命名法
- 约定1:标识符一个单词的时候,首字母小写
- 范例1:name
- 约定2:标识符是多个单词的时候,第一个单词首字母小写,其他单词首字母大写
- 范例2:firstName
- 大驼峰命名法
- 约定1:标识符一个单词的时候,首字母大写
- 范例1:Hello
- 约定2:标识符是多个单词的时候,每个单词首字母大写
- 范例2:HelloWorld
一般来说,小驼峰命名法适用于对方法,变量等起名字。大驼峰命名法适用于对类,接口等起名字。
运算符
运算符:对字面量或者变量进行操作的符号
表达式:用运算符把字面量或者变量连接起来符合java语法的式子就可以称为表达式。不同运算符连接的表达式体现的是不同类型的表达式。
算术运算符
Java中的算术运算符有如下几种:
了解了Java中的算术运算符之后,下面我们到IDEA中去使用一下:
/*
算术运算符
*/
public class OperatorDemo {
public static void main(String[] args) {
//定义两个int类型的变量
int a = 6;
int b = 4;
System.out.println(a + b);//10
System.out.println(a - b);//2
System.out.println(a * b);//24
System.out.println(a / b);//1.5? 1
System.out.println(a % b);//2
//整数相除只能得到整数,要想得到小数,必须有浮点数的参与
System.out.println(6.0 / 4);
}
}
案例数值拆分
需求:定义一个三位数,将其拆分为个位、十位、百位后,输出在控制台
什么意思呢?下面我们举例来说明一下:
举例:int number = 123;
在控制台输出结果:
个位是:3
十位是:2
百位是:1
知道了要做什么后,下面我们来分析一下如何获取个位,十位,百位:
分析:
① 个位的计算:数值 % 10
123 除以 10(商12,余数为3)
② 十位的计算:数值 / 10 % 10
123 除以 10 (商12,余数为3,整数相除只能得到整数)
12 除以 10 (商1,余数为2)
③ 百位的计算:数值 / 10 / 10 % 10
123 / 10 / 10 % 10(123 / 10 得到12,12 / 10 得到1,1 % 10 得到 1)
分析完毕之后,下面我们到IDEA中去实现一下:
/*
需求:定义一个三位数,将其拆分为个位、十位、百位后,输出在控制台
*/
public class OperatorTest {
public static void main(String[] args) {
//定义一个三位数
int number = 123;
//获取个,十,百位数据
int ge = number % 10;
int shi = number / 10 % 10;
int bai = number / 100 % 10;
//输出结果
System.out.println("个位是:" + ge);
System.out.println("十位是:" + shi);
System.out.println("百位是:" + bai);
}
}
+操作的三种情况
1.数字相加(类型转换)
在Java程序中,数据参与运算,要求类型一致。这里就涉及到了数据的类型转换。而类型转换又分为两种:
- 隐式转换
- 强制转换
隐式转换:把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量
强制转换:把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量
格式:数据类型 变量名 = (目标数据类型)(数值或者变量)
IDEA中代码演示如下:
/*
数字相加
*/
public class OperatorDemo01 {
public static void main(String[] args) {
int a = 10;
double b = 13.14;
System.out.println(a + b);
int c = (int)(a + b);
System.out.println(c);
// double d = a + b;
short s = 10;
int i = 20;
int j = s + i;
// short ss = s + i;
short ss = (short) (s + i);
}
}
2.字符相加
IDEA中代码演示如下:
/*
字符相加
*/
public class OperatorDemo02 {
public static void main(String[] args) {
//定义两个变量
int i = 10;
char ch = 'A';//'A'的值是65
ch = 'a';//'a'的值是97
ch = '0';//'0'的值是48
System.out.println(i + ch);//58
}
}
ASCII码表
3.字符串相加
IDEA中代码演示如下:
/*
字符串相加
*/
public class OperatorDemo03 {
public static void main(String[] args) {
System.out.println("it" + "bcsbj");
System.out.println("bcsbj" + 666);
System.out.println(666 + "bcsbj");
System.out.println("bcsbj" + 6 + 66);
System.out.println(12 + 7 + "年BCSBJ");
}
}
赋值运算符
Java中的赋值运算符有如下几种:
下面我们到IDEA中去使用一下:
/*
赋值运算符
*/
public class OperatorDemo {
public static void main(String[] args) {
int a = 10;
System.out.println("a:" + a);
// += : 把左边和右边的数据相加,最后把结果赋值给左边
// a += 20;
a = a + 20;
System.out.println("a:" + a);
//注意:扩展的赋值运算符底层隐含了强制类型转换
short s = 1;
s += 2;
s = (short) (s + 2);
System.out.println("s:" + s);
}
}
选择语句
顺序结构:从上往下,依次执行
public static void main(String[] args) {
int price =998;
System.out.println(price);
price =666;
System.out.println(price);
}
选择结构:
选择结构:
QQ界面的登录,填写账号和密码正确,展示好友列表界面。填写账号或者密码有误,提示:你输入的账号或密码不正确。
这就是通过选择结构来实现的,实际开发中,类似这种逻辑判断的情况非常常见。
循环结构:
比如说,京东商城中,查询手机数据,京东就会返回给你一堆符合你查询要求的数据。
假如,每一部手机数据的展示需要5行代码,如果最终返回了1000部手机,你就需要编写5000行代码来实现数据展示。
这样就太麻烦了,那么,有没有一种流程语句,能够简化这种操作呢?答案肯定是有的,就是我们的循环结构,它就可以通过一个比较简单的结构来控制我们的手机展示1000次。
比如说,带着这样写就可以了,这就是循环结构。
顺序结构
顺序结构:是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行
执行流程图:
下面我们到IDEA中去演示一下:
/*
顺序结构语句
*/
public class OrderDemo {
public static void main(String[] args) {
System.out.println("开始");
System.out.println("语句A");
System.out.println("语句B");
System.out.println("语句C");
System.out.println("结束");
}
}
Debug的基本使用
为了帮助大家更好的理解程序的执行流程,我们来学习Debug,那什么是Debug呢?
Debug:是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序
它的两大作用,查看程序执行流程,调试程序。由于目前我们每个程序的代码内容还比较少,
所以,今天重点掌握查看程序执行流程,当代码复杂的时候,我们需要通过debug来调试程序。那么,debug操作的流程是什么样子的呢?
在讲解操作流程前,我们来说一下:
Debug,又被称为断点调试,断点其实是一个标记,告诉我们从哪里开始查看
知道了Debug被称为断点调试后,我们来讲一下Debug的操作流程:
① 如何加断点
选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可。如图
② 如何运行加了断点的程序
在代码区域右键Debug执行
③ 看哪里
看Debugger窗口,看Console窗口
⑤ 如何删除断点
选择要删除的断点,单击鼠标左键即可。也就是把第一步的动作,再做一次即可。
总结一下,Debug的使用流程:
①如何加断点:选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可
②如何运行加了断点的程序:在代码区域右键Debug执行
③看哪里:看Debugger窗口,看Console窗口
④点哪里:点(Step Over F8) 开始,点(Stop)结束
⑤如何删除断点:选择要删除的断点,单击鼠标左键即可
讲解完毕后,大家赶快动手练习一下吧。
通过Debug的方式看一下,如下代码的执行流程:
/*
Debug查看程序执行流程
*/
public class DebugDemo {
public static void main(String[] args) {
//定义一个int类型的变量,用来表示价格
int price = 998;
//输出变量
System.out.println(price);
//修改变量的值
price = 666;
//再次输出变量的值
System.out.println(price);
}
}
选择语句之if
选择语句有两种结构:
- if语句
- switch语句
这里我们先来学习if语句,它会根据判定的结果(真或假)决定执行某个分支的代码
举例说明一下:
无人驾驶的核心就是需要编写大量的判断逻辑,让车辆的行驶变得更加安全。
了解了交通信号灯的基本逻辑后,下面呢,我们通过if语句来实现过马路的信号灯判断,而if语句呢,有三种格式,这里我们首先来学习第一种格式
if语句格式1
范例:
执行流程:
了解完if语句格式1之后,下面我们到IDEA中去使用一下:
if语句格式1
/*
if语句格式1
*/
public class IfDemo01 {
public static void main(String[] args) {
//定义一个变量,用来表示绿灯的状态
boolean isGreen = true;
isGreen = false;
if(isGreen) {
System.out.println("绿灯行");
}
}
}
if语句格式2
/*
if语句格式2
*/
public class IfDemo02 {
public static void main(String[] args) {
//定义一个变量,用来表示绿灯的状态
boolean isGreen = true;
isGreen = false;
if (isGreen) {
System.out.println("绿灯行");
} else {
System.out.println("不是绿灯,不允许行使");
}
}
}
范例:
执行流程:
讲解完if语句格式2之后,我们到IDEA中再去看一段代码:
public class IfDemo03 {
public static void main(String[] args) {
//定义三个变量,表示交通信号灯的三种状态
boolean isRed = true;
boolean isGreen = true;
boolean isYellow = true;
if (isRed) {
System.out.println("红灯停");
}
if (isGreen) {
System.out.println("绿灯行");
}
if (isYellow) {
System.out.println("黄灯亮了等一等");
}
}
}
if语句格式3:
范例:
执行流程:
讲解完if语句格式2之后,我们到IDEA中再去看一段代码:
/*
if语句格式3
*/
public class IfDemo03 {
public static void main(String[] args) {
//定义三个变量,表示交通信号灯的三种状态
boolean isRed = true;
boolean isGreen = true;
boolean isYellow = true;
//红灯
// isGreen = false;
// isYellow = false;
//绿灯
// isRed = false;
// isYellow = false;
//黄灯
// isRed = false;
// isGreen = false;
//出现了故障,信号灯都不亮了
isRed = false;
isGreen = false;
isYellow = false;
if(isRed) {
System.out.println("红灯停");
}else if(isGreen) {
System.out.println("绿灯行");
}else if(isYellow) {
System.out.println("黄灯亮了等一等");
} else {
System.out.println("交通信号灯故障,请在保证安全的情况下通行");
}
}
}
执行流程:
案例1(交通信号灯)
需求:交通信号灯由红灯、绿灯、黄灯组成,请通过程序实现不同的信号灯给出不同的提示。
提示信息:红灯停、绿灯行、黄灯亮了等一等
首先,我们来简单的分析一下:
分析:
① 用哪种类型来表示信号灯的三种状态呢?
用int类型来表示信号灯的三种状态(1表示红灯,2表示绿灯,3表示黄灯)
② 用if语句的哪种格式来实现该需求呢?
一般来说:1种情况的判断用if格式1,2种情况的判断用if格式2,多种情况的判断用if格式3
③ if语句判断的表达式该怎么写呢?
int light = 1;
if(light == 1) {…}
==:是关系运算符,用来判断两个数据是否相等,如果相等,结果为true,否则为false
分析完毕后,我们来说一下实现步骤:
实现步骤:
① 定义一个int类型的变量用来表示信号灯的状态(1表示红灯,2表示绿灯,3表示黄灯)
② 用if语句格式3进行多种情况的判断
③ 根据不同的情况给出不同的提示信息
知道了实现步骤,下面我们到IDEA中去实现一下:
/*
需求:交通信号灯由红灯、绿灯、黄灯组成,请通过程序实现不同的信号灯给出不同的提示。
提示信息:红灯停、绿灯行、黄灯亮了等一等
*/
public class IfTest01 {
public static void main(String[] args) {
//1:定义一个int类型的变量用来表示信号灯的状态(1表示红灯,2表示绿灯,3表示黄灯)
int light = 1;
light = 2;
light = 3;
light = 4;
//2:用if语句格式3进行多种情况的判断
//3:根据不同的情况给出不同的提示信息
if (light == 1) {
System.out.println("红灯停");
} else if (light == 2) {
System.out.println("绿灯行");
} else if (light == 3) {
System.out.println("黄灯亮了等一等");
} else {
System.out.println("交通信号灯故障,请在保证安全的情况下通行");
}
}
}
关系运算符
Java中的关系运算符有如下几种:
了解了Java中的关系运算符之后,下面我们到IDEA中去使用一下:
/*
关系运算符
*/
public class OperatorDemo01 {
public static void main(String[] args) {
//定义三个int类型的变量
int i = 10;
int j = 20;
int k = 10;
//等于:==
System.out.println(i == j);//false
System.out.println(i == k);//true
System.out.println("--------");
//不等于:!=
System.out.println(i != j);//true
System.out.println(i != k);//false
System.out.println("--------");
//大于:>
System.out.println(i > j);//false
System.out.println(i > k);//false
System.out.println("--------");
//大于等于:>=
System.out.println(i >= j);//false
System.out.println(i >= k);//true
System.out.println("--------");
//千万不要把==写成了=
System.out.println(i = j); //20
}
}
案例2(奇偶数)
需求:给定一个整数,请用程序实现判断该整数是奇数还是偶数,并在控制台输出该整数是奇数还是偶数
提示:偶数是能够被2整除的整数
首先,我们来简单的分析一下:
分析:
① 如何判断一个整数是奇数还是偶数?
整数对2进行取余,余数为0是偶数,否则为奇数
② 用if语句的哪种格式来实现该需求呢?
该整数要么是偶数,要么是奇数,2种情况,所以用if语句格式2
分析完毕后,我们来说一下实现步骤:
实现步骤:
① 定义一个int类型的整数
② 用if语句格式2进行判断
③ 根据是否是偶数给出不同的提示信息
知道了实现步骤,下面我们到IDEA中去实现一下:
/*
需求:给定一个整数,请用程序实现判断该整数是奇数还是偶数,并在控制台输出该整数是奇数还是偶数
*/
public class IfTest02 {
public static void main(String[] args) {
//1:定义一个int类型的整数
int number = 10;
number = 9;
//2:用if语句格式2进行判断
//3:根据是否是偶数给出不同的提示信息
if (number % 2 == 0) {
System.out.println(number + "是偶数");
} else {
System.out.println(number + "是奇数");
}
}
}
案例3(手机以旧换新)
需求:张三想买一台7988元的新手机,他的旧手机在二手市场能卖1500元,而手机专卖店推出以旧换新优惠,把他旧手机交给店家,新手机就能够打8折优惠。
为了更省钱,要不要以旧换新?请通过程序告诉张三
首先,我们来简单的分析一下:
分析:
① 计算不使用以旧换新的花费
7988 - 1500
② 计算使用以旧换新的花费
7988 * 0.8
③ 用if语句的哪种格式来实现该需求呢?
if语句格式2
分析完毕后,我们来说一下实现步骤:
实现步骤:
① 定义变量(money1)纪录不使用以旧换新的花费
② 定义变量(money2)纪录使用以旧换新的花费
③ 用if语句格式2进行判断 money1是否大于money2
④ 根据判断结果,给出相应的提示
知道了实现步骤,下面我们到IDEA中去实现一下:
/*
需求:张三想买一台7988元的新手机,他的旧手机在二手市场能卖1500元,而手机专卖店推出以旧换新优惠,
把他的旧手机交给店家,新手机就能够打8折优惠。为了更省钱,要不要以旧换新?请通过程序告诉张三
*/
public class IfTest03 {
public static void main(String[] args) {
//1:定义变量(money1)纪录不使用以旧换新的花费
int money1 = 7988 - 1500;
//2:定义变量(money2)纪录使用以旧换新的花费
double money2 = 7988 * 0.8;
//3:用if语句格式2进行判断 money1是否大于money2
//4:根据判断结果,给出相应的提示
if (money1 > money2) {
System.out.println("使用以旧换新更省钱");
} else {
System.out.println("不使用以旧换新更省钱");
}
}
}
逻辑运算符
Java中常用的逻辑运算符有如下几种:
了解了Java中的逻辑运算符之后,下面我们到IDEA中去使用一下:
/*
逻辑运算符
*/
public class OperatorDemo02 {
public static void main(String[] args) {
//定义变量
int i = 10;
int j = 20;
int k = 30;
//逻辑与:&&
System.out.println((i>j) && (i>k));//false && false
System.out.println((i<j) && (i>k));//true && false
System.out.println((i>j) && (i<k));//false && true
System.out.println((i<j) && (i<k));//true && true
System.out.println("-----------------------");
//逻辑或:||
System.out.println((i>j) || (i>k));//false || false
System.out.println((i<j) || (i>k));//true || false
System.out.println((i>j) || (i<k));//false || true
System.out.println((i<j) || (i<k));//true || true
System.out.println("-----------------------");
//逻辑非:!
System.out.println(!(i>j));//!false
System.out.println(!!(i>j));//!!false
System.out.println(!!!(i>j));//!!!false
System.out.println(!!!!(i>j));//!!!!false
}
}
三元运算符
来,继续啊,下面我们来学习三元运算符:
格式:关系表达式 ?表达式1 :表达式2;
范例:a > b ? a : b;
执行流程:
-
首先计算关系表达式的值
-
如果值为true,表达式1的值就是运算结果
如果值为false,表达式2的值就是运算结果
了解了三元运算符的执行流程后,下面我们到IDEA中去使用一下:
/* 三元运算符 *
/public class OperatorDemo03 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println("较大的值是:" + max);
}}
三元运算符和if语句格式2的区别
这里呢,我们来讲解一下三元运算符和if语句格式2的区别,它们有什么区别呢?我们先到IDEA中进行讲解,然后再回来总结:
/*
三元运算符和if语句格式2的区别
*/
public class OperatorTest {
public static void main(String[] args) {
//定义两个int类型的变量
int a = 10;
int b = 20;
//需求:获取两个数中的较大值
//if语句实现
// int max;
// if (a > b) {
// max = a;
// } else {
// max = b;
// }
// System.out.println("较大的值是:" + max);
if(a > b) {
System.out.println("较大的值是:" + a);
}else {
System.out.println("较大的值是:" + b);
}
//三元运算符实现
int max = a > b? a: b;
System.out.println("较大的值是:" + max);
}
}
讲解完毕之后,回来总结一下:
- 如果if语句控制的内容:是用变量纪录数据值,可以通过三元运算符改进
如果if语句控制的内容是:是通过输出语句直接输出数据值,无法通过三元运算符改进
选择语句之switch
格式:
格式说明:
执行流程:
了解完switch语句后,下面我们到IDEA中去使用一下:
/*
switch语句
*/
public class SwitchDemo {
public static void main(String[] args) {
//定义一个int类型的变量用来表示信号灯的状态(1表示红灯,2表示绿灯,3表示黄灯)
int light = 1;
// light = 2;
// light = 3;
// light = 4;
//用switch语句实现交通信号灯案例
switch (light) {
case 1:
System.out.println("红灯停");
break;
case 2:
System.out.println("绿灯行");
break;
case 3:
System.out.println("黄灯亮了等一等");
break;
default:
System.out.println("交通信号灯故障,请在保证安全的情况下通行");
break;
}
}
}
注意:在switch语句中,如果case控制的语句体后面不写break,将出现穿透现象,在不判断下一个case值的情况下,向下运行,直到遇到break,或者整个switch语句结束
循环语句
for循环结构
格式:
格式说明:
- 初始化语句:这里可以是一条或者多条语句,这些语句用来完成初始化操作(int i=1)
- 条件判断语句:这里使用一个结果值为boolean类型的表达式,这个表达式能决定是否执行循环体语句(i<=1000)
- 循环体语句:这里可以是任意语句,这些语句可能被多次执行(展示手机信息)
- 条件控制语句:这里通常是使用一条语句来改变变量的值,从而达到控制循环是否继续向下执行的效果(i+=1)
范例:
执行流程:
知道了for循环的格式和执行流程后,下面我们到IDEA中去演示一下:
/*
for循环结构
*/
public class ForDemo {
public static void main(String[] args) {
for(int i=1; i<=5; i+=1) {
System.out.println("HelloWorld");
}
}
}
案例1(输出数据)
需求:在控制台输出1-5的数据
首先,我们来简单的分析一下:
分析:
① 反复进行输出的动作,使用循环结构
② 从1开始到5结束,设置初始化从1开始
③ 从1开始到5结束,设置判断条件为没有到5的时候继续执行,执行到超过5程序结束
④ 从1到5,每次增加1,设置条件控制每次+1
⑤ 将反复进行的事情写入循环结构内部,打印对应数据
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:在控制台输出1-5的数据
*/
public class ForTest01 {
public static void main(String[] args) {
System.out.println(1);
System.out.println(2);
System.out.println(3);
System.out.println(4);
System.out.println(5);
System.out.println("--------------");
for (int i = 1; i <= 5; i += 1) {
System.out.println(i);
}
System.out.println("--------------");
for (int i = 1; i <= 5; i += 2) {
System.out.println(i);
}
System.out.println("--------------");
//自增运算符:++
//它跟在变量的后面表示变量的值+1
for (int i = 1; i <= 5; i++) {
System.out.println(i);
}
System.out.println("--------------");
for (int i = 1; i <= 5; i++,i++) {
System.out.println(i);
}
System.out.println("--------------");
//我要获取数据5-1该怎么办呢?
for (int i=5; i>=1; i-=1) {
System.out.println(i);
}
System.out.println("--------------");
for (int i=5; i>=1; i--) {
System.out.println(i);
}
}
}
案例2(求和思想)
需求:求1-5之间的数据和,并把求和结果在控制台输出
首先,我们先到IDEA中去实现一下,然后再回来总结。
/*
需求:求1-5之间的数据和,并把求和结果在控制台输出
*/
public class ForTest02 {
public static void main(String[] args) {
//定义一个求和变量,用于保存求和的结果
int sum = 0;
//我们通过for循环实现获取数据1-5
for (int i=1; i<=5; i++) {
//i,1,2,3,4,5
// sum = sum + i;
sum += i;
/*
第一次求和:sum = sum + i = 0 + 1 = 1
第二次求和:sum = sum + i = 1 + 2 = 3
第三次求和:sum = sum + i = 3 + 3 = 6
第四次求和:sum = sum + i = 6 + 4 = 10
第五次求和:sum = sum + i = 10 + 5 = 15
*/
}
//输出结果
System.out.println("1-5的求和结果是:" + sum);
}
}
最后,我们来总结一下求和思想的实现步骤:
实现步骤:
① 求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
② 从1开始到5结束的数据,使用循环结构完成
③ 将反复进行的事情写入循环结构内部
此处反复进行的事情是将数据 i 加到用于保存最终求和的变量 sum 中
④ 当循环执行完毕时,将最终数据打印出来
案例3(求偶数和)
需求:求1-100之间的偶数和,并把求和结果在控制台输出
首先,我们来简单的分析一下:
分析:
① 对1-100的数据求和与1-5的数据求和几乎完全一样,仅仅是结束条件不同
② 对1-100的偶数求和,需要对求和操作添加限制条件
③ 限制条件是偶数才参与运算,因此条件应该是判断是否是偶数
④ 当循环执行完毕时,将最终数据打印出来
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:求1-100之间的偶数和,并把求和结果在控制台输出
*/
public class ForTest03 {
public static void main(String[] args) {
//1:求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
int sum = 0;
//2:对1-100的数据求和与1-5的数据求和几乎完全一样,仅仅是结束条件不同
for (int i=1; i<=100; i++) {
//3:对1-100的偶数求和,需要对求和操作添加限制条件,判断是否是偶数
if(i % 2 == 0) {
sum += i;
}
}
//4:当循环执行完毕时,将最终数据打印出来
System.out.println("1-100之间的偶数和是:" + sum);
}
}
案例4(水仙花数)
需求:在控制台输出所有的“水仙花数”
看到这个需求,我们首先要解决的问题就是,什么样的数据是“水仙花数”?它满足如下两个条件:
① 水仙花数是一个三位数
比如:111 222 333 370 371 520 999
② 水仙花数的个位、十位、百位的数字立方和等于原数
比如:
知道了什么是水仙花数后,我们再来回顾一下如何获取一个数据的个位,十位,百位:
假设一个三位数为x,则
- 个位:x%10
- 十位:x/10%10
- 百位:x/100%10
了解了水仙花数相关的基础知识后,下面我们来说一下这个案例的实现步骤:
实现步骤:
① 获取三位数,通过循环实现
② 获取每一个三位数的个位,十位,百位
③ 判断该三位数是否是水仙花数
④ 输出水仙花数
知道了实现步骤,下面我们到IDEA中去实现一下:
/*
需求:在控制台输出所有的“水仙花数”
*/
public class ForTest04 {
public static void main(String[] args) {
//1:获取三位数,通过循环实现
// for (int i=100; i<=999; i++) {
//
// }
for (int i = 100; i < 1000; i++) {
//2:获取每一个三位数的个位,十位,百位
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
//3:判断该三位数是否是水仙花数
if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i) {
//4:输出水仙花数
System.out.println(i);
}
}
}
}
案例5(统计思想)
需求:统计“水仙花数”一共有多少个,并在控制台输出个数
首先,我们先到IDEA中去实现一下,然后再回来总结。
/*
需求:统计“水仙花数”一共有多少个,并在控制台输出个数
*/
public class ForTest05 {
public static void main(String[] args) {
//定义一个统计变量,用于数据的统计,初始化值为0
int count = 0;
for (int i = 100; i < 1000; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100 % 10;
if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i) {
// System.out.println(i);
//1,2,3,...
count++;
}
}
//输出水仙花的个数
System.out.println("水仙花数一共有:" + count + "个");
}
}
最后,我们来总结一下统计思想的实现步骤:
实现步骤:
① 定义统计变量count,初始化值为0
② 在判定水仙花数的过程中,满足条件不再输出,更改为修改count的值,使count+1
③ 输出统计变量的值
案例6(回文数)
需求:输出所有五位数的回文数
看到这个需求,我们首先要解决的问题就是,什么样的数据是“回文数”?
那什么是“回文数”呢?一个数,无论是从左往右读,还是从右往左读,读起来都相同的数,叫做“回文数”
举例:
10101,12321:是回文数
12345:不是回文数
规律:
个位 = 万位
十位 = 千位
和百位无关
了解了回文数相关的基础知识后,我们来说一下这个案例的实现步骤:
实现步骤:
① 获取五位数,通过循环实现
② 获取每一个五位数的个位,十位,千位,万位
③ 判断该五位数是否是回文数
④ 输出回文数
知道了实现步骤,下面我们到IDEA中去实现一下:
/*
需求:输出所有五位数的回文数
*/
public class ForTest06 {
public static void main(String[] args) {
//1:获取五位数,通过循环实现
for (int i = 10000; i < 100000; i++) {
//2:获取每一个五位数的个位,十位,千位,万位
int ge = i % 10;
int shi = i / 10 % 10;
int qian = i / 1000 % 10;
int wan = i / 10000 % 10;
//3:判断该五位数是否是回文数
if ((ge == wan) && (shi == qian)) {
//4:输出回文数
System.out.println(i);
}
}
//练习:统计五位数的回文数个数,并在控制台输出个数
}
}
案例7(逢七过)
需求:朋友聚会的时候可能会玩一个游戏:逢七过。
规则是:从任意一个数字开始报数,当你要报的数字包含7或者是7的倍数时都要说:过。
为了帮助大家更好的玩这个游戏,这里我们直接在控制台打印出1-100之间的满足逢七必过规则的数据。
这样,大家将来在玩游戏的时候,就知道哪些数据要说:过。
首先,我们来简单的分析一下:
分析:
① 数据的范围1-100之间,用循环很容易实现
② 要满足的条件是:数字包含7(个位是7,或者十位是7),或者是7的倍数
假如有一个数据:x
判断个位为7:x%10 == 7
判断十位为7:x/10%10 == 7
判断是7的倍数:x%7 == 0
分析完毕后,我们来说一下实现步骤:
实现步骤:
① 获取1-100之间的数据,通过循环实现
② 判断数字包含7或者是7的倍数
判断数据:要么个位是7,要么十位是7,要么能够被7整除
③ 在控制台输出满足条件的数据
知道了实现步骤,下面我们到IDEA中去实现一下:
/*
需求:朋友聚会的时候可能会玩一个游戏:逢七过。
*/
public class ForTest07 {
public static void main(String[] args) {
//1:获取1-100之间的数据,通过循环实现
for (int i = 1; i <= 100; i++) {
//2:判断数字包含7或者是7的倍数(判断数据:要么个位是7,要么十位是7,要么能够被7整除)
if ((i % 10 == 7) || (i / 10 % 10 == 7) || (i % 7 == 0)) {
//3:在控制台输出满足条件的数据
System.out.println(i);
}
}
}
}
while循环结构
格式:
范例:
知道了while循环的格式后,下面我们到IDEA中去演示一下:
/*
while循环结构
*/
public class WhileDemo {
public static void main(String[] args) {
int i = 1;
while (i<=5) {
System.out.println("HelloWorld");
i++;
}
}
}
代码演示后,通过Debug查看了一下程序的执行流程,让我们更清晰while循环的执行流程。
最后,我们再来总结一下while循环的执行流程:
执行流程:
案例1(求奇数和)
需求:求1-100之间的奇数和,并把求和结果在控制台输出
首先,我们来简单的分析一下:
分析:
① 对1-100的奇数求和,和前面讲解的偶数求和几乎是完全一样,仅仅是判断条件不同
② 判断条件是奇数才参与运算,因此条件应该是判断是否是奇数
③ 当循环执行完毕时,将最终数据打印出来
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:求1-100之间的奇数和,并把求和结果在控制台输出
*/
public class WhileTest01 {
public static void main(String[] args) {
//定义求和变量,初始化值为0
int sum = 0;
//获取1-100之间的数据
// int i = 1;
// while (i<=100) {
// //判断数据是否是奇数
//// if(i%2 != 0) {
//// sum += i;
//// }
//
// if(i%2 == 1) {
// sum += i;
// }
//
// i++;
// }
int i = 1;
while (i <= 100) {
sum += i;
i += 2; //1,3,5,7...99,101
}
//输出结果
System.out.println("1-100之间的奇数和是:" + sum);
}
}
案例2(珠穆朗玛峰)
需求:世界最高峰珠穆朗玛峰(8848.86m),我现在有一张足够大的纸张,厚度为:0.001m。请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
首先,我们来简单的分析一下:
分析:
① 因为要反复折叠,所以要使用循环,该选for循环还是while循环呢?
<font color='red'>**小技巧:循环次数明确,使用for循环;循环次数不明确,使用while循环**</font>
这里不知道折叠多少次,这种情况下更适合使用while循环
② 纸张每折叠一次,厚度加倍,因此要先定义纸张厚度,在循环中使厚度加倍
③ 什么时候就停止折叠了呢?直到纸张的厚度大于等于珠峰的高度,反言之,就要折叠
④ 要求的是统计折叠次数,所以会用到统计思想
分析完毕后,我们来说一下实现步骤:
实现步骤:
① 定义统计变量,初始化值为0
② 定义纸张厚度变量和珠峰高度变量
③ 用while循环实现反复折叠,判断条件是纸张厚度小于珠峰高度
④ 循环体中要做两件事情:一是纸张厚度加倍,二是统计变量+1
⑤ 当循环结束,输出统计变量的值
知道了实现步骤,下面我们到IDEA中去实现一下:
/*
需求:世界最高峰珠穆朗玛峰(8848.86m),我现在有一张足够大的纸张,厚度为:0.001m。
请问,我折叠多少次,就可以保证厚度不低于珠穆朗玛峰的高度?
*/
public class WhileTest02 {
public static void main(String[] args) {
//1:定义统计变量,初始化值为0
int count = 0;
//2:定义纸张厚度变量和珠峰高度变量
double paper = 0.001;
double zf = 8848.86;
//3:用while循环实现反复折叠,判断条件是纸张厚度小于珠峰高度
while (paper < zf) {
//4:循环体中要做两件事情:一是纸张厚度加倍,二是统计变量+1
paper *= 2;
count++;
}
//5:当循环结束,输出统计变量的值
System.out.println("要折叠" + count + "次");
}
}
do-while循环结构
格式:
范例:
知道了do-while循环的格式后,下面我们到IDEA中去演示一下:
/*
do...while循环结构
*/
public class DoWhileDemo {
public static void main(String[] args) {
int i = 1;
do {
System.out.println("HelloWorld");
i++;
} while (i<=5);
}
}
执行流程:
三种循环的区别
这三种循环语句的区别,我们先到IDEA中去讲解,然后再回来总结:
/*
三种循环的区别
*/
public class LoopTest {
public static void main(String[] args) {
// //for循环
// for (int i = 3; i < 3; i++) {
// System.out.println("我爱Java");
// }
// System.out.println("--------");
//
// //while循环
// int j = 3;
// while (j < 3) {
// System.out.println("我爱Java");
// j++;
// }
// System.out.println("--------");
//
// //do...while循环
// int k = 3;
// do {
// System.out.println("我爱Java");
// k++;
// } while (k < 3);
// //for循环
// for (int i = 1; i < 3; i++) {
// System.out.println("我爱Java");
// }
//// System.out.println(i);
// System.out.println("--------");
//
// //while循环
// int j = 1;
// while (j < 3) {
// System.out.println("我爱Java");
// j++;
// }
// System.out.println(j);
// System.out.println("--------");
//死循环
// for (;;) {
// System.out.println("for...");
// }
// while (true) {
// System.out.println("while...");
// }
do {
System.out.println("do...while...");
} while (true);
}
}
三种循环语句的区别:
for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)
do...while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)
for和while的区别:
条件控制语句所控制的自增变量,在for循环结束后,就不可以继续使用了
条件控制语句所控制的自增变量,在while循环结束后,还可以继续使用
死循环格式:
for(;;){}
while(true) {}
do{}while(true);
由于循环语句的区别,只是大家需要理解的知识点,故这里不需要练习,我们在后面的使用中,在慢慢体会即可。
continue和break
场景一:周一到周五上班,周六日不上班
场景二:成人后一直工作到60岁,60岁之后就可以退休养老了
刚才的场景中,重点介绍了两个跳转关键字:
- continue 用在循环中,基于条件控制,跳过某次循环体内容的执行,继续下一次的执行
- break 用在循环中,基于条件控制,终止循环体内容的执行,也就是说结束当前的整个循环
了解了这两个跳转关键字之后,下面我们到IDEA中去体验一下:
/*
continue:用在循环中,基于条件控制,跳过某次循环体内容的执行,继续下一次的执行
break:用在循环中,基于条件控制,终止循环体内容的执行,也就是说结束当前的整个循环
*/
public class ControlDemo {
public static void main(String[] args) {
for (int i = 1; i <= 5; i++) {
if (i % 2 == 0) {
// continue;
break;
}
System.out.println(i);
}
}
}
综合案例(存钱)
需求:小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱。
/*
需求:小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱,请问,经过多少天,小芳才可以存到100元钱。
*/
public class ControlTest {
public static void main(String[] args) {
//小芳的妈妈每天给她2.5元钱
double dayMoney = 2.5;
//她都会存起来,涉及到了求和思想,定义求和变量,初始化值为0
double sumMoney = 0;
//存到100元钱
int result = 100;
//定义一个统计变量,用来纪录存钱的天数,初始化值为1
int dayCount = 1;
//因为不知道要多少天才能够存到100元,所以,这里我们采用死循环来实现,当存到100元的时候,通过break跳转语句让循环结束
while (true) {
//存钱
sumMoney += dayMoney;
//判断存的钱是否大于等于100了,如果是,就退出循环
if(sumMoney >= result) {
break;
}
//每当这一天是存钱的第5天或者5的倍数的话,她都会花去6元钱
if(dayCount%5 == 0) {
sumMoney -= 6;
System.out.println("第" + dayCount + "天花了6元");
}
dayCount++;
}
//输出统计天数的变量
System.out.println("共花了" + dayCount + "天存了100元");
}
}
方法
方法的定义和调用
格式:
范例:
知道了方法的定义格式后,我们到IDEA中去演示一下:
/*
定义格式:
public static void 方法名() {
//方法体
}
*/
public class MethodDemo {
public static void main(String[] args) {
//调用方法
isEvenNumber();
}
//需求:定义一个方法,在方法中定义一个变量,判断该数据是否是偶数
public static void isEvenNumber() {
//在方法中定义一个变量
int number = 10;
number = 9;
//判断该数据是否是偶数
if (number % 2 == 0) {
System.out.println(number + "是偶数");
} else {
System.out.println(number + "不是偶数");
}
}
}
方法的调用和注意事项:
格式:
范例:
注意事项:
- 方法定义完毕后,需要调用才能执行
- 方法必须先定义后调用,否则程序将报错
Debug查看方法调用
按照 Debug 的正常使用即可,但是要注意如下事项:
- 进入一个方法的时候,需要用 Step Into F7
- 在方法内部,看每一行代码的执行流程,使用 Step Over F8
- 注意观察方法的出现和消失,以及变量的变化
案例(输出较大值)
需求:设计一个方法用于打印两个数中的较大数
首先,我们来简单的分析一下:
分析:
① 定义一个方法,用于打印两个数字中的较大数,例如:getMax()
② 方法中定义两个变量,用于保存两个数字
③ 使用if语句对两个数字的大小关系进行处理
④ 在main()方法中调用定义好的方法
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:设计一个方法用于打印两个数中的较大数
分析:
1:定义一个方法,用于打印两个数字中的较大数,例如:getMax()
2:方法中定义两个变量,用于保存两个数字
3:使用if语句对两个数字的大小关系进行处理
4:在main()方法中调用定义好的方法
*/
public class MethodTest {
public static void main(String[] args) {
//在main()方法中调用定义好的方法
getMax();
}
//定义一个方法,用于打印两个数字中的较大数,例如:getMax()
public static void getMax() {
//方法中定义两个变量,用于保存两个数字
int a = 10;
int b = 20;
//使用if语句对两个数字的大小关系进行处理
if(a >= b) {
System.out.println("较大的数是:" + a);
} else {
System.out.println("较大的数是:" + b);
}
}
}
带参数方法的定义和调用
格式:
范例:
注意事项:
- 带参方法定义时,参数中的数据类型与变量名都不能缺少,缺少任意一个程序将报错
- 带参方法定义时,多个参数之间使用逗号(,)分隔
知道了带参数方法的定义格式后,我们到IDEA中去演示一下:
/*
带参数方法的定义和调用
定义格式:
public static void 方法名(参数) { … … }
*/
public class MethodDemo {
public static void main(String[] args) {
//字面量值调用
isEvenNumber(10);
isEvenNumber(9);
//变量的调用
int number = 11;
isEvenNumber(number);
number = 12;
isEvenNumber(number);
}
//需求:定义一个方法,该方法接收一个参数,判断该数据是否是偶数
public static void isEvenNumber(int number) {
if (number % 2 == 0) {
System.out.println(true);
} else {
System.out.println(false);
}
}
}
带参数方法的调用和注意事项:
格式:
范例:
注意事项:
- 带参方法调用时,参数的数量与类型必须与方法定义中的设置相匹配,否则程序将报错
形参和实参
形参:方法定义中的参数
等同于变量定义格式,例如:int number
实参:方法调用中的参数
等同于使用变量或字面量,例如: 10 number
案例(输出较大值)
需求:设计一个方法用于打印两个数中的较大数,数据来自于方法参数
首先,我们来简单的分析一下:
分析:
① 定义一个方法,用于打印两个数字中的较大数,例如:getMax()
② 为方法定义两个参数,用于接收两个数字
③ 使用if语句对两个数字的大小关系进行处理
④ 在main()方法中调用定义好的方法(使用字面量)
⑤ 在main()方法中调用定义好的方法(使用变量)
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:设计一个方法用于打印两个数中的较大数,数据来自于方法参数
分析:
1:定义一个方法,用于打印两个数字中的较大数,例如:getMax()
2:为方法定义两个参数,用于接收两个数字
3:使用if语句对两个数字的大小关系进行处理
4:在main()方法中调用定义好的方法(使用字面量)
5:在main()方法中调用定义好的方法(使用变量)
*/
public class MethodTest {
public static void main(String[] args) {
//在main()方法中调用定义好的方法(使用字面量)
getMax(10,20);
// getMax(a:10,b:20); //idea的智能提示,不要手动的去写a,b
// getMax(30);
// getMax(10.0,20,0);
//调用方法的时候,人家要几个,你就给几个,人家要什么类型,你就给什么类型
//在main()方法中调用定义好的方法(使用变量)
// int a = 10;
// int b = 20;
// getMax(a,b);
int x = 10;
int y = 20;
getMax(x,y);
}
//定义一个方法,用于打印两个数字中的较大数,例如:getMax()
//为方法定义两个参数,用于接收两个数字
public static void getMax(int a, int b) {
//使用if语句对两个数字的大小关系进行处理
if(a >= b) {
System.out.println("较大的数是:" + a);
}else {
System.out.println("较大的数是:" + b);
}
}
}
带返回值方法的定义和调用
格式:
范例:
注意事项:
- 方法定义时return后面的返回值与方法定义上的数据类型要匹配,否则程序将报错
知道了带返回值方法的定义格式后,我们到IDEA中去演示一下:
/*
带返回值方法的定义和调用
定义格式:
public static 数据类型 方法名(参数) {
return 数据;
}
*/
public class MethodDemo {
public static void main(String[] args) {
// isEvenNumber(10);
// //true;
boolean flag = isEvenNumber(10);
//boolean flag = true;
System.out.println(flag);
// if(flag) {
// System.out.println("是偶数就输出这句话");
// }
}
//需求:定义一个方法,该方法接收一个参数,判断该数据是否是偶数,并返回真假值
public static boolean isEvenNumber(int number) {
if (number % 2 == 0) {
return true;
} else {
return false;
}
}
}
格式:
注意事项:
- 方法的返回值通常会使用变量接收,否则该返回值将无意义
案例(输出较大值)
需求:设计一个方法可以获取两个数的较大值,数据来自于参数
首先,我们来简单的分析一下:
分析:
① 定义一个方法,用于获取两个数字中的较大数,例如:getMax()
② 使用if语句对两个数字的大小关系进行处理
③ 根据题设分别设置两种情况下对应的返回结果
④ 在main()方法中调用定义好的方法并使用变量保存
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:设计一个方法可以获取两个数的较大值,数据来自于参数
分析:
1:定义一个方法,用于获取两个数字中的较大数,例如:getMax()
2:使用if语句对两个数字的大小关系进行处理
3:根据题设分别设置两种情况下对应的返回结果
4:在main()方法中调用定义好的方法并使用变量保存
*/
public class MethodTest {
public static void main(String[] args) {
//在main()方法中调用定义好的方法并使用变量保存
// int max = getMax(10,20);
// System.out.println(max);
int max = getMax(10, 20); //.var的使用,它能够帮我们自动补齐左边的内容
System.out.println(max); //max.sout,能够把max变量放到输出语句中
System.out.println(getMax(10,20));
System.out.println(getMax(10, 20));
}
//定义一个方法,用于获取两个数字中的较大数,例如:getMax()
public static int getMax(int a,int b) {
//使用if语句对两个数字的大小关系进行处理
//根据题设分别设置两种情况下对应的返回结果
if(a >= b) {
return a;
} else {
return b;
}
}
}
方法的注意事项
1、方法不能嵌套定义
2、void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据
讲解完毕后,到IDEA中去演示一下:
/*
方法注意事项:
方法不能嵌套定义
void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据
*/
public class MethodDemo {
public static void main(String[] args) {
}
public static void methodOne() {
return;
}
public static void methodTwo() {
// return 100;
return;
// System.out.println("HelloWorld");
}
}
方法的通用格式
格式:
格式说明:
- public static 修饰符,目前先记住这个格式
- 返回值类型 方法操作完毕之后返回的数据的数据类型,如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
- 方法名 调用方法时候使用的标识
- 参数 由数据类型和变量名组成,多个参数之间用逗号隔开
- 方法体 完成功能的代码块
- return 如果方法操作完毕,有数据返回,用于把数据返回给调用者
定义方法时,要做到两个明确
- 明确返回值类型: 主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
- 明确参数: 主要是明确参数的类型和数量
而在调用方法时,我们要知道下面两种不同返回值类型的方法调用:
- void类型的方法,直接调用即可
- 非void类型的方法,推荐用变量接收调用
这里我们总结了一下方法的通用格式和对应的说明。
案例(比较相等)
需求:设计一个方法用于比较两个整数是否相等,调用方法,把结果在控制台输出。
首先,我们来简单的分析一下:
分析:
① 方法定义
使用两个明确分析该方法的参数和返回值
参数:int a,int b
返回值类型:boolean
② 方法调用
变量接收调用
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:设计一个方法用于比较两个整数是否相等,调用方法,把结果在控制台输出。
*/
public class MethodTest02 {
public static void main(String[] args) {
boolean flag = compare(10, 20);
System.out.println("10和20相等吗:" + flag);
flag = compare(10,10);
System.out.println("10和10相等吗:" + flag);
}
/*
使用两个明确分析该方法的参数和返回值
参数:int a,int b
返回值类型:boolean
*/
public static boolean compare(int a,int b) {
//比较两个整数是否相等
// if(a == b) {
// return true;
// } else {
// return false;
// }
// boolean flag = (a == b) ? true : false;
// return flag;
// boolean flag = (a == b);
// return flag;
return a == b;
}
}
案例(较大值)
需求:设计一个方法用于获取三个整数较大值,调用方法,把结果在控制台输出。
首先,我们来简单的分析一下:
分析:
① 方法定义
使用两个明确分析该方法的参数和返回值
参数:int a,int b,int c
返回值类型:int
② 方法调用
变量接收调用
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:设计一个方法用于获取三个整数较大值,调用方法,把结果在控制台输出。
*/
public class MethodTest03 {
public static void main(String[] args) {
int max = getMax(10, 20, 30);
System.out.println("10,20,30中的较大值是:" + max);
}
/*
使用两个明确分析该方法的参数和返回值
参数:int a,int b,int c
返回值类型:int
*/
public static int getMax(int a, int b, int c) {
//获取三个整数较大值
// if (a >= b) {
// if (a >= c) {
// return a;
// } else {
// return c;
// }
// } else {
// if (b >= c) {
// return b;
// } else {
// return c;
// }
// }
int tempMax = a > b ? a : b;
int max = tempMax > c ? tempMax : c;
return max;
}
}
案例(水仙花)
需求:设计一个方法用于判断一个整数是否是水仙花数,调用方法,把结果在控制台输出。
首先,我们来简单的分析一下:
分析:
① 方法定义
使用两个明确分析该方法的参数和返回值
参数:int number
返回值类型:boolean
② 方法调用
变量接收调用
分析完毕之后,我们到IDEA中去实现一下:
/*
需求:设计一个方法用于判断一个整数是否是水仙花数,调用方法,把结果在控制台输出。
*/
public class MethodTest04 {
public static void main(String[] args) {
// boolean flag = isFlower(111);
// System.out.println(flag);
//
// flag = isFlower(153);
// System.out.println(flag);
for (int i=100; i<1000; i++) {
//i
// boolean flag = isFlower(i);
// if(flag) {
// System.out.println(i);
// }
if(isFlower(i)) {
System.out.println(i);
}
}
}
/*
使用两个明确分析该方法的参数和返回值
参数:int number
返回值类型:boolean
*/
public static boolean isFlower(int number) {
//判断一个整数是否是水仙花数
int ge = number % 10;
int shi = number / 10 % 10;
int bai = number / 100 % 10;
if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == number) {
return true;
} else {
return false;
}
}
}
方法重载
方法重载:指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法相互构成重载
- 多个方法在同一个类中
- 多个方法具有相同的方法名
- 多个方法的参数不相同,类型不同或者数量不同
如下图:
方法重载的特点:
- 类型不同或者数量不同重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
- 重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两个方法是否相互构成重载
知道了方法重载及其特点后,我们到IDEA中去体验一下:
/*
方法重载:
多个方法在同一个类中
多个方法具有相同的方法名
多个方法的参数不相同,类型不同或者数量不同
调用方法的时候,Java虚拟机会通过参数的不同来区分同名的方法
*/
public class MethodDemo {
public static void main(String[] args) {
//调用方法
int result = sum(10, 20);
System.out.println(result);
double result2 = sum(10.0, 20.0);
System.out.println(result2);
int result3 = sum(10, 20, 30);
System.out.println(result3);
}
//需求1:求两个int类型数据和的方法
public static int sum(int a,int b) {
return a + b;
}
//需求2:求两个double类型数据和的方法
public static double sum(double a,double b) {
return a + b;
}
//需求3:求三个int类型数据和的方法
public static int sum(int a,int b,int c) {
return a + b + c;
}
}
案例(比较相等)
需求:使用方法重载的思想,设计比较两个整数是否相等的方法,兼容全整数类型(byte,short,int,long)
比较整数是否想等,前面我们已经做过了,这里只不过是写几个重载的方法而已,基本思路讲解过了,这里就不在讲解了,我们直接到idea中去实现:
/*
需求:使用方法重载的思想,设计比较两个整数是否相等的方法,兼容全整数类型(byte,short,int,long)
*/
public class MethodTest {
public static void main(String[] args) {
System.out.println(compare(10,20));
System.out.println(compare((byte) 10,(byte) 20));
System.out.println(compare((short) 10,(short) 20));
System.out.println(compare(10L,20L));
}
//int
public static boolean compare(int a,int b) {
System.out.println("int");
return a == b;
}
//byte
public static boolean compare(byte a,byte b) {
System.out.println("byte");
return a == b;
}
//short
public static boolean compare(short a,short b) {
System.out.println("short");
return a == b;
}
//long
public static boolean compare(long a,long b) {
System.out.println("long");
return a == b;
}
}
数组
一维数组
数组(array):是一种用于存储多个相同数据类型的存储模型(可以理解为容器)。
数组定义和静态初始化
数组有两种定义格式:
-
格式1:数据类型[] 变量名;
-
范例: int[] arr;
-
定义了一个int类型的数组,数组名是arr
-
格式2:数据类型 变量名[];
-
范例: int arr[];
-
定义了一个int类型的变量,变量名是arr数组
这两种格式在使用上是没有区别的,但是在阅读的时候是有一个小区别的?
我们先来看格式1:定义了一个int类型的数组,数组名是arr;再来看格式2:定义了一个int类型的变量,变量名是arr数组
很明显,格式1明确的告诉了我们定义的是一个数组,所以,在定义数组的时候,我们推荐使用格式1。
数组的初始化:
-
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
-
注意:数组中的每一个数据,我们称之为数组中的元素
数组的静态初始化
- 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
- 格式:数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3,…};
- 范例:int[] arr = new int[]{1,2,3};
针对这种格式呢?Java提供了一种简化的格式,让我们使用起来更方便
- 简化格式:数据类型[] 变量名 = {数据1,数据2,数据3,…};
- 范例:int[] arr = {1,2,3};
数组元素访问(获取和修改)
数组元素访问这一块,我们要学习两个知识:
- 一个是数组变量的访问方式
- 一个是数组内部保存的数据的访问方式
我们先来说,数组变量访问方式
- 它的格式是这样的:数组名
我们可以通过输出语句,输出数组名,就能够得到一个数据。那这个数据是什么呢?不着急,一会我们会演示的。
接着,我们来说,数组内部保存的数据的访问方式
- 它的格式是:数组名[索引]
这个格式没有什么问题,但是这里的索引是什么呢?为了讲解这个索引,我们来看一下这样的一个场景:
在这里有一排人,在这排着队呢,为了知道他们站的位置,给他们进行1,2,3.。。。的编号。
这里的编号是从1开始的。
而计算机中编号习惯从0开始,这个从0开始的编号,我们就称之为索引。
- 索引是数组中数据的编号方式
- 作用:用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊的变量名
- 它还有这样的几个特征:
- 特征①:索引从0开始
- 特征②:索引是连续的
- 特征③:索引逐一增加,每次加1
知道了如何访问数组变量以及数组中的元素后,下面我们到idea中去演示一下。
/*
数组变量访问方式
格式:数组名
数组内部保存的数据的访问方式
格式:数组名[索引]
*/
public class ArrayDemo {
public static void main(String[] args) {
//定义一个数组,并进行初始化
// int[] scores = new int[]{93,96,99};
int[] scores = {93,96,99};
//输出数组名
System.out.println(scores); //[I@776ec8df
//输出数组中的元素
System.out.println(scores[0]);
System.out.println(scores[1]);
System.out.println(scores[2]);
System.out.println("-----------");
//修改数组中的元素
scores[0] = 100;
scores[1] = 98;
scores[2] = 95;
//再次输出数组中的元素
System.out.println(scores[0]);
System.out.println(scores[1]);
System.out.println(scores[2]);
}
}
案例1(数组常见操作之遍历)
数组常见操作有很多,这里我们先讲解下面这几个:
- 遍历
- 获取最大值
- 元素打乱
其他的操作,后续我们会进行讲解。
首先,我们来讲解数组遍历,那什么是数组遍历?我们一起来说一下:
- 数组遍历指的是:获取数组中的每一个元素,我们可以把获取到的元素输出在控制台
知道了什么是数组遍历后,我们到IDEA中去实现一下,然后再回来总结。
/*
遍历
*/
public class ArrayTest01 {
public static void main(String[] args) {
//定义数组并初始化
int[] arr = {1, 2, 3, 4, 5, 6};
//获取数组中的元素
// System.out.println(arr[0]);
// System.out.println(arr[1]);
// System.out.println(arr[2]);
// System.out.println(arr[3]);
// System.out.println(arr[4]);
//用循环改进
// for (int i=0; i<5; i++) {
// System.out.println(arr[i]);
// }
//格式:数组名.length
// System.out.println(arr.length);
for (int i=0; i<arr.length; i++) {
System.out.println(arr[i]);
}
}
}
什么是数组遍历:
- 获取数组中的每一个元素,我们可以把获取到的元素输出在控制台
获取数组长度(元素个数):
- 格式:数组名.length
- 范例:arr.length
数组遍历通用格式:
注意:数组遍历指的是把数组中的元素取出来,取出来之后可以(打印,求和,判断…)
数组遍历通用格式:
for (int i = 0; i < scores.length; i++) {
scores[i]
}
注意:数组遍历指的是把数组中的元素取出来,取出来之后可以(打印,求和,判断…)。
选择哪种操作,得根据我们的实际需求来看。
案例2(数组常见操作之获取最大值)
我们到idea中去实现一下:
/*
获取最大值
*/
public class ArrayTest02 {
public static void main(String[] args) {
//定义数组
int[] arr = {12, 45, 98, 73, 60};
//定义变量max存储最大值,取第一个数据为变量的初始值
int max = arr[0];
//与数组中剩余数据逐个比对,每次比对将最大值保存到变量max中
for (int i=1; i<arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
}
}
//循环结束后输出变量max的值
System.out.println("max:" + max);
}
}
案例3(数组常见操作之元素打乱)
什么是元素打乱呢?
- 元素打乱就是把数组中的元素随机交换位置,每次运行都可能产生不一样的结果
比如:arr = {12, 45, 98, 73, 60};
遍历:
- 正常情况下:12,45,98,73,60
- 元素打乱后:45,73,12,60,98
涉及到的操作:
- 获取数组中元素的随机索引
- Random r = new Random();
- int index = r.nextInt(arr.length);
- 数组中元素交换
我们给出这样的一个场景来理解数据交换:
把啤酒杯和红酒杯里面的酒进行交换
如何实现呢?
第一步:找来一个同类型的空酒杯
第二步:把红酒倒入到空酒杯中
第三步:把啤酒倒入到曾经装红酒的杯子中
第四步:把红酒从临时找来的杯子中倒入到曾经装啤酒的杯子中
下面我们到IDEA中去演示一下数据的交换:
/*
数据交换
*/
public class DataSwap {
public static void main(String[] args) {
// int a = 10;
// int b = 20;
// System.out.println("交换前:a=" + a + ",b=" + b);
// int temp = a;
// a = b;
// b = temp;
// System.out.println("交换后:a=" + a + ",b=" + b);
int[] arr = {11, 22, 33, 44, 55};
System.out.println("交换前:arr[0]=" + arr[0] + ",arr[4]=" + arr[4]);
int temp = arr[0];
arr[0] = arr[4];
arr[4] = temp;
System.out.println("交换后:arr[0]=" + arr[0] + ",arr[4]=" + arr[4]);
}
}
数据的交换演示完毕后,下面我们就可以来实现把数组中的元素打乱了:
import java.util.Random;
/*
元素打乱
*/
public class ArrayTest03 {
public static void main(String[] args) {
//定义数组
int[] arr = {12, 45, 98, 73, 60};
// Random r = new Random();
// int index = r.nextInt(arr.length);
//
// //第一次交换
// int temp = arr[0];
// arr[0] = arr[index];
// arr[index] = temp;
//
// //第二次交换
// index = r.nextInt(arr.length);
// temp = arr[1];
// arr[1] = arr[index];
// arr[index] = temp;
Random r = new Random();
for (int i = 0; i < arr.length; i++) {
int index = r.nextInt(arr.length);
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
数组动态初始化
动态初始化的格式:
- 格式:数据类型[] 变量名 = new 数据类型[数组长度];
- 范例:int[] arr = new int[3];
表示我们定义了一个int类型的数组,初始化为3个元素。
知道了如何对数组进行动态初始化之后,下面我们到IDEA中去使
/*
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
格式:数据类型[] 变量名 = new 数据类型[数组长度];
范例:int[] arr = new int[3];
*/
public class ArrayDemo {
public static void main(String[] args) {
//格式:数据类型[] 变量名 = new 数据类型[数组长度];
int[] arr = new int[3];
//输出数组名
System.out.println(arr); //[I@776ec8df
//输出数组中的元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println("------------");
//修改数组中的元素
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
//再次输出数组中的元素
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
演示完毕之后,回到资料我们总结一下数组初始化的两种方式的各自使用场景:
- 静态初始化:开始就存入元素值,适合一开始就能确定元素值的业务场景
- 动态初始化:指定数组长度,后期赋值,适合开始知道数据的数量,但是不确定具体元素值的业务场景
- 注意:两种初始化的方式是独立的,不可以混用
案例4(数组元来自键盘录入)
- 需求:定义一个可以存储5个元素的int数组,数据来自于键盘录入,最后遍历数组,把元素输出在控制台
首先,我们来简单的分析一下:
这个数组可以存储5个int类型的元素,但是数据来自于键盘录入,也就是先指定数组长度,后期赋值。
这很明显适合使用数组的动态初始化,所以,这里我们将采用动态初始化对数组进行初始化。
接着,数据来自于键盘录入,我们得知道这里要使用Scanner来实现。
明确了这两个内容后,下面我们到IDEA中一起去实现一下:
import java.util.Scanner;
/*
需求:定义一个可以存储5个元素的int数组,数据来自于键盘录入,最后遍历数组,把元素输出在控制台
*/
public class ArrayTest {
public static void main(String[] args) {
//定义一个数组,并进行动态初始化
int[] arr = new int[5];
//创建键盘录入对象
Scanner sc = new Scanner(System.in);
// //录入第1个数据
// System.out.println("请输入第1个数据:");
//// int i = sc.nextInt();
//// arr[0] = i;
// arr[0] = sc.nextInt();
//
// //录入第2个数据
// System.out.println("请输入第2个数据:");
// arr[1] = sc.nextInt();
for (int i = 0; i < arr.length; i++) {
System.out.println("请输入第" + (i + 1) + "个元素:");
arr[i] = sc.nextInt();
}
printArray(arr);
//输出内容并换行
// System.out.println("hello");
// System.out.println("world");
//输出内容不换行
// System.out.print("hello");
// System.out.print("world");
}
public static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if(i==arr.length-1) {
System.out.print(arr[i]);
}else {
System.out.print(arr[i] + ", ");
}
}
System.out.println("]");
}
/*
参数:int[] arr
返回值:void
*/
// public static void printArray(int[] arr) {
// for (int i = 0; i < arr.length; i++) {
// System.out.println(arr[i]);
// }
// }
}
数组内存图
编写代码验证一下:
/*
数组内存图代码
*/
public class ArrayTest01 {
public static void main(String[] args) {
int[] arr = new int[3];
//输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
//给数组中的元素赋值
arr[0] = 100;
arr[2] = 200;
//再次输出数组名及元素
System.out.println(arr);
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
}
}
数组使用中的两个小问题
第一个问题:请问下列代码有问题吗?如果有,是什么问题?如何解决?
通过内存图进行讲解:
最终结论是:
- 有问题
- 访问了不存在的索引位置元素
- 修改不存在的索引为正确的索引。范围(0~数组长度-1)
第二个问题:请问下列代码有问题吗?如果有,是什么问题?如何解决?
通过内存图进行讲解:
最终结论是:
- 有问题
- 对象设置为null,不在指向堆内存数据了,还想继续访问堆内存数据
- 对象在使用前,进行不为null的判断
讲解完毕后,到IDEA中再去通过代码验证一下:
/*
数组使用中的两个小问题
1:索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
ArrayIndexOutOfBoundsException
2:空指针异常:对象不再指向堆内存,还想继续访问数据,访问失败
NullPointerException
null:空值,引用数据类型的默认值,表示不指向任何有效对象
*/
public class ArrayTest02 {
public static void main(String[] args) {
int[] arr = new int[3];
//输出元素
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
// System.out.println(arr[3]);
System.out.println(arr[2]);
//把null赋值给arr
arr = null;
//输出元素
//Exception in thread "main" java.lang.NullPointerException: Cannot load from int array because "arr" is null
if(arr != null) {
System.out.println(arr[0]);
}
}
}
二维数组
二维数组:元素为一维数组的数组
二维数组的定义格式:
它有三个格式,用[][]表示二维数组:
- 数据类型[] [] 变量名; int[] [] arr; 推荐
- 数据类型 变量名[] []; int arr[] [];
- 数据类型[] 变量名[]; int[] arr[];
推荐使用第一种格式。
二维数组初始化
二维数组初始化也有两种格式:
- 静态初始化
- 动态初始化
首先来看静态初始化:
- 格式:数据类型[] [] 变量名 = new 数据类型[] []{{元素…},{元素…},{元素…},…};
- 范例:int[] [] arr = new int[] []{{1,2,3},{4,5,6},{7,8,9}};
解读:
- 定义了一个二维数组
- 二维数组中有三个元素(一维数组)
- 每一个一维数组有三个元素(int类型数据)
- 注意:一维数组中元素的个位可以是不同的
- 比如: int[] [] arr = new int[] []{{1,2,3},{4,5},{6,7,8,9}};
同样,针对静态初始化,二维数组也给出了简化格式:
- 简化格式:数据类型[][] 变量名 = {{元素…},{元素…},{元素…},…};
- 范例:int[] [] arr = {{1,2,3},{4,5,6},{7,8,9}};
再来看动态初始化:
- 格式:数据类型[] [] 变量名 = new 数据类型[m] [n];
- 范例:int[] [] arr = new int[2] [3];
解读:
- 定义了一个二维数组
- 二维数组中有2个元素(一维数组)
- 每一个一维数组有3个元素(int类型数据)
他们的各自使用场景和一维数组中讲解的是一样的:
静态初始化:适合一开始就能确定元素值的业务场景
动态初始化:适合开始知道数据的数量,但是不确定具体元素值的业务场景
二维数组元素访问
/*
静态初始化简化格式:数据类型[][] 数组名 = {{元素...},{元素...},{元素...},...};
*/
public class ArrayDemo {
public static void main(String[] args) {
//静态初始化简化格式:数据类型[][] 数组名 = {{元素...},{元素...},{元素...},...};
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
//输出数组名
System.out.println(arr); //[[I@776ec8df
System.out.println(arr[0]); //[I@4eec7777
System.out.println(arr[1]); //[I@3b07d329
//如何获取到数据1,2,3呢?
System.out.println(arr[0][0]);
System.out.println(arr[0][1]);
System.out.println(arr[0][2]);
}
}
总结一下:
- 获取二维数组:数组名
- 获取每一个一维数组:数组名[索引]
- 获取每一个二维数组元素:数组名[索引] [索引]
二维数组内存图
/*
二维数组内存图代码
*/
public class ArrayTest {
public static void main(String[] args) {
//定义二维数组
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
//输出数组中的元素
System.out.println(arr[0][1]);
System.out.println(arr[1][1]);
//修改数组中的元素
arr[0][1] = 10;
arr[1][1] = 20;
//再次输出数组中的元素
System.out.println(arr[0][1]);
System.out.println(arr[1][1]);
}
}
案例5(二维数组常见操作之遍历)
二维数组常见操作:
这里我们讲解两个操作:
- 遍历
- 元素打乱
首先,我们来看二维数组遍历。
这里有一个需求:已知一个二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}}; 请把元素在控制台输出。
看完需求之后,我们到IDEA中一起去实现一下,然后再回来总结:
/*
需求:已知一个二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}}; 请把元素在控制台输出
*/
public class ArrayTest01 {
public static void main(String[] args) {
//定义二维数组,并进行静态初始化
int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
//获取数据1,2,3
// System.out.println(arr[0][0]);
// System.out.println(arr[0][1]);
// System.out.println(arr[0][2]);
// for (int i = 0; i < arr[0].length; i++) {
// System.out.println(arr[0][i]);
// }
//
// //获取数据4,5,6
//// System.out.println(arr[1][0]);
//// System.out.println(arr[1][1]);
//// System.out.println(arr[1][2]);
// for (int i = 0; i < arr[1].length; i++) {
// System.out.println(arr[1][i]);
// }
//
// //获取数据7,8,9
//// System.out.println(arr[2][0]);
//// System.out.println(arr[2][1]);
//// System.out.println(arr[2][2]);
// for (int i = 0; i < arr[2].length; i++) {
// System.out.println(arr[2][i]);
// }
for (int i = 0; i < arr.length; i++) {
//arr[i]
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
}
在实现的过程中,我们在二维数组中使用了循环嵌套:
① 循环嵌套:循环语句中嵌套循环语句
② 通过外层循环可以得到一维数组
③ 在通过内存循环可以得到每一个二维数组元素
案例6(二维数组常见操作之元素打乱)
import java.util.Random;
/*
需求:已知二维数组 arr = {{1,2,3},{4,5,6},{7,8,9}};用程序实现把数组中的元素打乱,并在控制台输出打乱后的数组元素
*/
public class ArrayTest02 {
public static void main(String[] args) {
//定义二维数组,并进行静态初始化
int[][] arr = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
//创建随机数对象
Random r = new Random();
//遍历二维数组,进行元素打乱
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
//arr[i][j]
int x = r.nextInt(arr.length);
int y = r.nextInt(arr[x].length);
//元素交换
int temp = arr[i][j];
arr[i][j] = arr[x][y];
arr[x][y] = temp;
}
}
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
案例7(图片打乱)
import javax.swing.*;
import java.util.Random;
/*
图片打乱
*/
public class ArrayTest04 {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("图片打乱");
jf.setSize(380, 400);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//图片打乱
int[][] datas = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,16}
};
Random r = new Random();
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
int x = r.nextInt(datas.length);
int y = r.nextInt(datas[x].length);
int temp = datas[i][j];
datas[i][j] = datas[x][y];
datas[x][y] = temp;
}
}
for (int i = 0; i < datas.length; i++) {
for (int j = 0; j < datas[i].length; j++) {
JLabel jLabel = new JLabel(new ImageIcon("bcsbj-array2\\images\\"+datas[i][j]+".png"));
jLabel.setBounds(j*90,i*90,90,90);
jf.add(jLabel);
}
}
jf.setVisible(true);
}
}
常用API
API概述
API(Application Programming Interface) :应用程序编程接口。
Java API :指的就是 JDK 中提供的各种功能的 Java类。
文档打开后,找到索引这里,下面有一个输入框,在这个框框里输入我们要学习的API。
这里,我们拿字符串类做一个说明:在这个框框里面我们输入:String,然后一回车,看到一个新的界面
这个界面中,就是关于String相关的知识了。
接着,我们来说一下,在学习一个API的时候,我们重点要看四个地方:
第一个地方:看类所在的包
为什么要看这里呢,因为java.lang包下的类,我们是可以直接使用的,不需要导包。
其他包下的类,我们都是要导包后才能使用的,至于如何导包,下个知识我们会讲解。
很明显,String类在使用的时候,我们是不需要导包的。
第二个地方:看类的描述
也就是看这里,这里一般描述了类是干什么的。
比如说:String类表示字符串。 Java程序中的所有字符串文字(例如"abc" )都实现为此类的实例。
告诉了我们String就是用来表示字符串的类,直接写一个字符串数据:abc就是String类的一个对象。
第三个地方:看类的构造方法
往下滑,这就是String类的构造方法,为什么要看构造方法呢?因为我们在使用一个类的时候,其实使用的是该类的对象,
而创建对象,我们是需要通过构造方法实现的,所以,我们得看看它提供了哪些构造方法。
这里的构造方法提供的比较多,至于用哪个,后面我们用到的时候再讲解,目前知道看哪里就行了
第四个地方:看类的成员方法
这是我们学习一个API的重点,我们之所以学习一个API,重点就是为了使用该API来完成某些功能。
而API的功能,都是通过一个个方法实现的,所以我们重点得看看类的成员方法。往下滑,这就是String提供的成员方法,有很多。
而一个方法,我们重点又看什么呢?回到第一个方法,我们说一下:
先看描述,通过描述,我们就知道了方法是干什么的。
再看方法名和参数,这样我们就知道调用哪个方法,以及参数的类型和个数。
最后,我们看返回值类型,这样我们就知道调用该方法后,最终给我们返回了一个什么类型结果
通过这些步骤,我们就知道了所学习的API该如何使用了,然后就可以到IDEA中去使用API了。
知道了帮助文档的使用步骤后,回到资料我们总结一下帮助文档的使用流程:
① 打开帮助文档
② 找到索引选项,输入要学习的API,然后回车
③ 看类所在包:因为java.lang包下的类在使用的时候不需要导包
④ 看类的描述:这样我们就知道了类是干什么的
⑤ 看类的构造方法:这样我们就可以创建对象了
⑥ 看类的成员方法:这样我们就可以通过这些方法完成某些功能了
包和导包
什么是包呢?
- 包其实就是文件夹
- 作用:对类进行分类管理
包的定义格式:
- 格式:package 包名;
- 注意:包名一般是公司域名反写,并且多级包用.分开
- 举例:www.bcsbj.com
- 范例:package com.bcsbj;
知道了如何定义包之后,下面我们来定义两个包,并且在不同包下定义同名的类。
package com.bcsbj_01;
public class Student {
public void study() {
System.out.println("好好学习天天向上");
}
}
package com.bcsbj_02;
public class StudentTest {
public static void main(String[] args) {
com.bcsbj_01.Student s = new com.bcsbj_01.Student();
s.study();
com.bcsbj_01.Student s2 = new com.bcsbj_01.Student();
s2.study();
}
}
导包的格式:
- 格式:import 包名;
- 范例:import com.bcsbj.Student;
知道了如何导包后,我们再来修改一下不同包下类的使用代码:
package com.bcsbj_02;
import com.bcsbj_01.Student;
//Alt+Enter 快捷键导包
public class StudentTest {
public static void main(String[] args) {
Student s = new Student();
s.study();
Student s2 = new Student();
s2.study();
// com.bcsbj_01.Student s = new com.bcsbj_01.Student();
// s.study();
//
// com.bcsbj_01.Student s2 = new com.bcsbj_01.Student();
// s2.study();
}
}
在这里我们讲解了导包的三种方式:
- 手动导包
- 快捷键导包
- 写一个类,写一部分的时候,如果给出了对应的提示,回车后会自动导包
Scanner
Scanner基本使用
Scanner:
- 一个简单的文本扫描程序,可以获取基本类型数据和字符串数据
构造方法:
- Scanner(InputStream source):创建 Scanner 对象
- System.in:对应的是InputStream类型,可以表示键盘输入
- Scanner sc = new Scanner(System.in);
成员方法:
- int nextInt():获取一个int类型的数据
- int i = sc.nextInt();
知道了Scanner的构造方法和成员方法后,我们到IDEA中去使用一下:
import java.util.Scanner;
/*
Scanner的基本使用
*/
public class ScannerDemo {
public static void main(String[] args) {
//Scanner(InputStream source):创建 Scanner 对象
Scanner sc = new Scanner(System.in);
//int nextInt():获取一个int类型的数据
System.out.println("请输入一个整数:");
int i = sc.nextInt();
//输出获取到的数据
System.out.println("你输入的数据是:" + i);
}
}
案例(数据求和)
需求:键盘录入两个整数,求两个数据和,并在控制台输出求和结果
首先,我们来简单的分析一下:
分析:
① 创建键盘录入数据对象
② 通过键盘录入数据对象调用nextInt()方法获取数据
③ 对获取的两个整数求和
④ 在控制台输出求和结果
分析完毕后,我们到IDEA中去实现一下:
/*
需求:键盘录入两个整数,求两个数据和,并在控制台输出求和结果
分析:
1:创建键盘录入数据对象
2:通过键盘录入数据对象调用nextInt()方法获取数据
3:对获取的两个整数求和
4:在控制台输出求和结果
*/
public class ScannerTest {
public static void main(String[] args) {
//创建键盘录入数据对象
Scanner sc = new Scanner(System.in);
//通过键盘录入数据对象调用nextInt()方法获取数据
System.out.println("请输入第一个整数:");
int firstNumber = sc.nextInt();
System.out.println("请输入第二个整数:");
int secondNumber = sc.nextInt();
//对获取的两个整数求和
int sum = firstNumber + secondNumber;
//在控制台输出求和结果
System.out.println("求和结果是:" + sum);
}
}
Random
Random基本使用
Random:
- 该类的实例用于生成随机数
构造方法:
- Random():创建一个新的随机数生成器
成员方法:
- int nextInt(int bound):获取一个int类型的随机数,参数bound表示获取到的随机数在[0,bound)之间
知道了Random的构造方法和成员方法后,我们到IDEA中去使用一下:
import java.util.Random;
/*
Random的基本使用
*/
public class RandomDemo {
public static void main(String[] args) {
//Random():创建一个新的随机数生成器
Random r = new Random();
//int nextInt(int bound):获取一个int类型的随机数,参数bound表示获取到的随机数在[0,bound)之间
// int i = r.nextInt(10);
// System.out.println(i);
// for (int i=1; i<=10; i++) {
// int j = r.nextInt(10);
// System.out.println(j);
// }
//需求:如何获取1-100之间的随机数呢?
// int number = r.nextInt(100);//0-99
// int number = r.nextInt(101);//0-100
int number = r.nextInt(100) + 1;
System.out.println(number);
}
}
案例(猜数字游戏)
需求:系统自动产生一个1-100之间的整数,使用程序实现猜这个数字是多少?
猜的时候根据不同情况给出相应的提示
如果猜的数字比真实数字大,提示你猜的数据大了
如果猜的数字比真实数字小,提示你猜的数据小了
如果猜的数字与真实数字相等,提示恭喜你猜中了
首先,我们来简单的分析一下:
分析:
① 使用Random获取一个1-100之间的整数
② 使用Scanner实现键盘录入猜的数据值
③ 使用if…else if…else 的格式实现猜数字,并给出对应的提示
分析完毕后,我们到IDEA中去实现一下:
import java.util.Random;
import java.util.Scanner;
/*
需求:系统自动产生一个1-100之间的整数,使用程序实现猜这个数字是多少?
猜的时候根据不同情况给出相应的提示
如果猜的数字比真实数字大,提示你猜的数据大了
如果猜的数字比真实数字小,提示你猜的数据小了
如果猜的数字与真实数字相等,提示恭喜你猜中了
分析:
1:使用Random获取一个1-100之间的整数
2:使用Scanner实现键盘录入猜的数据值
3:使用if…else if…else 的格式实现猜数字,并给出对应的提示
*/
public class RandomTest {
public static void main(String[] args) {
//使用Random获取一个1-100之间的整数
Random r = new Random();
int number = r.nextInt(100) + 1;
System.out.println("系统已经产生了一个1-100之间的整数");
while (true) {
//使用Scanner实现键盘录入猜的数据值
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要猜的数字:");
int guessNumber = sc.nextInt();
//使用if…else if…else 的格式实现猜数字,并给出对应的提示
if (guessNumber > number) {
System.out.println("你猜的数据" + guessNumber + "大了");
} else if (guessNumber < number) {
System.out.println("你猜的数据" + guessNumber + "小了");
} else {
System.out.println("恭喜你猜中了");
break;
}
}
}
}
GUI
- GUI:Graphical User Interface(图形用户接口)
- 用图形的方式,来显示计算机操作的界面
怎么理解呢?我们把后面要做的案例拿来举例说明一下:
看这里:
这是用户登录的案例,在这个界面上,有显示文本的标签,显示输入内容的文本框以及按钮。
再来看一个:
聊天室的案例,在这个界面上,有显示聊天内容的文本域,显示输入内容的文本框以及操作的按钮。
给出这样的界面,我们自己就能够看明白,非常的方便直观,这就是使用GUI相关的API来实现的。
而Java为GUI提供的API都存在java.awt和javax.Swing两个包中,我们分别来看一下这两个包:
- java.awt 包:
- awt是这三个单词首字母的缩写,翻译过来是抽象窗口工具包,只不过这个包的API,需要调用本地系统方法实现功能,和本地系统有关联,不利于代码移植,属重量级控件
- javax.swing 包:
- 它是在awt的基础上,建立的一套图形界面系统,提供了更多的组件,而且完全由Java实现。增强了移植性,属轻量级控件
所以,我们做图形界面开发使用的是swing包下的类。
- 组件是具有图形表示的对象,该图形表示可以显示在屏幕上并且可以与用户交互
比如说,在用户登录中,文本框和按钮等,都是能够表示图形的对象,所以它们都称为组件。
最后,我们来说一下,我们会用到的常用组件,
看这里:
组件:
- 基本组件:具有图形表示的对象
- 容器组件:是可以添加组件的组件。也就是在容器中可以通过add方法添加组件,既可以添加基本组件,也可以添加容器组件。
我们先来看常用的基本组件:
-
JButton,这是按钮
-
JLabel,这是用来显示文本内容的,或者展示图片使用
-
JTextFile,这是文本框,用来输入内容的
-
JTextArea,这是文本域,用来输入多行多列的数据的
接着,我们再来看容器组件:
- 面板也是一个容器,我们常用JPanel,后面用到在具体讲解
- 窗体,下面是Frame,这是awt包下,而我们使用的是JFrame,这是swing包下。
看到这里,我要说一下,由于我们使用的都是swing包下的,所以将来使用的组件,都是以J开头的。
常用组件
1、JFrame(初识窗体)
JFrame:
- 是一个顶层窗口
构造方法:
- JFrame():构造一个最初不可见的新窗体
成员方法:
- void setVisible(boolean b):显示或隐藏此窗体具体取决于参数b的值
- void setSize(int width, int height):调整此组件的大小,使其宽度为width,高度为height,单位是像素
知道了JFrame的构造方法和成员方法后,我们到IDEA中去使用一下:
import javax.swing.*;
/*
构造方法
JFrame():构造一个最初不可见的新窗体
成员方法
void setVisible(boolean b):显示或隐藏此窗体具体取决于参数b的值
void setSize(int width, int height):调整此组件的大小,使其宽度为width,高度为height,单位是像素
*/
public class JFrameDemo01 {
public static void main(String[] args) {
//JFrame():构造一个最初不可见的新窗体
JFrame jf = new JFrame();
//void setSize(int width, int height):调整此组件的大小,使其宽度为width,高度为height,单位是像素
jf.setSize(400,300);
//void setVisible(boolean b):显示或隐藏此窗体具体取决于参数b的值
jf.setVisible(true);
}
}
2、JFrame(常用设置)
再来学习几个JFrame窗体的常用方法:
- void setTitle(String title):设置窗体标题
- void setLocationRelativeTo(Component c):设置位置,值为null,则窗体位于屏幕中央
- void setDefaultCloseOperation(int operation):设置窗体关闭时默认操作
- 整数3表示:窗口关闭时退出应用程序
- void setAlwaysOnTop(boolean alwaysOnTop):设置此窗口是否应始终位于其他窗口之上
了解了这几个方法后,我们到IDEA中去使用一下:
import javax.swing.*;
/*
void setTitle(String title):设置窗体标题
void setLocationRelativeTo(Component c):设置位置,值为null,则窗体位于屏幕中央
void setDefaultCloseOperation(int operation):设置窗体关闭时默认操作(整数3表示:窗口关闭时退出应用程序)
void setAlwaysOnTop(boolean alwaysOnTop):设置此窗口是否应始终位于其他窗口之上
*/
public class JFrameDemo02 {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
//void setTitle(String title):设置窗体标题
jf.setTitle("百度一下,你就知道");
//设置窗体大小
jf.setSize(400, 300);
//void setDefaultCloseOperation(int operation):设置窗体关闭时默认操作(整数3表示:窗口关闭时退出应用程序)
jf.setDefaultCloseOperation(3);
//void setLocationRelativeTo(Component c):设置位置,值为null,则窗体位于屏幕中央
jf.setLocationRelativeTo(null);
//void setAlwaysOnTop(boolean alwaysOnTop):设置此窗口是否应始终位于其他窗口之上
jf.setAlwaysOnTop(true);
//设置窗体可见
jf.setVisible(true);
}
}
3、JButton(窗口中添加按钮)
JButton:
- 按钮的实现
构造方法:
- JButton(String text):创建一个带文本的按钮
成员方法:
- void setSize(int width, int height):设置大小
- void setLocation(int x, int y):设置位置(x坐标,y坐标)
知道了JButton的构造方法和成员方法后,我们到IDEA中去使用一下:
import javax.swing.*;
/*
构造方法
JButton(String text):创建一个带文本的按钮
成员方法
void setSize(int width, int height):设置大小
void setLocation(int x, int y):设置位置(x坐标,y坐标)
*/
public class JButtonDemo {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("窗口中添加按钮");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null); //取消窗体的默认布局
//JButton(String text):创建一个带文本的按钮
JButton btn = new JButton("我是按钮");
// //void setSize(int width, int height):设置大小
// btn.setSize(100,20);
// //void setLocation(int x, int y):设置位置(x坐标,y坐标)
//// btn.setLocation(0,0);
// btn.setLocation(100,100);
btn.setBounds(100,100,100,20);
JButton btn2 = new JButton("我是按钮2");
btn2.setBounds(100,120,100,20);
jf.add(btn);
jf.add(btn2);
//设置窗体可见
jf.setVisible(true);
}
}
总结:
JButton:
- 按钮的实现
构造方法:
- JButton(String text):创建一个带文本的按钮
成员方法:
-
void setSize(int width, int height):设置大小
-
void setLocation(int x, int y):设置位置(x坐标,y坐标)
-
void setBounds(int x, int y, int width, int height):设置位置和大小
和窗体相关操作:
- 取消窗体默认布局:窗体对象.setLayout(null);
- 把按钮添加到窗体:窗体对象.add(按钮对象);
JLabel(显示文本和图像)
JLable:
- 短文本字符串或图像的显示区域
构造方法:
- JLabel(String text):使用指定的文本创建 JLabel实例
- JLabel(Icon image):使用指定的图像创建 JLabel实例
- ImageIcon(String filename):从指定的文件创建ImageIcon
- 文件路径:绝对路径和相对路径
- 绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件
- 例如:D:\IdeaProjects\javase_code\itheima-api-gui\images\mn.png
- 相对路径:必须使用取自其他路径名的信息进行解释
- 例如:itheima-api-gui\images\mn.png
成员方法:
- void setBounds(int x, int y, int width, int height):设置位置和大小
知道了JLabel的构造方法和成员方法后,我们到IDEA中去使用一下:
import javax.swing.*;
/*
构造方法
JLabel(String text):使用指定的文本创建 JLabel实例
JLabel(Icon image):使用指定的图像创建 JLabel实例
ImageIcon(String filename):从指定的文件创建ImageIcon
成员方法
void setBounds(int x, int y, int width, int height):设置位置和大小
*/
public class JLabelDemo {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("显示文本和图像");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//JLabel(String text):使用指定的文本创建 JLabel实例
JLabel jLabel = new JLabel("好好学习");
jLabel.setBounds(0,0,100,20);
//JLabel(Icon image):使用指定的图像创建 JLabel实例
//ImageIcon(String filename):从指定的文件创建ImageIcon
//D:\IdeaProjects\javase_code\bcsbj-api-gui\images\mn.png
// ImageIcon imageIcon = new ImageIcon("D:\\IdeaProjects\\javase_code\\bcsbj-api-gui\\images\\mn.png");
// JLabel jLabel2 = new JLabel(imageIcon);
// JLabel jLabel2 = new JLabel(new ImageIcon("D:\\IdeaProjects\\javase_code\\bcsbj-api-gui\\images\\mn.png"));
JLabel jLabel2 = new JLabel(new ImageIcon("bcsbj-api-gui\\images\\mn.png"));
jLabel2.setBounds(50,50,100,143);
jf.add(jLabel);
jf.add(jLabel2);
//设置窗体可见
jf.setVisible(true);
}
}
案例1(用户登录)
需求:如图所示,做出界面
提示:给出的数据就是按照组件位置和大小给出的
首先,我们来简单的分析一下:
分析:
① 2个JLabel
② 2个JTextField
③ 1个JButton
分析完毕后,我们到IDEA中去实现一下:
import javax.swing.*;
/*
用户登录
*/
public class UserLogin {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("用户登录");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//显示用户名文本
JLabel usernameLable = new JLabel("用户名");
usernameLable.setBounds(50,50,50,20);
jf.add(usernameLable);
//用户名输入框
JTextField usernameField = new JTextField();
usernameField.setBounds(150,50,180,20);
jf.add(usernameField);
//显示密码文本
JLabel passwordLable = new JLabel("密码");
passwordLable.setBounds(50,100,50,20);
jf.add(passwordLable);
//密码输入框
// JTextField passwordField = new JTextField();
// passwordField.setBounds(150,100,180,20);
// jf.add(passwordField);
JPasswordField passwordField = new JPasswordField();
passwordField.setBounds(150,100,180,20);
jf.add(passwordField);
//登录按钮
JButton loginButton = new JButton("登录");
loginButton.setBounds(50,200,280,20);
jf.add(loginButton);
jf.setVisible(true);
}
}
在讲解的过程中,引入了一个新的组件JPasswordField,用来表示密码框。
案例2(聊天室)
需求:如图所示,做出界面
提示:给出的数据就是按照组件位置和大小给出的
首先,我们来简单的分析一下:
分析:
① 1个JTextArea
② 1个JTextField
③ 2个JButton
分析完毕后,我们到IDEA中去实现一下:
import javax.swing.*;
/*
聊天室
*/
public class ChatRoom {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("聊天室");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//显示聊天信息的文本域
JTextArea messageArea = new JTextArea();
messageArea.setBounds(10,10,360,200);
jf.add(messageArea);
//输入聊天信息的文本框
JTextField messageField = new JTextField();
messageField.setBounds(10,230,180,20);
jf.add(messageField);
//发送按钮
JButton sendButton = new JButton("发送");
sendButton.setBounds(200,230,70,20);
jf.add(sendButton);
//清空聊天按钮
JButton clearButton = new JButton("清空聊天");
clearButton.setBounds(280,230,100,20);
jf.add(clearButton);
jf.setVisible(true);
}
}
案例3(猜数字)
需求:如图所示,做出界面
提示:给出的数据就是按照组件位置和大小给出的
首先,我们来简单的分析一下:
分析:
① 1个JLabel
② 1个JTextField
③ 1个JButton
分析完毕后,我们到IDEA中去实现一下:
import javax.swing.*;
/*
猜数字
*/
public class GuessNumber {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("猜数字");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//提示信息
JLabel messageLable = new JLabel("系统产生了一个1-100之间的数据,请猜一猜");
messageLable.setBounds(70,50,350,20);
jf.add(messageLable);
//输入要猜的数字
JTextField numberField = new JTextField();
numberField.setBounds(120,100,150,20);
jf.add(numberField);
//猜数字的按钮
JButton guessButton = new JButton("我猜");
guessButton.setBounds(150,150,100,20);
jf.add(guessButton);
jf.setVisible(true);
}
}
案例4(手机日期和时间显示)
需求:如图所示,做出界面
提示:给出的数据就是按照组件位置和大小给出的
参照图:
我们要实现的图:
首先,我们来简单的分析一下:
分析:
① 4个JLabel
分析完毕后,我们到IDEA中去实现一下:
import javax.swing.*;
/*
手机日期和时间显示
*/
public class ShowDateTime {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("手机日期和时间显示");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//提示日期
JLabel dateLable = new JLabel("日期");
dateLable.setBounds(50,50,100,20);
jf.add(dateLable);
//按照格式显示日期的字符串
JLabel showDateLable = new JLabel("xxxx年xx月xx日");
showDateLable.setBounds(50,80,200,20);
jf.add(showDateLable);
//提示时间
JLabel timeLable = new JLabel("时间");
timeLable.setBounds(50,150,100,20);
jf.add(timeLable);
//按照格式显示时间的字符串
JLabel showTimeLable = new JLabel("xx:xx");
showTimeLable.setBounds(50,180,200,20);
jf.add(showTimeLable);
jf.setVisible(true);
}
}
案例5(考勤查询)
需求:如图所示,做出界面
提示:给出的数据就是按照组件位置和大小给出的
首先,我们来简单的分析一下:
分析:
① 3个JLabel
② 2个JTextField
③ 1个JButton
分析完毕后,我们到IDEA中去实现一下:
import javax.swing.*;
/*
考勤查询
*/
public class AttendanceQuery01 {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("考勤查询");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//显示考勤日期的文本
JLabel dateLable = new JLabel("考勤日期");
dateLable.setBounds(50,20,100,20);
jf.add(dateLable);
//显示开始时间文本
JLabel startDateLable = new JLabel("开始时间");
startDateLable.setBounds(50,70,100,20);
jf.add(startDateLable);
//开始时间输入框
JTextField startDateField = new JTextField();
startDateField.setBounds(50,100,100,20);
jf.add(startDateField);
//显示结束时间文本
JLabel endDateLable = new JLabel("结束时间");
endDateLable.setBounds(250,70,100,20);
jf.add(endDateLable);
//结束时间输入框
JTextField endDateField = new JTextField();
endDateField.setBounds(250,100,100,20);
jf.add(endDateField);
//确定按钮
JButton confirmButton = new JButton("确定");
confirmButton.setBounds(250,180,60,20);
jf.add(confirmButton);
jf.setVisible(true);
}
}
案例5(考勤查询之日历控件)
需求:用日历控件改进考勤查询的日期字符串填写
来,继续啊,下面我们来学习考勤查询之日历控件
首先,我们看一下需求:用日历控件改进考勤查询的日期字符串填写
什么意思呢?我们刚在做的考勤查询系统,是需要手动输入日期字符串的,而在实际开发中,我们一般会选择使用日历控件来实现,
也就是下面这个样子的,我们点击一下,就会出现日历控件,我们选择日期就可以了。
这个相信大家有见过。
知道了要做什么之后,下面我们来说一下,怎么做。
我们可以自己写这个日历控件,也可以使用别人写好的日历控件。鉴于目前所学知识有限,我们先使用别人提供的日历控件。
这里呢,我准备好了一个日历控件类(DateChooser.java),我们到IDEA中一起去看一下如何使用:
public static void main(String[] args) {
//创建窗体
JFrame jf = new JFrame();
//设置窗体大小
jf.setSize(400, 300);
//设置窗体标题
jf.setTitle("日历控件");
//设置位置,值为null,则窗体位于屏幕中央
jf.setLocationRelativeTo(null);
//设置窗体关闭时默认操作,窗口关闭时退出应用程序
jf.setDefaultCloseOperation(3);
//设置此窗口是否应始终位于其他窗口之上
jf.setAlwaysOnTop(true);
//取消窗体默认布局:窗体对象.setLayout(null);
jf.setLayout(null);
//创建日期选择器对象,指定日期字符串格式
DateChooser dateChooser = DateChooser.getInstance("yyyy-MM-dd");
JTextField showDateField = new JTextField("单击选择日期");
showDateField.setBounds(50, 50, 100, 20);
//把日历控件和文本框进行绑定
dateChooser.register(showDateField);
jf.add(showDateField);
jf.setVisible(true);
}
了解了如何使用日历控件后,我们把开始写的代码改进一下:
import javax.swing.*;
/*
考勤查询
*/
public class AttendanceQuery02 {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("考勤查询");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//显示考勤日期的文本
JLabel dateLable = new JLabel("考勤日期");
dateLable.setBounds(50,20,100,20);
jf.add(dateLable);
//显示开始时间文本
JLabel startDateLable = new JLabel("开始时间");
startDateLable.setBounds(50,70,100,20);
jf.add(startDateLable);
DateChooser dateChooser1 = DateChooser.getInstance("yyyy/MM/dd");
DateChooser dateChooser2 = DateChooser.getInstance("yyyy/MM/dd");
//开始时间输入框
JTextField startDateField = new JTextField();
startDateField.setBounds(50,100,100,20);
dateChooser1.register(startDateField);
jf.add(startDateField);
//显示结束时间文本
JLabel endDateLable = new JLabel("结束时间");
endDateLable.setBounds(250,70,100,20);
jf.add(endDateLable);
//结束时间输入框
JTextField endDateField = new JTextField();
endDateField.setBounds(250,100,100,20);
dateChooser2.register(endDateField);
jf.add(endDateField);
//确定按钮
JButton confirmButton = new JButton("确定");
confirmButton.setBounds(250,180,60,20);
jf.add(confirmButton);
jf.setVisible(true);
}
}
事件监听机制
事件监听机制的组成:
- 事件源:事件发生的地方。可以是按钮,窗体,图片等
- 事件:发生了什么事情。例如:鼠标点击事件,键盘按下事件等
- 事件绑定:把事件绑定到事件源上,当发生了某个事件,则触发对应的处理逻辑
- 事件源对象. addXXXListener(事件);
GUI中的事件比较多,这里呢,我们先告诉一下大家如何给按钮添加事件,能够把我们前面的案例给实现就可以了。至于其他事件,后面我们用到的时候再去学习。
了解了如何给按钮添加事件后,我们到IDEA中去体验一下:
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/*
事件监听机制
*/
public class ActionListenerDemo {
public static void main(String[] args) {
//创建窗体对象
JFrame jf = new JFrame();
jf.setTitle("事件监听机制");
jf.setSize(400, 300);
jf.setDefaultCloseOperation(3);
jf.setLocationRelativeTo(null);
jf.setAlwaysOnTop(true);
jf.setLayout(null);
//创建按钮
JButton jButton = new JButton("你点我啊");
jButton.setBounds(0, 0, 100, 100);
jf.add(jButton);
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("你点我啊");
}
});
jf.setVisible(true);
}
}