Java基础语法(三)

简介: Java基础语法

8. for循环


8.1 for循环结构(掌握)


  • 循环:
    循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体语句,当反复 执行这个循环体时,需要在合适的时候把循环判断条件修改为false,从而结束循环,否则循环将一直执行下去,形 成死循环。
  • for循环格式:


for (初始化语句;条件判断语句;条件控制语句) {
  循环体语句;
}


格式解释:


初始化语句: 用于表示循环开启时的起始状态,简单说就是循环开始的时候什么样

条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行下去

循环体语句: 用于表示循环反复执行的内容,简单说就是循环反复执行的事情

条件控制语句:用于表示循环执行中每次变化的内容,简单说就是控制循环是否能执行下去

执行流程:


①执行初始化语句


②执行条件判断语句,看其结果是true还是false


如果是false,循环结束


如果是true,继续执行


③执行循环体语句


④执行条件控制语句


⑤回到②继续



public class ForDemo {
  public static void main(String[] args) {
    //需求:在控制台输出5次"HelloWorld"
    System.out.println("HelloWorld");
    System.out.println("HelloWorld");
    System.out.println("HelloWorld");
    System.out.println("HelloWorld");
    System.out.println("HelloWorld");
    System.out.println("--------");
    //用循环改进
    for(int i=1; i<=5; i++) {
      System.out.println("HelloWorld");
    }
  }
}


8.2 for循环练习-输出数据(应用)


  • 需求:在控制台输出1-5和5-1的数据
  • 示例代码:


public class ForTest01 {
  public static void main(String[] args) {
    //需求:输出数据1-5
    for(int i=1; i<=5; i++) {
      System.out.println(i);
    }
    System.out.println("--------");
    //需求:输出数据5-1
    for(int i=5; i>=1; i--) {
      System.out.println(i);
    }
  }
}


8.3 for循环练习-求和


  • 需求:求1-5之间的数据和,并把求和结果在控制台输出
  • 示例代码:


public class ForTest02 {
  public static void main(String[] args) {
    //求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
    int sum = 0;
    //从1开始到5结束的数据,使用循环结构完成
    for(int i=1; i<=5; i++) {
      //将反复进行的事情写入循环结构内部,此处反复进行的事情是将数据 i 加到用于保存最终求和的变量 sum 中
      sum += i;
      /*
        sum += i; sum = 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);
  }
}


本题要点:

  • 今后遇到的需求中,如果带有求和二字,请立即联想到求和变量
  • 求和变量的定义位置,必须在循环外部,如果在循环内部则计算出的数据将是错误的


8.4 for循环练习-求偶数和


  • 需求:求1-100之间的偶数和,并把求和结果在控制台输出 }
  • 示例代码:


public class ForTest03 {
  public static void main(String[] args) {
    //求和的最终结果必须保存起来,需要定义一个变量,用于保存求和的结果,初始值为0
    int sum = 0;
    //对1-100的数据求和与1-5的数据求和几乎完全一样,仅仅是结束条件不同
    for(int i=1; i<=100; i++) {
      //对1-100的偶数求和,需要对求和操作添加限制条件,判断是否是偶数
      if(i%2 == 0) {
        sum += i;
      }
    }
    //当循环执行完毕时,将最终数据打印出来
    System.out.println("1-100之间的偶数和是:" + sum);
  }
}


8.5 for循环练习-水仙花


需求:在控制台输出所有的“水仙花数”

解释:什么是水仙花数?

水仙花数,指的是一个三位数,个位、十位、百位的数字立方和等于原数

例如153 3*3*3 + 5*5*5 + 1*1*1 = 153

思路:

获取所有的三位数,准备进行筛选,最小的三位数为100,最大的三位数为999,使用for循环获取

获取每一个三位数的个位,十位,百位,做if语句判断是否是水仙花数

示例代码


public class ForTest04 {
  public static void main(String[] args) {
    //输出所有的水仙花数必然要使用到循环,遍历所有的三位数,三位数从100开始,到999结束
    /*
    for(int i=100; i<=999; i++) {
    }
    */
    for(int i=100; i<1000; i++) {
      //在计算之前获取三位数中每个位上的值
      int ge = i%10;
      int shi = i/10%10;
      int bai = i/10/10%10;
      //判定条件是将三位数中的每个数值取出来,计算立方和后与原始数字比较是否相等
      if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
        //输出满足条件的数字就是水仙花数
        System.out.println(i);
      }
    }
  }
}


8.6 for循环练习-统计水仙花数个数


  • 需求:统计“水仙花数”一共有多少个,并在控制台输出个数
  • 示例代码:


