语法格式:循环初始值;
while(布尔表达式){ 循环体; 步进语句; }
执行过程:先判断布尔表达式,布尔表达式为true时,执行循环体和步进语句,执行完后再次进行判断布尔表达式,一直循环到布尔表达式为false时才停止循环。
应用场景:while常用作于死循环,循环条件直接写成true。
猜数字案例:
import java.util.Random; import java.util.Scanner; /** * 本类用于while循环 */ public class WhileLoop { /** * 电脑生成随机数的方法 * * @return 返回电脑产生0-100之间的随机整数给调用处 */ public static int createNum() { Random random = new Random(); return random.nextInt(101); } /** * 用户输入猜的数字的方法 * * @return 返回用户猜的数字给调用处 */ public static int userGuess() { System.out.print("请输入一个0-100的整数:"); Scanner sc = new Scanner(System.in); return sc.nextInt(); } /** * 用户猜的数字和电脑随机生成的随机数进行比较的方法 */ public static void guess() { int computerNum = createNum(); int playNum = userGuess(); /** * while常用作于死循环,循环条件直接写成true * 死循环必须在合适的时候设置出口 */ while (true) { if (playNum == computerNum) { System.out.println("真厉害,猜对了!!!"); break; } else if (playNum > computerNum) { System.out.println("真可惜,猜大了"); } else { System.out.println("真可惜,猜小了"); } playNum = userGuess(); } } public static void main(String[] args) { /** * 需求:产生一个随机数,和用户猜的数字作比较,直到用于猜对 */ System.out.println("让我们来玩猜数字的小游戏吧!"); guess(); } }
【注意】
while循环可能一次也不执行。
while循环小括号后面不能添加分号,否则会变成死循环。
语法格式:
do{
循环体;
}while(布尔表达式);
执行过程:先进行循环体,循环体运行完后在进行布尔表达式的判断,为true则继续执行循环体到判断布尔表达式为false时才停止。
【注意】
do-while循环最少执行一次。
do-while的while小括号后面的分号不能丢。
int n = 0; int count = 0; // 统计循环次数 do { System.out.println("我是循环体"); n = new Random().nextInt(301); System.out.println("变量n的值为" + n); System.out.println(); count++; }while (n != 250);
数组是Java在内存中开辟连续空间的引用类型变量。
数组的创建分为两种:动态创建和静态创建。
静态创建数组时就会给数组当中的每一个下标元素赋值。
静态数组的创建分为两种:
第一种方式创建静态数组:数组类型[] 数组名 = new 数组类型[]{ 数组下标元素的值 }
第二种方式创建静态数组:数组类型[] 数组名 = { 数组下表元素的值 }
动态创建只是在开始规定数组的长度,数组下标元素的数据是系统默认值。
动态创建数组:数组类型[] 数组名 = new 数组类型[ 数组长度 ];
// 1、静态创建数组的第一种方式 int[] arrA = new int[]{1, 2, 3, 4}; // 2、静态创建数组的第二种方式 char[] ch = new char[]{'H', 'e', 'l', 'l', 'o'}; // 3、动态创建数组 String[] arrStr = new String[3];
求数组的长度语法:数组名.length;
// 静态创建数组 int[] arrIntStaticOne = {1, 2, 3, 4, 5, 6}; // 打印输出数组的长度 System.out.println(arrIntStaticOne.length); // 数组的长度为6
【注意】
数组一旦被创建,数组的长度不可改变。
数组的下标:数组的下标是从0开始,最大的数组下标是数组的长度 - 1。
我们就是通过操作数组下标来对数组下标元素的值进行操作的。
直接利用输出语句来打印输出数组名,得到的是一个数组在内存空间的地址值。
而利用Arrays.toString(参数列表);的方法与输出语句搭配使用就可以得到数组的下表元素的数据值。
// 静态创建数组 int[] arrIntStaticOne = {1, 2, 3, 4, 5, 6}; // 打印输出数组下标元素中的值 System.out.println(Arrays.toString(arrIntStaticOne)); // 打印输出的结果为:[1, 2, 3, 4, 5, 6]
Arrays.toString(参数列表);
参数列表就是需要传入数组名。
【注意】
Arrays工具类需要导包。
char类型数组可以直接和输出语句使用来直接输出char类型数组下标元素的数据值。
数组的扩容与缩容需要用到Arrays工具类中的copyOf(参数列表);方法
copyOf(参数列表);
参数列表1:需要扩容的数组
参数列表2:数组的长度
扩容:给数组扩大容量,新数组的长度大于原数组的长度。
扩容思路:先创建对应新长度的新数组,每个位置的默认值为0,然后从原数组中将数组复制到新数组,没有被覆盖的位置还是默认值。
缩容:缩小数组的容量,新数组长度小于缩容前数组的长度。
缩容思路:先创建对应新长度的新数组,每个位置初始化默认值为0,然后从原数组中复制指定个数的数据到新数组中,类似于"截取"一部分。
指定首尾截取原数组中的元素:
copyOfRange(); 用于完成数组的截取。
参数1:要截取哪个数组【原数组】。
参数2:从哪个下标开始。
参数3:到哪个下标结束。
截取范围:左闭右开区间。
如果下标越界,那么会即会截取,又会扩容。
【注意】
数组的扩容和缩容不是真的扩容和缩容,因为数组一旦创建长度不可改变,而是在内存中新建一个数组,将数组变量名保存的原数组的地址值替换为新数组的地址值,原数组会被Java回收机制给处理掉
/** * 创建一个获取1年中12个月每个月天数的方法,并且打印输出 */ public static void dayOfMonth() { int[] days = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int i = 0; i < days.length; i++) { System.out.println("第" + (i + 1) + "个月有:" + days[i] + "天"); } }
i < days.length;的原因是因为数组下标从开始,数组下标最大值等于数组长度-1。
如果等于数组长度,则会出现数组下标越界异常。i的每一个值都代表着days数组的每一个下标。
方法的重载:
方法的重载的意义:为了提高代码的复用性和灵活性。
方法的重载:
在同一个类中,存在方法名相同,但是参数列表不同的方法
如果在同类中,同名方法的参数个数不同,一定构成重载
如果在同类中,同名方法的参数个数不同,可能构成重载,需要查看方法的参数类型,和参数名无关
【注意】
方法的重载与方法的参数类型有关
方法的重载与方法的参数名无关
方法的重载与方法的返回值无关
方法的重载与方法的名称有关
方法的重载与方法的访问修饰符无关
方法的重载与方法的参数列表个数有关
/** * 本类用于演示方法的重载 */ public class MethodOverride { private static void method() { System.out.println("哈哈哈哈哈哈,我没有参数和返回值"); } public static void method(int num){ System.out.println("哈哈哈,我的参数是" + num); } public static void main(String[] args) { /** * 通过方法名+参数列表来调用方法 * * 方法的重载: * 在同一个类中,存在方法名相同,但是参数列表不同的方法 * * 如果在同类中,同名方法的参数个数不同,一定构成重载 * 如果在同类中,同名方法的参数个数不同,可能构成重载,需要查看方法的参数类型,和参数名无关 * * 方法的重载与方法的参数类型有关 * 方法的重载与方法的参数名无关 * 方法的重载与方法的返回值无关 * 方法的重载与方法的名称有关 * 方法的重载与方法的访问修饰符无关 * 方法的重载与方法的参数列表个数有关 */ method(); method(666); } }