赞
踩
尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)
开发环境:jdk17 + idea2022
金山打字通
DOS(Disk Operating System,磁盘操作系统)是Microsoft公司在Windows之前推出的一个操作系统,是单用户、单任务(即只能执行一个任务)的操作系统。现在被Windows系统取代。
进入DOS操作窗口:
按下Windows+R键盘,打开运行窗口,输入cmd回车,进入到DOS的操作窗口。
常用指令:
操作1:进入和回退
操作 说明 盘符名称: 盘符切换。E:回车,表示切换到E盘。 dir 列出当前目录下的文件以及文件夹 cd 目录 进入指定单级目录。 cd 目录1\目录2\... 进入指定多级目录。cd atguigu\JavaSE cd .. 回退到上一级目录。 cd \ 或 cd / 回退到盘符目录。 操作2:增、删 操作 说明 md 文件目录名 创建指定的文件目录。 rd 文件目录名 删除指定的文件目录(如文件目录内有数据,删除失败) 操作3:其它 操作 说明 cls 清屏。 exit 退出命令提示符窗口。 ← → 移动光标 ↑ ↓ 调阅历史操作命令 Delete和Backspace 删除字符
就是人与计算机交流的方式。人们可以使用编程语言对计算机下达命令,让计算机完成人们需要的功能。
计算机语言有很多种。如:C 、C++、Java、Go、JavaScript、Python,Scala等。
高级语言独立于机器,有一定的通用性;计算机不能直接识别和执行用高级语言编写的程序,需要使用编译器或者解释器,转换为机器语言才能被识别和执行
高级语言按照程序设计方法的不同,又分为:面向过程的语言、面向对象的语言。
TIOBE (https://www.tiobe.com/tiobe-index/)流行编程语言排行,每月更新
网传的编程语言鄙视链:
path 路径从上往下识别
Java程序开发三步骤:编写、编译、运行。
HelloWorld
cmd 复制路径 右击粘贴
新建文件,后缀为 .java
内容
编码格式 – ANSI
// 类 类名{}
class HelloChina{
}
cmd
C:\Users\stu>e:
E:\>cd E:\z_teach\javacode\chapter01
E:\z_teach\javacode\chapter01>javac HelloWorld.java
结果
cmd
E:\z_teach\javacode\chapter01>java HelloChina
错误: 在类 HelloChina 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application
内容
class HelloChina{
public static void main(String[] args){
}
}
重新运行
E:\z_teach\javacode\chapter01>javac HelloWorld.java
E:\z_teach\javacode\chapter01>java HelloChina
E:\z_teach\javacode\chapter01>
内容
class HelloChina{
public static void main(String[] args){
System.out.println("hello,world!!");
System.out.println("你好,中国!!");
}
}
重新运行
E:\z_teach\javacode\chapter01>javac HelloWorld.java
E:\z_teach\javacode\chapter01>java HelloChina
hello,world!!
你好,中国!!
内容
class HelloChina{
public static void main(String[] args){
System.out.println("hello,world!!");
System.out.println("你好,中国!!");
}
}
class Lin{
}
class Yu{
}
重新运行
E:\z_teach\javacode\chapter01>javac HelloWorld.java
结果
内容
/* 这是多行注释,可以声明多行注释的信息 1、Java中的注释的种类: 单行注释、多行注释、文档注释(Java特有) 2、单行注释、多行注释的作用: ①对程序中的代码进行解释说明 ②对程序进行调试 3、注意: ① 单行注释和多行注释声明的信息不参与编译。换句话说,编译后声明的字节码文件中不包含单行注释和多行注释的信息 ② 多行注释不能嵌套使用 4、文档注释 文档注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。 */ /** 这是我的第一个java程序 @author davina @version 1.0 */ public class CommentTest{ /** 这是main方法,格式是固定的 */ /** 这是main方法,格式是固定的(多行注释) */ public static void main(String[] args){ //这是输出语句 System.out.println("hello,world"); } }
运行
E:\z_teach\javacode\chapter01>javadoc -d mydoc -author -version CommentTest.java
结果
•下载API文档:
跨平台性
面向对象性:
面向对象编程支持封装、继承、多态等特性,让程序更好达到高内聚,低耦合的标准。
健壮性
吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
JVM(Java Virtual Machine ,Java虚拟机):是一个虚拟的计算机,是Java程序的运行环境。JVM具有指令集并使用不同的存储区域,负责执行指令,管理数据、内存、寄存器。
我们编写的Java代码,都运行在JVM 之上。正是因为有了JVM,才使得Java程序具备了跨平台性。
使用JVM前后对比:
•Java程序在运行过程中,涉及到运算的数据的分配、存储等都由JVM来完成
•Java消除了程序员回收无用内存空间的职责。提供了一种系统级线程跟踪存储空间的分配情况,在内存空间达到相应阈值时,检查并释放可被释放的存储器空间。
•GC的自动回收,提高了内存空间的利用效率,也提高了编程人员的效率,很大程度上减少了因为没有释放空间而导致的内存泄漏。
内容
class PersonalInfo{
public static void main(String[] args){
System.out.println("姓名:康师傅");
System.out.println(); //换行
System.out.println("性别:男");
System.out.println("家庭住址:北京程序员聚集地:回龙观");
}
}
结果
E:\z_teach\javacode\chapter01>javac PersonalInfo.java
E:\z_teach\javacode\chapter01>java PersonalInfo
姓名:康师傅
性别:男
家庭住址:北京程序员聚集地:回龙观
E:\z_teach\javacode\chapter01>
结合\n(换行),\t(制表符),空格等在控制台打印出如下图所示的效果。
方式一:
//方式一:
class Exercise2{ public static void main(String[] args){ System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("*"); System.out.print("\t"); //System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("I love java"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("*"); System.out.print("\t"); System.out.println("*"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print("\t"); System.out.print(" "); System.out.print("*"); } }
方式二:
class Exercise3{ public static void main(String[] args){ System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n"); System.out.print("*"+"\t\t"+"*"+"\t\t\t\t"+"I love Java"+"\t\t\t\t"+"*"+"\t\t\t"+"*"+"\n"); System.out.print("\t"+"*"+"\t\t\t\t\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n"); System.out.print("\t\t"+"*"+"\t\t\t\t\t\t\t\t\t\t"+"*"+"\t\t"+"\n"); System.out.print("\t\t\t"+"*"+"\t\t\t\t\t\t\t\t"+"*"+"\t"+"\n"); System.out.print("\t\t\t\t"+"*"+"\t\t\t\t\t\t"+"*"+""+"\t"+"\n"); System.out.print("\t\t\t\t\t"+"*"+"\t\t\t\t"+"*"+""+"\t\t"+"\n"); System.out.print("\t\t\t\t\t\t"+"*"+"\t\t"+"*"+""+"\t\t"+"\n"); System.out.print("\t\t\t\t\t\t\t"+"*"+"\n"); } }
神书:《Java核心技术》、《effective java》、《java编程思想》
没有最好的语言,只有在特地场景下相对来说,最适合的语言
1、一个“.java”源文件中是否可以包括多个类?有什么限制(明*数据)
一个源文件中可以声明多个类,最多只有一个类使用public 进行声明。
但是一个源文件只能有一个public的类
2、java的优势()
3、常用的几个命令行操作都有哪些(至少4个)
4、java中是否存在内存溢出、内存泄漏?如何解决?举例说明(拼)**
存在
不能
5. 如何看待Java是一门半编译半解释型的语言
特点:全部关键字都是小写字母。
关键字比较多,不需要死记硬背,学到哪里记到哪里即可。
说明:
1.关键字一共50个,其中const和goto是保留字(reserved word)。
2.true,false,null不是关键字,是字面量,表示特殊的布尔值和空值,可以当做关键字来看待
保留字 :const、goto
包名:多单词组成时所有字母都小写:xxxyyyzzz。
例如:java.lang、com.atguigu.bean
类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
例如:HelloWorld,String,System等
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
例如:age,name,bookName,main,binarySearch,getName
常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
例如:MAX_VALUE,PI,DEFAULT_CAPACITY
注意:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。
class IdentifierTest{
public static void main(String[] args){
int abc = 12;
int age = 16; //age:标识符
char gender = '男';
}
public static void main1(String[] args){
}
}
变量是程序中不可或缺的组成单位,最基本的存储单元。
变量的概念:
class VariableTest{ public static void main(String[] args){ //定义变量的方式1 char gender; //过程1:变量的声明 gender = '男'; //过程2:变量的赋值(或初始化) gender = '女'; //定义变量的方式2:声明与初始化合并 int age = 10; System.out.println("Hello World!"); System.out.println(age); System.out.println("age = " + age); } }
Java中变量的数据类型分为两大类:
/* 测试整型和浮点型变量的使用 */ class VariableTest1{ public static void main(String[] args){ //1、测试整型变量的使用 // byte(1字节 = 8bit) \ short(2字节 ) \ int(4字节) \ long(8字节) byte b1 = 12; byte b2 = 127; // byte b3 = 128; //编译不通过,因为超出了byte的存储范围 short s1 = 1234; int i1 = 123234123; //①声明long类型变量时,需要提供后缀,后缀为‘l’或'L' long l1 = 123123123L; //②开发中,定义整型变量时,无特殊情况,通常声明为int类型 //2、测试浮点型变量的使用 // float \ double double d1 = 12.3; //①声明float类型变量时,需要提供后缀,后缀为‘f’或'F' float f1 = 12.3f; System.out.println("f1 = " + f1); //②开发中,定义浮点型变量时,无特殊情况,通常声明为double类型,因为精度更高 //③ float 类型表数范围大于long类型的,但是精度不高 //测试浮点型变量的精度, //浮点型变量的精度不高,需要精确数字计算或保留指定位数的精度,需要使用BigDecimal类。 //测试1: System.out.println(0.1 + 0.2); //测试2: float ff1 = 123123123f; float ff2 = ff1 + 1; System.out.println(ff1); System.out.println(ff2); System.out.println(ff1 == ff2); } }
java 计算金额时,使用 BigDecimal类替换,可以实现任意精度的数据的运算
案例1:定义圆周率并赋值为3.14,现有3个圆的半径分别为1.2、2.5、6,求它们的面积。
class FloatDoubleExer{ public static void main(String[] args){ //定义圆周率变量 double pi = 3.14; //定义三个圆的半径 double radius1 = 1.2; double radius2 = 2.5; double radius3 = 6; //计算面积 double area1 = pi * radius1 * radius1; double area2 = pi * radius2 * radius2; double area3 = pi * radius3 * radius3; //输出 System.out.println("圆1的半径为: " + radius1 + ",面积为:" + area1); System.out.println("圆2的半径为: " + radius2 + ",面积为:" + area2); System.out.println("圆3的半径为: " + radius3 + ",面积为:" + area3); } }
**案例2:**小明要到美国旅游,可是那里的温度是以华氏度为单位记录的。 它需要一个程序将华氏温度(80度)转换为摄氏度,并以华氏度和摄氏度为单位分别显示该温度。
// ℃ = (℉ - 32) / 1.8
public class Exercise2 {
public static void main(String[] args) {
double hua = 80;
double she = (hua-32)/1.8;
System.out.println("华氏度" + hua+"℉转为摄氏度是" +she+"℃");
}
}
char使用的是Unicode字符集,包含了世界范围的所有字符
class CharTest{ public static void main(String[] args){ //形式1:使用单引号(' ')括起来的单个字符。 char c1 = 'a'; char c2 = '中'; char c3 = '1'; char c4 = '%'; char c5 = 'Y'; //编译不通过 //char c6 = ''; //char c7 = 'ab'; //形式2:直接使用 Unicode值来表示字符型常量 char c8 = '\u0036'; System.out.println(c8); //形式3:使用转义字符‘\’ char c9 = '\n'; // '\n'表示换行符 char c10 = '\t'; System.out.println("hello" + c9 + "world"); //形式4:使用具体字符对应的数值(比如ASCII码) char c11 = 97; System.out.println(c11); // a char c12 = '1'; char c13 = 1; //两者不相等 } }
boolean类型数据只有两个值:true、false
boolean 类型用来判断逻辑条件,一般用于流程控制语句中:
class BooleanTest{ public static void main(String[] args){ // 布尔类型:boolean boolean bo1 = true; boolean bo2 = false; //boolean 类型用来判断逻辑条件,一般用于流程控制语句中: boolean isMarried = true; if(isMarried){ System.out.println("很遗憾,不能参加单身派对了"); }else{ System.out.println("可以多谈几个男朋友或女朋友"); } //不谈boolean类型占用空间的大小,都是,真正在内存中分配的话,使用的是4个字节 } }
1、在Java程序中,不同的基本数据类型(只有7种,不包含boolean类型)变量的值经常需要进行相互转换。
2、转换的方式有两种:
自动类型提升
强制类型转换
规则:将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型
/* 取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型 。 特别的: byte,short,char数据类型的变量进行算术运算时,结果按照int类型处理。 */ class VariableTest3{ public static void main(String[] args){ int i1 = 10; int i2 = 11; long l1 = i1; float f1 = l1; byte b1 = 12; int i3 = b1 + i1; //编译不通过 //byte b2 = b1 + i1; //特殊情况1:byte,short之间运算 byte b3 = 12; short s1 = 10; //编译不通过 //short s2 = b3 + s1; i3 = b3 + s1; byte b4 = 10; int i4 = b3 + b4; //特殊情况2:char char c1 = 'a'; //编译不通过 //char c2 = c1 + b3; int i5 = c1 + b3; //************************************** //练习1 long l2 = 123L; long l3 = 123; //理解为:自动类型提升 //long l4 = 123123123123; //123123123123理解为int类型,因为超出了int范围,所以报错 long l5 = 123123123123L; //此时的123123123123L就是使用8个字节存储的long类型的值 //练习2 float f2 = 12.3F; //float f3 = 12.3; //不满足自动类型提升的规则(double --> float ),所以报错 //练习3 //规定1:整型常量,规定是int类型 byte b5 = 10; //byte b6 = b5 + 1; int i11 = b5 + 1; //规定2:浮点型常量,规定是double类型 double d2 = b5 + 12.3; //练习4:为什么不允许变量名是数字开头。为了"自洽" /* int 123L = 12; long l6 = 123L; */ } }
规则:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型。
转换格式:
数据类型1 变量名 = (数据类型1)被强转数据值; //()中的数据类型必须<=变量值的数据类型
当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度或溢出。
class VariableTest4{ public static void main(String[] args){ double d1 = 12; //自动类型提升 //编译不通过 //int i1 = d1; int i2 = (int)d1; System.out.println(i2); long l1 = 123; //编译不通过 //short s1 = l1; short s2 = (short)l1; System.out.println(s2); //练习 int i3 = 12; float f1 = i3; //自动类型提升 System.out.println(f1); // 12.0 float f2 = (float)i3; //编译可以通过,省略()而已 //精度损失的例子1 double d2 = 12.9; int i4 = (int)d2; System.out.println(i4); //精度损失的例子2 int i5 = 128; byte b1 = (byte)i5; System.out.println(b1); //-128 //实际开发举例 byte b2 = 12; method(b2); long l2 = 12L; //编译不通过 //method(l2); method((int)l2); } public static void method(int num){ //int num = b2; 自动类型提升 System.out.println("num = " + num); } }
String不是基本数据类型,属于引用数据类型
使用一对""来表示一个字符串,内部可以包含0个、1个或多个字符。
声明方式与基本数据类型类似。例如:String str = “尚硅谷”;
class StringTest{
public static void main(String[] args){
String str1 = "Hello World!";
System.out.println("str1");
System.out.println(str1);
String str2 = "";
String str3 = "a";
}
}
/* 测试强制类型转换 */ class StringTest{ public static void main(String[] args){ String str1 = "Hello World!"; System.out.println("str1"); System.out.println(str1); String str2 = ""; String str3 = "a"; //测试连接运算 int num1 = 10; boolean b1 = true; String str4 = "hello"; System.out.println(str4 + b1); //hellotrue String str5 = str4 + b1; String str6 = str4 + b1 + num1; System.out.println(str6); //hellotrue10 //如何将String 类型转换为基本数据类型 String str7 = "abc"; //不能考虑转换为基本数据类型 int num2 = 10; String str8 = num2 + ""; "10" //编译不通过 //int num3 = (int)str8; //使用Integer类 int num3 = Integer.parseInt(str8); System.out.println(str8); } }
案例:公安局身份登记
要求填写自己的姓名、年龄、性别、体重、婚姻状况(已婚用true表示,单身用false表示)、联系方式等等。
class StringExer{
public static void main(String[] args){
String name = "莉莉";
int age = 18;
char gender = '女';
double weight = 99.1;
boolean isMarried = false;
String phoneNumber = "1234567890";
System.out.println("姓名: " + name + ",年龄:" + age + ",性别: " + gender + ",体重: " + weight + ",婚姻状况:" + isMarried + ",联系方式: " + phoneNumber);
}
}
++ 或 – 不会改变数据类型
class AriTest { public static void main(String[] args){ //------------------------------------------------------------------------------- // 除法:/ int m1 = 12; int n1 = 5; int k1 = m1 / n1; System.out.println(k1); //2 System.out.println(m1 / n1 * n1); //10 //取模(或取余) : % int i1 = 12; int j1 = 5; System.out.println(i1 % j1); //2 //开发中,经常用来判断某个数num1能整除另外一个数num2。 num1 % num2 == 0 //比如判断num1是否是偶数: num1 % num2 == 0 //取模后,结果与被模数符号相同 int i2 = -12; int j2 = 5; System.out.println(i2 % j2); //-2 int i3 = 12; int j3 = -5; System.out.println(i3 % j3); //2 int i4 = -12; int j4 = -5; System.out.println(i4 % j4); //-2 //------------------------------------------------------------------------------- //(前)++:先自增1,再运算 //(后)++:先运算,再自增1 int a1 = 10; int b1 = ++a1; System.out.println("a1 = " + a1 + ", b1 = " + b1); // a1 = 11,b1 = 11 int a2 = 10; int b2 = a2++; System.out.println("a2 = " + a2 + ", b2 = " + b2); // a2 = 11,b2 = 10 //练习1 int i = 10; // i++; ++i; System.out.println("i = " + i); // 11 //练习2 short s1 = 10; //方式1 /* //编译不通过 //s1 = s1 + 1; s1 = (short)(s1 + 1); System.out.println(s1); */ //方式2 s1++; System.out.println(s1); //------------------------------------------------------------------------------- //(前)--:先自减1,再运算 //(后)--:先运算,再自减1 //+:连接符,只适用于String与其他类型的变量间的运算,而且运算结果也是String类型 } }
案例1:
随意给出一个整数,打印显示它的个位数,十位数,百位数的值。
格式如下:
数字xxx的情况如下:
个位数:
十位数:
百位数:
例如:
数字153的情况如下:
个位数:3
十位数:5
百位数:1
class AriExer {
public static void main(String[] args){
int num = 153;
int ge = num % 10; // 个位
int shi = num / 10 % 10; //十位
int bai = num / 100; //百位
System.out.println("个位是: " + ge);
System.out.println("十位是: " + shi);
System.out.println("百位是: " + bai);
}
}
案例2:
为抵抗洪水,战士连续作战89小时,编程计算共多少天零多少小时?
class AriExer1 {
public static void main(String[] args){
int num = 89;
int day = num / 24;
int hour = num % 24;
System.out.println("共奋战: " + day + "天零" + hour + "小时");
}
}
额外案例1
System.out.println("5 + 5= " + 5 + 5); // 5 + 5= 55
System.out.println("5 + 5= " + (5 + 5)); // 5 + 5= 10
** 额外案例2**
byte bb1 = 127;
bb1++;
System.out.println("bb1 = " + bb1);//-128
** 额外案例3**
int i = 1;
int j = i++ + ++i * i++;
System.out.println("j = " + j); //10
** 额外案例4**
int i = 2;
int j = i++;
System.out.println(j); //2
int k = 2;
int z = ++k;
System.out.println(z); //3
int m = 2;
m = m++;
System.out.println(m); //2
= 、+=、 -=、*=、 /=、%=
/* 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。 */ class SetValueTest { public static void main(String[] args){ int i = 5; long l = 10; // 自动类型提升 byte b = (byte)i; //强制类型转换 //操作方式1 int a1 = 10; int b1 = 10; //操作方式2:连续赋值 int a2; int b2; //或合并:int a2,b2; a2 = b2 = 10; System.out.println(a2 + "," + b2); //操作方式3: //int a1 = 20; //int b1 = 20; int a2 = b2 = 20; System.out.println(a3 + "," + b3); //------------------------------------------------------------------------------- // += 的使用 int m1 = 10; m1 += 5; // 类似于 m1 = m1 + 5; System.out.println(m1); byte by1 = 10; by1 += 5; //by1 = by1 + 5; 会编译报错,改为 by1 = (byte)(by1 + 5); System.out.println(by1); int m2 = 1; m2 *= 0.1; //m2 = (int)(m2 * 0.1) System.out.println(m2); //练习1:如何实现一个变量的值增加2 //方式1 int n1 = 10; n1 = n1 + 2; //方式2(推荐) int n2 = 10; n2 += 2; //练习2:如何实现一个变量的值增加1 //方式1 int i1 = 10; i1 = i1 + 1; //方式2 int i2 = 10; i2 += 1; //方式3:(推荐) int i3 = 10; i3++; // ++i3; } }
•比较运算符的结果都是boolean型,也就是要么是true,要么是false。
•> < >= <= :只适用于基本数据类型(除boolean类型之外)
== != :适用于基本数据类型和引用数据类型
•比较运算符“==”不能误写成“=”
class CompareTest { public static void main(String[] args) { int i1 = 10; int i2 = 20; System.out.println(i1 == i2);//false System.out.println(i1 != i2);//true System.out.println(i1 >= i2);//false int m = 10; int n = 20; System.out.println(m == n);//false System.out.println(m = n);//20 boolean b1 = false; boolean b2 = true; System.out.println(b1 == b2);//false System.out.println(b1 = b2);//true } }
逻辑运算符,操作的都是boolean类型的变量或常量,而且运算得结果也是boolean类型的值
public class LogicTest { public static void main(String[] args) { /* 区分:& 和 && –相同点:两个符号表达的都是且的关系,如果符号左边是true,则二者都执行符号右边的操作 –不同点:& : 如果符号左边是false,则继续执行符号右边的操作 && :如果符号左边是false,则不再继续执行符号右边的操作 –建议:开发中,推荐使用 && */ boolean b1 = true; b1 = false; int num1 = 10; if(b1 & (num1++ >0)){ System.out.println("床前明月光"); }else{ System.out.println("我叫郭德纲"); } System.out.println("num1 = " + num1); boolean b2 = true; b2 = false; int num2 = 10; if(b2 && (num2++ >0)){ System.out.println("床前明月光"); }else{ System.out.println("我叫郭德纲"); } System.out.println("num2 = " + num2); } }
区分“|”和“||”:
— 相同点:如果符号左边是false,则二者都执行符号右边的操作
— 不同点:| : 如果符号左边是true,则继续执行符号右边的操作
|| :如果符号左边是true,则不再继续执行符号右边的操作
建议:开发中,推荐使用 ||
/* 1. 定义类 LogicExer 2. 定义 main方法 3. 定义一个int类型变量a,变量b,都赋值为20 4. 定义boolean类型变量bo1 , 判断++a 是否被3整除,并且a++ 是否被7整除,将结果赋值给bo1 5. 输出a的值,bo1的值 6. 定义boolean类型变量bo2 , 判断b++ 是否被3整除,并且++b 是否被7整除,将结果赋值给bo2 7. 输出b的值,bo2的值 */ public class LogicExer { public static void main(String[] args) { int a,b; a = b = 20; boolean bo1 = (++a % 3 == 0) && (a++ % 7 == 0); System.out.println("a = " + a + ",bo1 = " + bo1); boolean bo2 = (b++ % 3 == 0) && (++b % 7 == 0); System.out.println("b = " + b + ",bo2 = " + bo2); } }
/* 位运算符 1、 << >> >>> & \ ^ ~ 2、说明 ①<< >> >>> & \ ^ ~ 针对数值类型的变量或常量进行运算,运算结果也是数值 ②<< 每向左移动一位,相当于原数据*2。(正数、负数都适用) >> 每向右移动一位,相当于原数据/2。 【注意】如果不能整除,向下取整。 >>> 往右移动后,左边空出来的位直接补0。(正数、负数都适用) & 对应位都是1才为1,否则为0。 */ class BitTest{ public static void main(String[] args) { int num1 = 7; System.out.println("num1 << 1 : " + (num1 << 1)); //num1 << 1 : 14 System.out.println("num1 << 2 : " + (num1 << 2)); // num1 << 2 : 28 System.out.println("num1 << 3 : " + (num1 << 3)); // num1 << 3 : 56 System.out.println("num1 << 28 : " + (num1 << 28)); //num1 << 28 : 1879048192 System.out.println("num1 << 29 : " + (num1 << 29)); //num1 << 29 : -536870912 过犹不及 int num2 = -7; System.out.println("num2 << 1 : " + (num2 << 1)); //num2 << 1 : -14 System.out.println("num2 << 2 : " + (num2 << 2)); // num2 << 2 : -28 System.out.println("num2 << 3 : " + (num2 << 3)); // num2 << 3 : -56 //面试题:高效计算 2 * 8 // 2 << 3 或 8 << 1 //69>>4 类似于 69/2的4次 = 69/16 =4 System.out.println(69 >> 4); //4 System.out.println(62 >>> 3); //7 System.out.println(5 & 3); } }
//如何交换两个int型变量的值?String呢? class BitExer { public static void main(String[] args) { int m = 10; int n = 5; System.out.println("m = " + m + ", n = " + n); //(推荐)实现方式1:优点:容易理解,适用于不同数据类型 缺点:需要额外定义变量 //int temp = m; //m = n; //n = temp; //实现方式2:优点:没有额外定义变量 缺点:可能超出int的范围;只能适用于数值类型 //m = m + n; //15 = 10 + 5 //n = m - n;//10 = 15 - 5 //m = m - n;//5 = 15 - 10 //实现方式3:优点:没有额外定义变量 缺点:不易理解;只能适用于数值类型 m = m ^ n; n = m ^ n; //(m ^ n) ^ n m = m ^ n; System.out.println("m = " + m + ", n = " + n); } }
条件运算符格式:
(条件表达式)? 表达式1:表达式2
说明:条件表达式是boolean类型的结果,根据boolean的值选择表达式1或表达式2
要求表达式1和表达式2为同种或兼容的类型
class ConditionTest{ public static void main(String[] args) { String info = (2 > 10)? "表达式1" : "表达式2"; System.out.println(info); double result = (2 > 1)? 1 : 2.0; System.out.println(result); //练习1:获取两个数中的较大值 int m = 10; int n = 20; int max = (m > n)? m : n; System.out.println("较大值为:" + max); //练习2:获取三个数中的较大值 int i = 20; int j = 30; int k = 50; int temp = (i > j)? i : j; int finalMax = (temp > k)? temp : k; System.out.println("较大值为:" + finalMax); int finalMax1 = (((i > j)? i : j) > k)? ((i > j)? i : j) : k; System.out.println("较大值为:" + finalMax1); } }
/*
练习:今天是周2,10天以后是周几?
*/
class ConditionExer{
public static void main(String[] args) {
int week = 2;
week += 10;
week %= 7;
System.out.println("今天是周2,10天以后是周" + ((week == 0)? "日" : week) );
}
}
凡是可以使用条件运算符的地方,都可以改写为if-else结构。反之,不成立
开发中,如果既可以使用条件运算符,又可以使用if-else,推荐使用条件运算符。因为执行效率稍高
运算符有不同的优先级,所谓优先级就是在表达式运算中的运算符顺序。
上一行中的运算符总是优先于下一行的。
优先级 | 运算符说明 | Java运算符 |
---|---|---|
1 | 括号 | ()、[]、{} |
2 | 正负号 | +、- |
3 | 单元运算符 | ++、–、~、! |
4 | 乘法、除法、求余 | *、/、% |
5 | 加法、减法 | +、- |
6 | 移位运算符 | <<、>>、>>> |
7 | 关系运算符 | <、<=、>=、>、instanceof |
8 | 等价运算符 | ==、!= |
9 | 按位与 | & |
10 | 按位异或 | ^ |
11 | 按位或 | ” |
12 | 条件与 | && |
13 | 条件或 | ” |
14 | 三元运算符 | ? : |
15 | 赋值运算符 | =、+=、-=、*=、/=、%= |
16 | 位赋值运算符 | &=、 |
开发建议:
1.不要过多的依赖运算的优先级来控制表达式的执行顺序,这样可读性太差,尽量使用()来控制表达式的执行顺序。
2.不要把一个表达式写得过于复杂,如果一个表达式过于复杂,则把它分成几步来完成。例如: (num1 + num2) * 2 > num3 && num2 > num3 ? num3 : num1 + num2;
程序从上到下逐行地执行,中间没有任何判断和跳转
package testOne; public class StatementTest { public static void main(String[] args) { int x = 1; int y = 2; System.out.println("x = " + x); System.out.println("y = " + y); //对x、y的值进行修改 x++; y = 2 * x + y; x = x * 10; System.out.println("x = " + x); System.out.println("y = " + y); } }
结构1:单分支条件判断:if
格式:
if(条件表达式){
语句块;
}
说明:条件表达式必须是布尔表达式(关系表达式或逻辑表达式)或 布尔变量。
结构2:双分支条件判断:if…else
格式:
if(条件表达式) {
语句块1;
}else {
语句块2;
}
结构3:多分支条件判断:if…else if…else
格式:
if (条件表达式1) {
语句块1;
} else if (条件表达式2) {
语句块2;
}
...
}else if (条件表达式n) {
语句块n;
} else {
语句块n+1;
}
说明:一旦条件表达式为true,则进入执行相应的语句块。执行完对应的语句块之后,就跳出当前结构
当条件表达式之间是“互斥”关系时(即彼此没有交集),条件判断语句及执行语句间顺序无所谓。
当条件表达式之间是“包含”关系时,“小上大下 / 子上父下”,否则范围小的条件表达式将不可能被执行。
案例1:成年人心率的正常范围是每分钟60-100次。体检时,如果心率不在此范围内,则提示需要做进一步的检查。
public class IfElseTest1 {
public static void main(String[] args){
int heartBeats = 89;
if(heartBeats < 60 || heartBeats > 100){
System.out.println("你需要做进一步的检查");
}
System.out.println("体检结束");
}
}
案例2:定义一个整数,判定是偶数还是奇数
public class IfElseTest2 {
public static void main(String[] args){
int a = 10;
if(a % 2 == 0) {
System.out.println(a + "是偶数");
} else{
System.out.println(a + "是奇数");
}
}
}
案例3:
岳小鹏参加Java考试,他和父亲岳不群达成承诺:
如果:
成绩为100分时,奖励一辆跑车;
成绩为(80,99]时,奖励一辆山地自行车;
当成绩为[60,80]时,奖励环球影城一日游;
其它时,胖揍一顿。
说明:默认成绩是在[0,100]范围内
public class IfElseTest3 { public static void main(String[] args) { int score = 67;//岳小鹏的期末成绩 //写法一:默认成绩范围为[0,100] if(score == 100){ System.out.println("奖励一辆跑车"); }else if(score > 80 && score <= 99){ //错误的写法:}else if(80 < score <= 99){ System.out.println("奖励一辆山地自行车"); }else if(score >= 60 && score <= 80){ System.out.println("奖励环球影城玩一日游"); } //else{ // System.out.println("胖揍一顿"); //} //写法二: // 默认成绩范围为[0,100] if(score == 100){ System.out.println("奖励一辆跑车"); }else if(score > 80){ System.out.println("奖励一辆山地自行车"); }else if(score >= 60){ System.out.println("奖励环球影城玩一日游"); }else{ System.out.println("胖揍一顿"); } } }
在 if 的语句块中,或者是在else语句块中,又包含了另外一个条件判断(可以是单分支、双分支、多分支),就构成了嵌套结构。
执行的特点:
(1)如果是嵌套在if语句块中的,只有当外部的if条件满足,才会去判断内部的条件
(2)如果是嵌套在else语句块中的,只有当外部的if条件不满足,进入else后,才会去判断内部的条件
案例4:由键盘输入三个整数分别存入变量num1、num2、num3,对它们进行排序(使用 if-else if-else),并且从小到大输出。
import java.util.Scanner; public class StatementTest { public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("输入第1个整数: " ); int num1 = in.nextInt(); System.out.println("输入第2个整数: " ); int num2 = in.nextInt(); System.out.println("输入第3个整数: "); int num3 = in.nextInt(); if(num1 >= num2){ if (num3 >= num1){ System.out.println(num2 + "," + num1 + "," + num3); }else if(num3 <= num2){ System.out.println(num3 + "," + num2 + "," + num1); }else { System.out.println(num2 + ',' + num3 + ',' + num1); } }else { if (num3 >= num2){ System.out.println(num2 + "," + num3 + "," + num1); }else if(num3 <= num1){ System.out.println(num3 + "," + num1 + "," + num2); }else { System.out.println(num1 + ',' + num3 + ',' + num2); } } } }
练习1:
对下列代码,若有输出,指出输出结果
int x = 4;
int y = 1;
if (x > 2) {
if (y > 2)
System.out.println(x + y);
System.out.println("atguigu");
} else
System.out.println("x is " + x);
练习2:
boolean b = true;
//如果写成if(b=false)能编译通过吗?如果能,结果是?
if(b == false) //建议:if(!b)
System.out.println("a");
else if(b)
System.out.println("b");
else if(!b)
System.out.println("c");
else
System.out.println("d");
练习3:
定义两个整数,分别为small 和 big,如果第一个整数small大于第二个整数big,就交换。输出显示small和big变量的值。
public static void main(String[] args) {
int small = 10;
int big = 30;
if(small > big){
int tmp = small;
small = big;
big = tmp;
}
System.out.println(small + " 、 "+ big);
}
练习4:
小明参加期末Java考试,通过考试成绩,判断其Java等级,成绩范围[0,100]
public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("小明的期末Java成绩是: "); int score = scan.nextInt(); if (score < 0 || score > 100) { System.out.println("你的成绩是错误的"); }else 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("你的成绩属于不及格"); } }
练习5:
编写程序,声明2个int型变量并赋值。判断两数之和,如果大于等于50,打印“hello world!”
public static void main(String[] args) {
int a = 20;
int b = 90;
if(a + b >= 50){
System.out.println("hello world!");
}
}
练习6:
编写程序,声明2个double型变量并赋值。判断第一个数大于10.0,且第2个数小于20.0,打印两数之和。否则,打印两数的乘积。
public static void main(String[] args) {
double num1 = 21.0;
double num2 = 19.0;
if (num1 > 10.0 && num2 < 20.0){
System.out.println(num1 + num2);
}else {
System.out.println(num1 * num2);
}
}
练习7:判断水的温度
如果大于95℃,则打印“开水”;
如果大于70℃且小于等于95℃,则打印“热水”;
如果大于40℃且小于等于70℃,则打印“温水”;
如果小于等于40℃,则打印“凉水”。
public static void main(String[] args) {
int waterTemperature = 62;
if (waterTemperature > 95){
System.out.println("开水");
}else if (waterTemperature >70){
System.out.println("热水");
}else if (waterTemperature > 40){
System.out.println("温水");
}else {
System.out.println("凉水");
}
}
语法格式
switch(表达式){
case 常量值1:
执行语句1;
//break;
case 常量值2:
执行语句2;
//break;
// ...
[default:
执行语句n+1;
break;
]
}
执行流程图
执行过程
public class SwitchCaseTest { public static void main(String[] args) { int num = 1; switch (num){ case 0: System.out.println("zero"); break; case 1: System.out.println("one"); break; case 2: System.out.println("two"); break; case 3: System.out.println("three"); break; default: System.out.println("other"); break; } } }
public class SwitchCaseTest2 { public static void main(String args[]) { String season = "summer"; switch (season) { case "spring": System.out.println("春暖花开"); break; case "summer": System.out.println("夏日炎炎"); break; case "autumn": System.out.println("秋高气爽"); break; case "winter": System.out.println("冬雪皑皑"); break; default: System.out.println("季节输入有误"); break; } } }
使用注意点:
案例1
使用switch-case实现:对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。
public class SwitchCaseTest { public static void main(String[] args) { int score = 99; switch (score/60){ case 0: System.out.println("不及格"); break; case 1: System.out.println("及格"); break; default: System.out.println("输入的成绩有误"); break; } } } switch(score / 10){ case 0: case 1: case 2: case 3: case 4: case 5: System.out.println("不及格"); break; case 6: case 7: case 8: case 9: case 10: System.out.println("及格"); break; default: System.out.println("输入的成绩有误"); break; }
案例2
编写程序:从键盘上输入2023年的“month”和“day”,要求通过程序输出输入的日期为2023年的第几天。
import java.util.Scanner; public class SwitchCaseTest { public static void main(String[] args) { //1、使用scanner,从键盘获取2023年的month、day Scanner scan = new Scanner(System.in); //阻塞式方法 System.out.println("请输入2023年的月份"); int month = scan.nextInt(); System.out.println("请输入2023年的天:"); int day = scan.nextInt(); //2、使用switch-case 实现分支结构 int sumDay = 0; //记录总天数 //方式1,不推荐,冗余 /* switch (month){ case 1: sumDay = day; break; case 2: sumDay = 31 + day; break; case 3: sumDay = 31 + 28 + day; break; case 4: sumDay = 31 + 28 + 31 + day; break; case 5: sumDay = 31 + 28 + 31 + 30 + day; break; case 6: sumDay = 31 + 28 + 31 + 30 + 31 + day; break; case 7: sumDay = 31 + 28 + 31 + 30 + 31 +30 + day; break; case 8: sumDay = 31 + 28 + 31 + 30 + 31 +30 + 31 + day; break; case 9: sumDay = 31 + 28 + 31 + 30 + 31 +30 + 31 + 31 + day; break; case 10: sumDay = 31 + 28 + 31 + 30 + 31 +30 + 31 + 31 + 30 + day; break; case 11: sumDay = 31 + 28 + 31 + 30 + 31 +30 + 31 + 31 + 30 + 31 + day; break; case 12: sumDay = 31 + 28 + 31 + 30 + 31 +30 + 31 + 31 + 30 + 31 + 30 + day; break; }*/ //方式2 switch (month){ case 12: sumDay += 30; case 11: sumDay += 31; case 10: sumDay += 30; case 9: sumDay += 31; case 8: sumDay += 31; case 7: sumDay += 30; case 6: sumDay += 31; case 5: sumDay += 30; case 4: sumDay += 31; case 3: sumDay += 28; case 2: sumDay += 31; case 1: sumDay += day; break; } System.out.println("2023年" + month + "月" + day + "日,是当前的第" + sumDay + "天"); scan.close(); //为了防止内存泄漏 } } /* import java.util.regex.Pattern; import java.util.regex.Matcher; //使用正则表达式进行日期校验 public class DateValidator { private static final String DATE_PATTERN = "^(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])-(19|20)\\d\\d$"; public static boolean isValidDate(String date) { Pattern pattern = Pattern.compile(DATE_PATTERN); Matcher matcher = pattern.matcher(date); return matcher.matches(); } public static void main(String[] args) { String date = "2023-06-23"; boolean isValid = isValidDate(date); System.out.println(" isValid: " + isValid); } } */
练习1
从键盘输入星期的整数值,输出星期的英文单词
import java.util.Scanner; public class SwitchCaseExer1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入星期值:"); int weekday = input.nextInt(); switch (weekday){ case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; case 3: System.out.println("Wednesday"); break; case 4: System.out.println("Thursday"); break; case 5: System.out.println("Friday"); break; case 6: System.out.println("Saturday"); break; case 7: System.out.println("Sunday"); break; default: System.out.println("你输入的星期值有误!"); break; } input.close(); } }
练习2
使用 switch 把小写类型的 char型转为大写。只转换 a, b, c, d, e. 其它的输出 “other”。
public class SwitchCaseExer2 { public static void main(String[] args) { char word = 'c'; switch (word){ case 'a': System.out.println('A'); break; case 'b': System.out.println('B'); break; case 'c': System.out.println('C'); break; case 'd': System.out.println('D'); break; case 'e': System.out.println('E'); break; default: System.out.println("other"); } } }
练习3
编写程序:从键盘上读入一个学生成绩,存放在变量score中,根据score的值输出其对应的成绩等级:
score>=90 等级: A
70<=score<90 等级: B
60<=score<70 等级: C
score<60 等级: D
方式一:使用if-else
方式二:使用switch-case: score / 10: 0 - 10
import java.util.Scanner; public class SwitchCaseExer3 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入学生成绩:"); int score = input.nextInt(); char grade;//记录学生等级 /* if (score >= 90){ grade = 'A'; }else if (score >= 70){ grade = 'B'; }else if (score >= 60){ grade = 'C'; }else { grade = 'D'; }*/ //方式2: switch(score / 10){ case 10: case 9: grade = 'A'; break; case 8: case 7: grade = 'B'; break; case 6: grade = 'C'; break; default : grade = 'D'; } System.out.println("学生成绩为" + score + ",对应的等级为" + grade); input.close(); } }
练习4
编写一个程序,为一个给定的年份找出其对应的中国生肖。中国的生肖基于12年一个周期,每年用一个动物代表:rat、ox、tiger、rabbit、dragon、snake、horse、sheep、monkey、rooster、dog、pig。
提示:2022年:虎 2022 % 12 == 6
import java.util.Scanner; /** * @author davina * @create 18:20 */ public class SwitchCaseExer4 { public static void main(String[] args) { //从键盘输入一个年份 Scanner input = new Scanner(System.in); System.out.println("请输入年份:"); int year = input.nextInt(); input.close(); //判断 switch (year % 12) { case 0: System.out.println(year + "是猴年"); break; case 1: System.out.println(year + "是鸡年"); break; case 2: System.out.println(year + "是狗年"); break; case 3: System.out.println(year + "是猪年"); break; case 4: System.out.println(year + "是鼠年"); break; case 5: System.out.println(year + "是牛年"); break; case 6: System.out.println(year + "是虎年"); break; case 7: System.out.println(year + "是兔年"); break; case 8: System.out.println(year + "是龙年"); break; case 9: System.out.println(year + "是蛇年"); break; case 10: System.out.println(year + "是马年"); break; case 11: System.out.println(year + "是羊年"); break; default: System.out.println(year + "输入错误"); } } }
练习5:押宝游戏
随机产生3个1-6的整数,如果三个数相等,那么称为“豹子”,如果三个数之和大于9,称为“大”,如果三个数之和小于等于9,称为“小”,用户从键盘输入押的是“豹子”、“大”、“小”,并判断是否猜对了
提示:随机数 Math.random()产生 [0,1)范围内的小数
如何获取[a,b]范围内的随机整数呢?(int)(Math.random() * (b - a + 1)) + a
import java.util.Scanner; public class SwitchCaseExer5 { public static void main(String[] args) { //1、随机产生3个1-6的整数 int a = (int)(Math.random()*6 + 1); int b = (int)(Math.random()*6 + 1); int c = (int)(Math.random()*6 + 1); //2、押宝 Scanner input = new Scanner(System.in); System.out.print("请押宝(豹子、大、小):"); String ya = input.next(); input.close(); //3、判断结果 boolean result = false; //switch支持String类型 switch (ya){ case "豹子": result = a == b && b == c; break; case "大": result = a + b + c > 9; break; case "小": result = a + b + c <= 9; break; default:System.out.println("输入有误!"); } System.out.println("a,b,c分别是:" + a +"," + b +"," + c ); System.out.println(result ? "猜中了" : "猜错了"); } }
根据循环条件,重复性的执行某段代码。
有for、while、do-while
三种循环语句。
补充:JDK5.0 提供了foreach循环,方便的遍历集合、数组元素。
理解:循环语句具有在某些条件满足的情况下,反复执行特定代码的功能。
循环结构分类:
循环结构四要素:
语法格式:
for (①初始化部分; ②循环条件部分; ④迭代部分){
③循环体部分;
}
执行过程:①-②-③-④-②-③-④-②-③-④-…-②
案例1:使用for循环重复执行某些语句
题目:输出5行HelloWorld
public class ForTest1 { public static void main(String[] args) { /* 需求1:控制台输出5行Hello World! 写法1: System.out.println("Hello World!"); System.out.println("Hello World!"); System.out.println("Hello World!"); System.out.println("Hello World!"); System.out.println("Hello World!");*/ //写法2: for(int i = 1;i <= 5;i++){ System.out.println("Hello World!"); } } }
public class ForTest2 {
public static void main(String[] args) {
int num = 1;
for(System.out.print("a");num < 3;System.out.print("c"),num++){
System.out.print("b");
}
}
}
案例2 累加
题目:遍历1-100以内的偶数,并获取偶数的个数,获取所有的偶数的和
public class ForTest3 { public static void main(String[] args) { int count = 0;//记录偶数的个数 int sum = 0;//记录偶数的和 for(int i = 1;i <= 100;i++){ if(i % 2 == 0){ System.out.println(i); count++; sum += i; } } System.out.println("偶数的个数为:" + count); System.out.println("偶数的总和为:" + sum); } }
案例3:结合分支结构使用
题目:输出所有的水仙花数,所谓水仙花数是指一个3位数,其各个位上数字立方和等于其本身。例如: 153 = 111 + 333 + 555
public class ForTest4 { public static void main(String[] args) { //定义统计变量,初始化值是0 int count = 0; //获取三位数,用for循环实现 for(int x = 100; x < 1000; x++) { //获取三位数的个位,十位,百位 int ge = x % 10; int shi = x / 10 % 10; int bai = x / 100; //判断这个三位数是否是水仙花数,如果是,统计变量++ if((ge*ge*ge+shi*shi*shi+bai*bai*bai) == x) { System.out.println("水仙花数:" + x); count++; } } //输出统计结果就可以了 System.out.println("水仙花数共有"+count+"个"); } }
案例5: 结合break的使用
说明:输入两个正整数m和n,求其最大公约数和最小公倍数。
比如:12和20的最大公约数是4,最小公倍数是60。
import java.util.Scanner; //输入两个正整数m和n,求其最大公约数和最小公倍数 public class ForTest1 { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入正整数m: "); int m = input.nextInt(); System.out.println("请输入正整数n: "); int n = input.nextInt(); //获取m和n中的较小值 int min = (m < n)? m : n; //需求1:最大公约数 //方式1: int result = 1; for (int i = 1; i <= min; i++) { if (m % i == 0 && n % i == 0){ //System.out.println(i); result = i; } } System.out.println(result); //方式2:推荐 for (int i = min; i >= 1; i--) { if (m % i == 0 && n % i == 0) { System.out.println(i); break; //一旦执行就跳出当前循环 } } //需求2:最小公倍数 int max = (m > n)? m : n; for (int i = max; i <= m * n; i++) { if (i % m == 0 && i % n == 0 ){ System.out.println(i); break; } } } }
说明:
语法格式:
①初始化部分
while(②循环条件部分){
③循环体部分;
④迭代部分;
}
执行过程:①-②-③-④-②-③-④-②-③-④-…-②
图示:
说明:
需求1:遍历50次hello world
需求2:遍历1-100的偶数,并计算所有偶数的和、偶数的个数(累加的思想)
public class WhileTest { public static void main(String[] args) { //需求1:遍历50次hello world int i = 1; while (i <= 50){ System.out.println("hello world!!"); i++; } //需求2:遍历1-100的偶数,并计算所有偶数的和、偶数的个数(累加的思想) int j = 1; int count = 0;//记录偶数的个数 int sum = 0; //记录偶数的总和 while (j <= 100){ if (j % 2 == 0){ System.out.println(j); count++; sum += j; } j++; } System.out.println("偶数的个数为:" + count); System.out.println("偶数的总和为:" + sum); } }
案例3:猜数字游戏
随机生成一个100以内的数,猜这个随机数是多少?
从键盘输入数,如果大了,提示大了;如果小了,提示小了;如果对了,就不再猜了,并统计一共猜了多少次。
提示:生成一个[a,b] 范围的随机数的方式:(int)(Math.random() * (b - a + 1) + a)
import java.util.Scanner; public class WhileTest1 { public static void main(String[] args) { //1、生成一个[1,100]范围的随机整数 int random = (int) (Math.random() * 100) + 1; //2、使用scanner,从键盘获取数据 Scanner scan = new Scanner(System.in); System.out.println("请输入1-100范围内的一个整数:"); int guess = scan.nextInt(); //3、声明一个变量,记录猜的次数 int guessCount = 1; //3、使用循环结构,进行多次循环的对比和获取数据 while (random != guess){ if (guess > random){ System.out.println("你输入的数据大了"); }else if (guess < random){ System.out.println("你输入的数据小了"); } System.out.println("请输入1-100范围内的一个整数:"); guess = scan.nextInt(); guessCount++; } System.out.println("恭喜你!猜对了"); System.out.println("共猜了" + guessCount + "次"); } }
案例4:折纸珠穆朗玛峰
世界最高山峰是珠穆朗玛峰,它的高度是8848.86米,假如我有一张足够大的纸,它的厚度是0.1毫米。
请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
public class WhileTest2 { public static void main(String[] args) { //1、声明珠峰的高度,纸的默认厚度 double paper = 0.1; //单位:毫米 double zf = 8848860; //单位:毫米 //2、定义一个变量,记录折纸的次数 int count = 0; //3、通过循环结构,不断调整纸的厚度(当纸的厚度超过珠峰高度时,停止循环) while (paper <= zf){ paper *= 2; count++; } System.out.println("paper的高度为:" + (paper / 1000) + ",超过了珠峰的高度" + (zf / 1000)); System.out.println("共折纸" + count + "次"); } }
语法格式:
①初始化部分;
do{
③循环体部分
④迭代部分
}while(②循环条件部分);
**执行过程:**①-③-④-②-③-④-②-③-④-…-②
图示:
说明:
案例1:
遍历1-100的偶数,并计算所有偶数的和、偶数的个数(累加的思想)
public class DoWhileTest { public static void main(String[] args) { //需求1:遍历1-100的偶数,并计算所有偶数的和、偶数的个数 int i = 1; int count = 0; //记录偶数的个数 int sum = 0; //记录偶数的总和 do { if (i % 2 == 0){ System.out.println(i); count++; sum += i; } i++; }while (i <= 100); System.out.println("偶数的个数为:" + count); System.out.println("偶数的总和为:" + sum); } }
案例2:体会do-while至少会执行一次循环体
class DoWhileTest2 { public static void main(String[] args) { //while循环: int num1 = 10; while(num1 > 10){ System.out.println("hello:while"); num1--; } //do-while循环: int num2 = 10; do{ System.out.println("hello:do-while"); num2--; }while(num2 > 10); } }
案例3:ATM取款
声明变量balance并初始化为0,用以表示银行账户的余额,下面通过ATM机程序实现存款,取款等功能。
=ATM
1、存款
2、取款
3、显示余额
4、退出
请选择(1-4):
import java.util.Scanner; public class DoWhileTest1 { public static void main(String[] args) { //1、定义一个变量,记录银行账户余额 double balance = 0.0; boolean flag = true; //控制循环的结束 Scanner input = new Scanner(System.in); //实例化scanner do { //2、声明ATM收款界面 System.out.println("=========ATM========"); System.out.println("1、存款" ); System.out.println("2、取款" ); System.out.println("3、显示余额" ); System.out.println("4、退出" ); System.out.println("请选择(1-4):"); //3、使用scanner获取用户的选择 int selection = input.nextInt(); switch (selection){ //4、根据用户的选择,决定执行存款、取款、显示余额、退出的操作 case 1: System.out.println("请输入存款的金额:"); double money1 = input.nextDouble(); if (money1 > 0){ balance += money1; } break; case 2: System.out.println("请输入取款的金额:"); double money2 = input.nextDouble(); if (money2 > 0 && money2 <= balance){ balance -= money2; }else { System.out.println("输入的数据有误或余额不足"); } break; case 3: System.out.println("显示金额为:" + balance); break; case 4: flag = false; System.out.println("感谢使用,欢迎下次光临"); break; default: System.out.println("输入有误,请重新输入"); } }while (flag); //关闭资源 input.close(); } }
三种循环结构都具有四个要素:
从循环次数角度分析
如何选择
语法格式:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。