public class ForTest05 {
  public static void main(String[] args) {
    //定义变量count,用于保存“水仙花数”的数量,初始值为0
    int count = 0;
    //输出所有的水仙花数必然要使用到循环,遍历所有的三位数,三位数从100开始,到999结束
    for(int i=100; i<1000; i++) {
      //在计算之前获取三位数中每个位上的值
      int ge = i%10;
      int shi = i/10%10;
      int bai = i/10/10%10;
      //在判定水仙花数的过程中,满足条件不再输出,更改为修改count的值,使count+1
      if(ge*ge*ge + shi*shi*shi + bai*bai*bai == i) {
        count++;
      }
    }
    //打印输出最终结果
    System.out.println("水仙花共有:" + count + "个");
  }
}


  • 本题要点:
  • 今后如果需求带有统计xxx,请先想到计数器变量
  • 计数器变量定义的位置,必须在循环外部


9. while循环


9.1 while结构


  • while循环完整格式:


初始化语句;
while (条件判断语句) {
  循环体语句;
    条件控制语句;
}


  • while循环执行流程:
    ①执行初始化语句
    ②执行条件判断语句,看其结果是true还是false
    如果是false,循环结束
    如果是true,继续执行
    ③执行循环体语句
    ④执行条件控制语句
    ⑤回到②继续
  • 示例代码:


public class WhileDemo {
  public static void main(String[] args) {
    //需求:在控制台输出5次"HelloWorld"
    //for循环实现
    for(int i=1; i<=5; i++) {
      System.out.println("HelloWorld");
    }
    System.out.println("--------");
    //while循环实现
    int j = 1;
    while(j<=5) {
      System.out.println("HelloWorld");
      j++;
    }
  }
}


9.2 while循环练习-珠穆朗玛峰


  • 需求:世界最高山峰是珠穆朗玛峰(8844.43米=8844430毫米),假如我有一张足够大的纸,它的厚度是0.1毫米。请问,我折叠多少次,可以折成珠穆朗玛峰的高度?
  • 示例代码:


public class WhileTest {
  public static void main(String[] args) {
    //定义一个计数器,初始值为0
    int count = 0;
    //定义纸张厚度
    double paper = 0.1;
    //定义珠穆朗玛峰的高度
    int zf = 8844430;
    //因为要反复折叠,所以要使用循环,但是不知道折叠多少次,这种情况下更适合使用while循环
    //折叠的过程中当纸张厚度大于珠峰就停止了,因此继续执行的要求是纸张厚度小于珠峰高度
    while(paper <= zf) {
      //循环的执行过程中每次纸张折叠,纸张的厚度要加倍
      paper *= 2;
      //在循环中执行累加,对应折叠了多少次
      count++;
    }
    //打印计数器的值
    System.out.println("需要折叠:" + count + "次");
  }
}


10. 循环细节


10.1 do…while循环结构


  • 完整格式:


初始化语句;
do {
  循环体语句;
  条件控制语句;
}while(条件判断语句);
  • 执行流程:
    ① 执行初始化语句
    ② 执行循环体语句
    ③ 执行条件控制语句
    ④ 执行条件判断语句,看其结果是true还是false
    如果是false,循环结束
    如果是true,继续执行
    ⑤ 回到②继续
  • 示例代码:


public class DoWhileDemo {
  public static void main(String[] args) {
    //需求:在控制台输出5次"HelloWorld"
    //for循环实现
    for(int i=1; i<=5; i++) {
      System.out.println("HelloWorld");
    }
    System.out.println("--------");
    //do...while循环实现
    int j = 1;
    do {
      System.out.println("HelloWorld");
      j++;
    }while(j<=5);
  }
}


10.2 三种循环的区别


三种循环的区别

for循环和while循环先判断条件是否成立,然后决定是否执行循环体(先判断后执行)

do…while循环先执行一次循环体,然后判断条件是否成立,是否继续执行循环体(先执行后判断)

for循环和while的区别

条件控制语句所控制的自增变量,因为归属for循环的语法结构中,在for循环结束后,就不能再次被访问到了

条件控制语句所控制的自增变量,对于while循环来说不归属其语法结构中,在while循环结束后,该变量还可以继续使用

死循环(无限循环)的三种格式

for(;; ){}

while(true){}

do {} while(true);


10.3 跳转控制语句


  • 跳转控制语句(break)
  • 跳出循环,结束循环
  • 跳转控制语句(continue)
  • 跳过本次循环,继续下次循环
  • 注意: continue只能在循环中进行使用!


10.4 循环嵌套


  • 循环嵌套概述:在循环中,继续定义循环
  • 示例代码:


public class ForForDemo {
  public static void main(String[] args) {
    for(int hour=0; hour<24; hour++) {
      for(int minute=0; minute<60; minute++) {
        System.out.println(hour + "时" + minute + "分");
      }
      System.out.println("--------");
    }
  }
}


  • 理解:
  • 请反复理解这句话(整个内循环,就是外循环的一个循环体,内部循环体没有执行完毕,外循环是不会继续向下执行的)
  • 结论:
  • 外循环执行一次,内循环执行一圈


11. Random


11.1 Random产生随机数


概述:


Random类似Scanner,也是Java提供好的API,内部提供了产生随机数的功能

API后续课程详细讲解,现在可以简单理解为Java已经写好的代码

使用步骤:


导入包


import java.util.Random;


创建对象


Random r = new Random();


产生随机数


int num = r.nextInt(10);


解释: 10代表的是一个范围,如果括号写10,产生的随机数就是0-9,括号写20,参数的随机数则是0-19


示例代码:


import java.util.Random;
public class RandomDemo {
  public static void main(String[] args) {
    //创建对象
    Random r = new Random();
    //用循环获取10个随机数
    for(int i=0; i<10; i++) {
      //获取随机数
      int number = r.nextInt(10);
      System.out.println("number:" + number);
    }
    //需求:获取一个1-100之间的随机数
    int x = r.nextInt(100) + 1;
    System.out.println(x);
  }
}



11.2 Random练习-猜数字


需求:


程序自动生成一个1-100之间的数字,使用程序实现猜出这个数字是多少?


当猜错的时候根据不同情况给出相应的提示


A. 如果猜的数字比真实数字大,提示你猜的数据大了


B. 如果猜的数字比真实数字小,提示你猜的数据小了


C. 如果猜的数字与真实数字相等,提示恭喜你猜中了


示例代码:


import java.util.Random;
import java.util.Scanner;
public class RandomTest {
  public static void main(String[] args) {
    //要完成猜数字的游戏,首先需要有一个要猜的数字,使用随机数生成该数字,范围1到100
    Random r = new Random();
    int number = r.nextInt(100) + 1;
    while(true) {
      //使用程序实现猜数字,每次均要输入猜测的数字值,需要使用键盘录入实现
      Scanner sc = new Scanner(System.in);
      System.out.println("请输入你要猜的数字:");
      int guessNumber = sc.nextInt();
      //比较输入的数字和系统产生的数据,需要使用分支语句。这里使用if..else..if..格式,根据不同情况进行猜测结果显示
      if(guessNumber > number) {
        System.out.println("你猜的数字" + guessNumber + "大了");
      } else if(guessNumber < number) {
        System.out.println("你猜的数字" + guessNumber + "小了");
      } else {
        System.out.println("恭喜你猜中了");
        break;
      }
    }
  }
}


12. IDEA开发工具


参见:IDEA工具安装详解.pdf

IDEA工具安装详解.pdf


13. 数组


13.1 什么是数组


数组(array)是一种用于存储多个相同类型数据的存储模型



13.2 数组定义格式


13.2.1 第一种


数据类型[] 数组名

示例:


int[] arr;        
double[] arr;      
char[] arr;


定义了一个int类型的数组,数组名是arr


13.2.2 第二种(不推荐)


数据类型 数组名[]

示例:


int arr[];
double arr[];
char arr[];


定义了一个int类型的变量,变量名是arr数组


13.3 数组动态初始化


13.3.1 什么是动态初始化


数组动态初始化就是只给定数组的长度,由系统给出默认初始化值


13.3.2 动态初始化格式

数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr = new int[3];


13.3.3动态初始化格式详解


  • 等号左边:
  • int:数组的数据类型
  • []:代表这是一个数组
  • arr:代表数组的名称
  • 等号右边:
  • new:为数组开辟内存空间
  • int:数组的数据类型
  • []:代表这是一个数组
  • 3:代表数组的长度


13.4 数组元素访问


13.4.1 什么是索引


每一个存储到数组的元素,都会自动的拥有一个编号,从0开始。

这个自动编号称为数组索引(index),可以通过数组的索引访问到数组中的元素。


13.4.2 访问数组元素格式

数组名[索引];


13.4.3 示例代码


public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[3];
        //输出数组名
        System.out.println(arr); //[I@880ec60
        //输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}


13.5 内存分配


13.5.1 内存概述


内存是计算机中的重要原件,临时存储区域,作用是运行程序。

我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的。

必须放进内存中才能运行,运行完毕后会清空内存。

Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。


13.5.2 java中的内存分配


  • 目前我们只需要记住两个内存,分别是:栈内存和堆内存



23.png


13.6 单个数组的内存图


24.png


13.7 多个数组的内存图


25.png



13.8 多个数组指向相同内存图


26.png


13.9 数组静态初始化


13.9.1 什么是静态初始化


在创建数组时,直接将元素确定


13.9.2 静态初始化格式


完整版格式

数据类型[] 数组名 = new 数据类型[]{元素1,元素2,...};
数据类型[] 数组名 = {元素1,元素2,...};



13.9.3 示例代码

public class ArrayDemo {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {1, 2, 3};
        //输出数组名
        System.out.println(arr);
        //输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

13.10 数组操作的两个常见小问题


13.10.1 索引越界异常


  • 出现原因


public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[3];
    System.out.println(arr[3]);
    }
}


数组长度为3,索引范围是0~2,但是我们却访问了一个3的索引。


程序运行后,将会抛出ArrayIndexOutOfBoundsException 数组越界异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。


解决方案


将错误的索引修改为正确的索引范围即可!


13.10.2 空指针异常

  • 出现原因


public class ArrayDemo {
    public static void main(String[] args) {
        int[] arr = new int[3];
    //把null赋值给数组
        arr = null;
        System.out.println(arr[0]);
    }
}


arr = null 这行代码,意味着变量arr将不会在保存数组的内存地址,也就不允许再操作数组了,因此运行的时候会抛出 NullPointerException 空指针异常。在开发中,数组的越界异常是不能出现的,一旦出现了,就必须要修改我们编写的代码。


解决方案


给数组一个真正的堆内存空间引用即可!


13.11 数组遍历


  • 数组遍历:就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。


public class ArrayTest01 {
  public static void main(String[] args) {
    int[] arr = { 1, 2, 3, 4, 5 };
    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]);
  }
}


以上代码是可以将数组中每个元素全部遍历出来,但是如果数组元素非常多,这种写法肯定不行,因此我们需要改造成循环的写法。数组的索引是 0 到 lenght-1 ,可以作为循环的条件出现。


public class ArrayTest01 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {11, 22, 33, 44, 55};
        //使用通用的遍历格式
        for(int x=0; x<arr.length; x++) {
            System.out.println(arr[x]);
        }
    }
}


13.12 数组最值


最大值获取:从数组的所有元素中找出最大值。


实现思路:


定义变量,保存数组0索引上的元素

遍历数组,获取出数组中的每个元素

将遍历到的元素和保存数组0索引上值的变量进行比较

如果数组元素的值大于了变量的值,变量记录住新的值

数组循环遍历结束,变量保存的就是数组中的最大值

代码实现:



public class ArrayTest02 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {12, 45, 98, 73, 60};
        //定义一个变量,用于保存最大值
        //取数组中第一个数据作为变量的初始值
        int max = arr[0];
        //与数组中剩余的数据逐个比对,每次比对将最大值保存到变量中
        for(int x=1; x<arr.length; x++) {
            if(arr[x] > max) {
                max = arr[x];
            }
        }
        //循环结束后打印变量的值
        System.out.println("max:" + max);
    }
}
相关文章
|
2月前
|
Java Apache Maven
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
64 6
Java百项管理之新闻管理系统 熟悉java语法——大学生作业 有源码!!!可运行!!!
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
本系列教程笔记详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。若需快速学习Kotlin,建议查看“简洁”系列教程。本期重点介绍了Kotlin与Java的共存方式,包括属性、单例对象、默认参数方法、包方法、扩展方法以及内部类和成员的互操作性。通过这些内容,帮助你在项目中更好地结合使用这两种语言。
50 1
|
2月前
|
Java 开发工具 Android开发
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
Kotlin语法笔记(26) -Kotlin 与 Java 共存(1)
35 2
|
21天前
|
Java
java do while 的语法怎么用?
java do while 的语法怎么用?
35 3
|
2月前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
本系列教程详细讲解了Kotlin语法,适合需要深入了解Kotlin的开发者。对于希望快速学习Kotlin的用户,推荐查看“简洁”系列教程。本文档重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android library开发建议以及在Kotlin和Java之间互相调用的方法。
32 1
|
2月前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
本教程详细讲解Kotlin语法,适合希望深入了解Kotlin的开发者。若需快速入门,建议查阅“简洁”系列教程。本文重点探讨Kotlin与Java共存的高级话题,包括属性访问、空安全、泛型处理、同步机制及SAM转换等,助你在项目中逐步引入Kotlin。
30 1
|
2月前
|
Java 编译器 Android开发
Kotlin语法笔记(28) -Kotlin 与 Java 混编
Kotlin语法笔记(28) -Kotlin 与 Java 混编
33 2
|
2月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
60 3
|
2月前
|
安全 Java 编译器
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
Kotlin语法笔记(27) -Kotlin 与 Java 共存(二)
34 0
|
3月前
|
Java 数据安全/隐私保护
java之基本语法
java之基本语法
35 6
下一篇
DataWorks