2024年java基础语法1-5

java基础语法1-5文章目录 1 第一个 java 程序 2 数据的表示详解 2 1 整数在计算机中的存储原理 2 2 字符在计算机中的存储原理 2 3 图片视频声音的存储原理 2 4 数据的其他表示形式 2 5 不同进制在 Java 程序中的书写格式 3 数据类型详解 4 数据类型转换 4 1 自动类型转换 4 2 强制类型转换 4 运算符 4 1 算术运算符 4 2 自增自减运算符 4 3 赋值运算符 4 4

大家好,我是讯享网,很高兴认识大家。



文章目录

  • 1.第一个java程序
  • 2.数据的表示详解
    • 2.1 整数在计算机中的存储原理
    • 2.2 字符在计算机中的存储原理
    • 2.3 图片视频声音的存储原理
    • 2.4 数据的其他表示形式
    • 2.5 不同进制在Java程序中的书写格式
  • 3.数据类型详解
  • 4.数据类型转换
    • 4.1 自动类型转换
    • 4.2 强制类型转换
  • 4.运算符
    • 4.1 算术运算符
    • 4. 2 自增自减运算符
    • 4.3 赋值运算符
    • 4.4 关系运算符
    • 4.5 逻辑运算符
    • 4.6 三元运算符
    • 4.7 运算优先级
  • 5.分支结构
    • 5.1 if分支
    • 5.2 switch分支
    • 5.3 switch 注意事项
  • 6.循环结构
    • 6.1 for循环——格式和流程
    • 6.2 for循环案例1——求和
    • 6.3 for循环案例2——求奇数和
    • 6.4 while循环——格式和流程
    • 6.5 while循环案例——折纸案例
    • 6.6 do-while循环——格式和流程
    • 6.6 死循环
    • 6.7 循环嵌套
    • 6.8 跳转语句 break 、continue
    • 6.9 循环结构总结
  • 7.生成随机数
    • 7.1 如何产生一个随机数
    • 7.2 猜数字小游戏
  • 8.认识数组
    • 8.1. 什么数组
    • 8.2. 数组的应用场景
  • 9.数组的定义和访问
    • 9.1 数组的静态初始化
    • 9.2 数组的元素访问
    • 9.3 数组的遍历
    • 9.4 数组静态初始化案例
    • 9.5 数组的动态初始化
    • 9.6 数组动态初始化案例
  • 10.数组在计算机中的执行原理
    • 10.1 数组的执行原理,Java程序的执行原理
    • 10.2 多个变量指向同一个数组的问题
  • 11.数组专项练习
    • 11.1 数组求最值
    • 11.2 数组元素反转
    • 11.3 随机排名
  • 12.Debug调试工具
  • 13.方法概述
    • 13.1 方法是什么
    • 13.2 方法的执行流程
    • 13.3 定义方法的注意点
    • 13.4 使用方法的好处
  • 14.方法的其他形式
  • 15.方法使用常见的问题
  • 16.方法在计算机中的执行原理
    • 16.1 有返回值的方法,内存分析
    • 16.2 无返回值的方法,内存分析
  • 17.方法参数的传递机制
    • 17.1 参数传递的基本类型数据
    • 17.2 参数传递的是引用数据类型
  • 18.方法参数传递案例
    • 18.1 方法参数传递案例1
    • 18.2 方法参数传递案例2
  • 19.方法重载
  • 20.return单独使用

本文将为您介绍Java的基础语法,帮助初学者快速入门。我们将从Java的基本结构开始,包括类和对象的定义,以及如何使用Java的关键字和数据类型。然后,我们将深入探讨Java的控制流语句,如if-else、switch-case、循环等,这些是构建任何程序逻辑的基础。

1.第一个java程序

 
讯享网 

这段程序是Java语言编写的一个简单的程序,其目的是在控制台输出一段文本。下面是对这段代码的逐行分析:

  1. :这行代码声明了一个名为的公共类。在Java中,每个应用程序都有一个主类,它包含程序的入口点。
  2. :这是Java程序的主方法,是程序执行的起点。方法是一个公共(public)的静态(static)方法,它不接受任何参数,也不返回任何值。是一个字符串数组,用于接收命令行参数。
  3. :这行代码使用对象的方法来在控制台打印字符串。是Java的标准输出流,通常用于打印信息到控制台。
    整个程序的作用是创建一个类,然后在方法中打印出。这是一个非常基础的Java程序,通常用于教学和作为学习Java的起点。当你运行这个程序时,它会在控制台输出。

2.数据的表示详解

我们知道变量可以用来记录数据的。那么数据在计算机底层是以什么形式表示的呢?下面我们就学习一下数据在计算机中的底层原理。

2.1 整数在计算机中的存储原理

其实任何数据在计算机中都是以二进制表示的。那这里肯定有人问,什么是二进制啊?所谓二进制其实就是一种数据的表示形式,它的特点是逢2进1。
数据的表示形式除了二进制(逢2进1),八进制(逢8进1)、还有十进制(逢10进1)、十六进制(逢10进1)等。
对于二进制绝大多数同学,应该是非常陌生的。 没关系!来,大家跟着我的思路,你就知道二进制是怎么表示数据的了。

讯享网

前面每算一个二进制数据都是采用+1的方式,逢2进1,一个一个算出来的。有没有更快的算出十进制对应二进制的方法呢? 这里学习一种方式:叫做除2取余法。

  • 除2取余法
 

关于变量记录的数据在计算机中如何表示我们就先学习到这里。

  • 计算机的最小存储单位

前面我们已经知道计算机表示数据是用二进制来的, 这里我又要抛出一个问题来了! 我现在想要在计算机中存储一个整数6,转换为二进制是110,那么计算机中只是存110吗三位数字吗? 其实不是的,计算机中最小的存储单位是字节(Byte),一个字节占8位(bit),也就是说即使这个数据不足8位也需要用8位来存储。

2.2 字符在计算机中的存储原理

通过上一节的学习,我们知道了整数是如何在计算机中如何存储的?那么字符在计算机中是如何存储的呢?

其实字符并不是直接存储的,而是把每一个字符编为一个整数,存储的是字符对应整数的二进制形式。美国人搞了一套字符和整数的对应关系表,叫做ASCII编码表。

讯享网

需要注意的是,在ASCII编码表中是不包含汉字的。汉字在其他编码表中,后面我们会单独介绍。关于字符在计算机中的存储学到这就可以了。

2.3 图片视频声音的存储原理

  • 图片的存储

通过上面的学习我们已经知道整数和字符是如何存储的,最终都是要转换为二进制数据的,对吧! 那图片、声音、视频又是如何存储的呢?我们也来了解一下

我们从图片开始,如果你把一张图片不断的放大,你会看到有马赛克的效果。你会发现图片中的每一个细节是由一个一个的小方格组成的,每一个小方格中其实就是一种颜色。任何一种颜色可以使用三原色来表示,简称RGB,其中R(红色),G(绿色),B(蓝色),而RGB中每一种颜色又用一个字节的整数来表示,最小值是0最大值是255

 

你在画图板的颜色编辑器中可以通过指定RGB的值,来调整得到任意的颜色。一张图片实际上就是有很多个小方块的颜色组成的,而每一种颜色又是由RGB三原色的整数表示的,整数最终会转换为二进制进行存储。

  • 视频的存储

实际上视频和图片是一样的,把多张图片连续播放,在一秒钟内连续播放24张以上,由于人眼存在视觉暂留现象,人眼感受不到画面切换的时间间隔,就认为是连续的视频了。

  • 声音的存储

了解过物理的同学肯定知道,声音是以波的形式传播的。我们可以把声波在表示在一个坐标系上,然后在坐标系上取一些点,把这些点的坐标值以二进制的形式存储到计算机中,这就是声音的存储原理。

2.4 数据的其他表示形式

  • 二进制到十进制的转换

前面我们学习了十进制可以转二进制,采用的是除2取余法,那么我们反过来能不能把二进制转换为十进制呢?

这里给大家介绍一种计算方式叫做:8421码

为了便于理解,我们先在看一下十进制怎么转十进制,主要是为了让大家看到演化过程。

 
  • 二进制转八进制

前面我们说计算机中数据都是采用二进制来存储的,但是二进制阅读和编写起来都不太方便。为了便于阅读和书写,又推出了八进制、十六进制。

 
  • 二进制转十六进制
 

2.5 不同进制在Java程序中的书写格式

 

3.数据类型详解

我们学过了变量的定义,在定义变量时我们是要声明数据类型的,这里的数据类型是用来规定变量存储什么类型的数据

比如 这里的就是限制变量只能存储整数; 除了int这种数据类型Java还提供了很多其他的数据类型。Java的数据类型整体上来说分为两大类: 基本数据类型引用数据类型

需要我们注意的是,随便写一个整数或者小数的字面量,它也是有默认数据类型的

 

下面定义各种类型的变量,将这8种基本数据类型都用一下。

 

4.数据类型转换

4.1 自动类型转换

接下来我们来学习类型转换的知识。为什么要学习类型转换呢?因为在我们实际开发中可能存在将某种类型变量的值,赋值给另一个类型的变量;也可能存在多种数据类型的数据一起运算的情况。

在以上情况中,其实都会涉及到类型转换。类型转换的形式总体分为2种,一种是自动类型转换,一种是强制类型转换。 这里先学习自动类型转换

  • 什么是自动类型转换呢?
 
  • 自动类型转换的原理是怎样的?
 

下面我们通过代码演示一下,自动类型转换的各种形式。

 
  • 表达式的自动类型转换

自动类型转换还有另外一种形式,就是表达式的自动类型转换。所谓表达式指的是几个变量或者几个数据一起参与运算的式子。

如果同一个表达式中,出现不同类型的变量或者数据一起运算,这种情况下运算结果是一个什么数据类型呢?需要遵守下面的两条运算规则:

 

接下来我们来看代码演示,自己试一试

 

4.2 强制类型转换

前面我们学习了自动类型转换,我们知道可以将数据类型小的数据可以直接赋值给数据范围大的变量。 那反过来,能不能将数据范围大的数据直接赋值给数据范围小的变量呢? 答案是会报错。

因为数据范围大的数据,赋值给数据范围小的变量,它有可能装不下;就像把一个大桶的水倒入一个小桶中,有溢出的风险。

  • 什么是强制类型转换

但是你强行将范围大的数据,赋值给范围小的变量也是可以的,这里就需要用到强制类型转换。下面是强制类型转换的格式

 

下面是强制类型转换的代码演示

 
  • 强制类型转换的原理

    强制类型转换的原理,其实就是强行把前面几个字节砍掉,但是有数据丢失的风险

到这有关数据类型和数据类型转换的内容,我们就学习完了。大家能够知道什么时候会发生自动类型转换,以及如何进行强制类型转换就可以了。

4.运算符

接下来,讲解一个在开发中用得很多的一块内容,叫做运算符。

大家知道计算机是用来处理数据的,处理数据就少不了对数据的计算,想要对数据进行计算就必须用到运算符。

运算符就是参与运算的符号。Java提供的运算符有很多种,可以分为算术下面几种

  • 基本算术运算符
  • 自增自减运算符
  • 赋值运算符
  • 关系运算符
  • 逻辑运算符
  • 三元运算符

4.1 算术运算符

先从最基本的算术运算符开始学习,算术运算符有 ,其中表示乘法,表示除法,表示取余数

需要我们注意以下几点

 

需要我们注意的是:符号除了用于加法运算,还可以作为连接符。符号与字符串运算的时候是用作连接符的,其结果依然是一个字符串

下面通过代码演示一下各种算术运算符的运算效果

 

4. 2 自增自减运算符

接下来,学习一种比较常用的运算符:和

读作自增,读作自减; 运算规则如下

需要我们注意的是,自增自减只能对变量进行操作,不能操作字面量。具体使用时也分为两种情况,如下:

 

下面通过代码演示一下和的用法

 

4.3 赋值运算符

接下来,我们学习赋值运算符。基本的赋值运算符其实就是号,意思就是把右边的数据赋值给左边的变量。

 

除了基本的赋值运算符,我们这里主要学习一下扩展的赋值运算符。有

我们以为例来看一下它的运算规则,其他的运算符运算同理分析即可

 

下面通过一个首发红包的例子给大家演示一下

 

学完扩展赋值运算符的基本使用之后,接下来我们看一个面试题

 

到这里赋值运算符就学习完了,稍微总结一下

 

4.4 关系运算符

接下来我们学习一个,在实际代码中用得很多,但是又非常简单的运算符,叫关系运算符。关系运算符(也叫比较运算符)。

下图是每一种关系运算符的符号及作用,每一个关系运算符的结果都是false

下面通过代码来家演示一下,各种关系运算符的效果

 

现在我们只需要知道每一种关系运算符的运算效果就行了,关于关系运算符的实际运用需要在后面学习了流程控制语句才能实际用到。

关系运算符在程序中常用于条件判断,根据条件判断的结果是true还是false,来决定后续该执行哪些操作。

4.5 逻辑运算符

学习完关系运算符之后,接下来我们学习一下逻辑运算符。我们来看一下逻辑运算符有哪些。

逻辑运算符是用来将多个条件放在一起运算,最终结果是true或者false

下面我们通过几个案例来演示一下逻辑运算符的使用

 
 

到这里关于逻辑运算符的规则记学习完了,给你一个运算表达式你能分析出结果就行。至于逻辑运算符的实际运用,需要在学习了流程控制语句之后,才能实际用到。

逻辑运算符在程序中常用于组合几个条件判断,根据条件判断的结果是true还是false,来决定后续该执行哪些操作。

4.6 三元运算符

接下来,我们学习今天最后一种运算符,叫做三元运算符。

先认识一下三元运算符的格式:

 

三元运算的执行流程:首先计算关系表达式的值,如果关系表达式的值为true,则返回值1;如果关系表达式的值为false, 则返回值2;

判断学生的成绩是否>=60,如果为true,就考试通过;如果为false,就成绩不合格

接下来通过代码来演示一下,目的是让大家掌握三元运算符的格式和执行流程。

 

4.7 运算优先级

最后我们在给大家介绍一下运算符的优先级,&&运算比||运算的优先级高,所以&&和||同时存在时,是先算&&再算||;

比如下面的代码

 

最后给大家说一下,在实际开发中,其实我们很少考虑运算优先级, 因为如果你想让某些数据先运算,其实加就可以了,这样阅读性更高。

 

5.分支结构

5.1 if分支

接下来我们学习分支结构的第一种形式——if分支。

if它的作用,是用于对条件进行判断,判断的结果只可能有两个值true或者false,然后根据条件判断的结果来决定执行那段代码。

接下来我们用一些实际案例给大家演示一下if语句的应用,以及每一种if语句的执行流程。

if 第一种形式

 
 

if 第二种形式

 
 

if 第三种形式

 
 

6. if 使用的几个常见问题

同学们在第一次写if 代码时,经常一不小心会出现一些问题。下面把可能出现的问题给大家看一看,以后大家要避免出现这些问题。

  • 第1个问题:if的()后面不能写分号 否则if下面的语句与if无关
  • 第2个问题:if后面的大括号,如果只有一行代码,大括号可以省略

if 分支小结
关于if分支结构的几种格式,以及各种格式的执行流程,还有if在什么场景下使用我们就讲完了。下面我们总结一下

  • if分支有什么作用?举几个应用场景?
 

5.2 switch分支

学完if 分支之后,接下来我们来学习分支结构的第二种形式——switch分支。

1. switch分支的执行流程

switch 分支的作用,是通过比较值来决定执行哪条分支代码
下面通过案例来演示一下

 
 

if 、switch如何选择

学习完switch 分支之后,有同学可能会想,已经了有if分支,为什么还有switch分支呢?感觉上面的案例用if分支也能做啊? 那我们在具体应用场景下如何选择呢?

如果单从功能上来讲,if 分支 的功能是更加强大的,switch分支能做的事情if 分支都能做。但是具体用哪一种分支形式,也是有一些使用原则的

 

5.3 switch 注意事项

各位同学,接下来我们学习swtich的注意事项。同学们掌握这些注意事项之后,就可以避免入坑了,也可以应对一些面试笔试题。

 

6.循环结构

接下来我们学习循环结构。循环结构可以控制一段代码重复执行。循环结构有for循环、while循环、do-while循环。

6.1 for循环——格式和流程

这里首先来学习for循环,同学们重点掌握for循环的书写格式,并理解for循环的执行流程。

1. for循环的格式和流程

为了让大家更直观的理解for循环的执行流程,我们直接来看具体的案例代码。

比如:我们想要在控制台打印输出3个HelloWorld

 

通过上面的案例演示,最后我们再总结一下for循环的格式

 

for循环有哪些应用场景

通过上面的学习,我们已经知道了for循环怎么编写,并且也知道了它的执行流程。

那么具体在哪些实际场景下使用呢?其实只要是重复做的事情,都可以用循环语句来做

6.2 for循环案例1——求和

学完for循环的格式和流程之后,我们再通过案例来巩固一下。通过这个案例,主要是让同学们掌握一种使用程序来求和的思想。

 
 
 

分析上面代码的执行过程:

 

6.3 for循环案例2——求奇数和

需求:求1~100之间奇数的和

1. 代码写法一

 
 

以上代码的执行流程分析

 

2. 代码写法二

 
 

for循环小结

今天关于for循环,我们学习这几个案例就够了,重点还是掌握for循环的执行流程。在以后,我们还会经常用到for循环,用多了,你就会越来越熟悉了。但是在具体场景下,还是需要具体问题具体分析。


6.4 while循环——格式和流程

接下来我们学习第二种循环结构——while循环。

 

for、while如何选择

学到这里,细心的同学可能会发现while循环和for循环的执行流程是一样的。那他们是不是可以通用呢?

  • 从功能来说:能够用for循环做的,都能用while循环做。
  • 使用规范上来说:知道循环几次,建议使用for;不知道循环几次建议使用while

6.5 while循环案例——折纸案例

各位同学,上一节我们已经学习了while循环的基本使用。下面我们通过一个案例再将while循环的使用巩固一下,主要目的还是想让大家知道什么使用while循环来完成需求。

案例需求如下:

 

我们来分析一下该怎么做

 

按照上面分析的思路把代码写出来

 

6.6 do-while循环——格式和流程

各位同学,接下来我们学习循环结构的第三种格式——do-while循环。

我们把三种循环的区别给同学们总结一下

 

6.6 死循环

同学们在写代码时,可能一不小心把代码写成了死循环,所谓死循环就是停不下来的循环。

接下来,带着同学们认识几种死循环的写法。然后再说一下死循环有什么用。

 

死循环有什么应用场景呢?

最典型的是可以用死循环来做服务器程序, 比如百度的服务器程序就是一直在执行的,你随时都可以通过浏览器去访问百度。如果哪一天百度的服务器停止了运行,有就意味着所有的人都永不了百度提供的服务了。

对于这样的应用我们目前了解一下就可以了。对于目前来说我们只要知道代码格式该怎么写,能达到什么效果就行。

6.7 循环嵌套

各位同学,接下来我们学习一种在实际工作中很常用的循环形式——循环嵌套。

所谓循环嵌套,就是一个循环中又包含另一个循环(就是常说的,套娃_),下面我们通过案例代码演示一下。

循环嵌套执行流程:外部循环每循环一次,内部循环会全部执行完一轮。

 

理解问循环嵌套的执行流程之后,我们再写一个案例来巩固一下

 
 

总结一下,对于嵌套循环重点理解这句话:外部循环每循环一次,内部循环会全部执行完一轮。

6.8 跳转语句 break 、continue

前面我们学习了循环结构,在中间我们还接触了死循环的一些形式,那么我想要在循环过程中提前跳出循环怎么做呢?

这里就需要用到跳转语句,需要用到breakcontinue两个关键字。我们先来认识一下这两个关键字的作用

  • break作用:跳出并结束当前所在循环的执行
  • continue作用:结束本次循环,进入下一次循环

案例1:演示break的使用,提前终止循环的执行

 

案例2:演示continue的使用,结束循环中的一次,继续下一次循环

 

6.9 循环结构总结

到这里关于循环结构的所有内容就都已经学习完了,我们再把几种循环结构在什么场景下使用,再总结一下。

 

7.生成随机数

接下来我们再学习一个新的知识——生成随机数。

生成随机数其实在很多场景下都很实用,比如,在课堂上可以写一个随机点名器点同学起来回答问题;再比如公司年会可以随机抽奖等。

7.1 如何产生一个随机数

生成随机数的功能,其实 Java已经给我们提供了,在JDK中提供了一个类叫做Random,我们只需要调用Random这个类提供的功能就可以了。

 

7.2 猜数字小游戏

各位同学,接下来我们通过一个案例把前面的流程控制、跳转语句、随机数综合运用一下;

如果能把这个案例写出来,说明你对今天的知识点掌握得挺好了。

 
 

8.认识数组

先来认识一下什么数组

8.1. 什么数组

数组就是一个容器,用来存一批同种类型的数据的。

比如:想要存储 20,10,80,60,90 这些数据。 我们可以把代码写成这样

 

比如:想要存储 “牛二“,“西门“,“全蛋“ 这些数据。我们可以把代码写成这样

 

8.2. 数组的应用场景

有变量,为什么还要有数组呢? 比如,我们要做一个点名器
遇到批量数据的存储和操作时,数组比变量更适合

9.数组的定义和访问

我们已经知道数组是用来干什么的。那么如何使用Java语言写一个数组呢?这里就需要学习一下数组的初始化格式。

数组有两种初始化的方式,一种是静态初始化、一种是动态初始化。我们先用静态初始化来学习数组的操作。

9.1 数组的静态初始化

所谓静态初始化指的是:在定义数组时直接给数组中的数据赋值。

1. 静态初始化标准格式:

 

按照格式定义int类型、double类型数组

 

2. 静态初始化简化格式

Java语言的设计者为了简化定义数组的写法,还为静态初始化提供了一种简化写法

 

使用简化格式定义int类型、double类型数组

 

3. 注意哟!!

  • 定义数组时, 也可写成
 

4. 数组在计算机中的基本原理

我们知道数组是怎么定义的之后,那么接下来看一下数组在计算机中的基本原理。

我们以这句话为例,看一下这句话到底在计算机中做了那些事情。

  • 首先,左边 表示定义了一个数组类型的变量,变量名叫ages
  • 其次,右边表示创建一个数组对象,你完全可以把它理解成一个能装数据的东西。这个对象在内存中会有一个地址值,每次创建一个数组对象都会有不用的地址值。
  • 然后,把右边的地址值赋值给左边的ages变量
  • 所以,ages变量就可以通过地址值,找到数组这个东西。

9.2 数组的元素访问

各位同学,通过刚才的学习,我们知道数组是用来存储数据的。那么数组中存储的数据又如何访问呢?这里所说的访问,意思就是获取中数组中数据的值、或者给数组中的数据赋值。

这里先给大家统一几个概念,数组中存储的数据我们叫做元素;而且数组中的每一个元素都有一个编号与之对应,我们把这个编号叫做索引,这个索引是从0依次递增的整数。

要想访问数组中的元素,格式如下

 

接下来用代码来演示一下

 

除了访问数组中的元素,我们可以获取数组中元素的个数,后面我们统称为数组的长度。

 

9.3 数组的遍历

接下来我们学习一个对数组最最最常见的操作——数组遍历。所谓遍历意思就是将数组中的元素一个一个的取出来。

我们刚才学习了数组中元素的访问,访问元素必须用到索引,如下列代码。

 

但是,如果数组中有很多很多元素,索引靠自己一个一个数肯定是不行的!我们可以使用for循环从0开始一直遍历到长度-1的位置,就可以获取所有的索引了。

当你获取到每一个索引,那么每一个元素不就获取到了吗?上代码吧

 

9.4 数组静态初始化案例

学习完数组的静态初始化之后,接下来我们做一个练习题来巩固一下。

 

按照分析的思路来写代码

 

9.5 数组的动态初始化

各位同学,刚才我们初始化数组时,都是直接将元素写出来。但是还有另一个初始化数组的方式叫 动态初始化java基础语法1-5

动态初始化不需要我们写出具体的元素,而是指定元素类型和长度就行。格式如下

 

下面是动态初始化数组的原理图。我们发现 其实就是一个变量,它记录了数组对象的地址值,而且数组中的元素默认值是0。

注意:

使用动态初始化定义数组时,根据元素类型不同,默认值也有所不同。

关于数组动态初始化的格式和原理,咱们就先学习到这里。

9.6 数组动态初始化案例

各位同学,接下来我们做一个数组动态初始化的案例。

 

代码如下

 

10.数组在计算机中的执行原理

好的各位同学,在前面我们已经学习了数组的基本使用,也理解了数组的基本原理。由于数组是一个容器,变量也是一个容器,在理解他们执行原理的时候,有些同学就容易搞混,现在我把他们放在一起带着大家回顾一下他们的会执行原理,顺便带着大家详细理解一下Java程序的执行的内存原理。

10.1 数组的执行原理,Java程序的执行原理

我们以下面的代码,来讲解变量、数组的执原理。

 

前面我们给大家讲过,程序是在内存中执行的。实际上Java程序是把编译后的字节码加载到Java虚拟机中执行的。

Java为了便于虚拟机执行Java程序,将虚拟机的内存划分为 方法区、栈、堆、本地方法栈、寄存器 这5块区域。同学们需要重点关注的是 方法区、栈、堆

下面把每一个块内存区域作用介绍一下,我们大致只需要知道每一部分存储什么内容就行。

  • 方法区:字节码文件先加载到这里
  • :方法运行时所进入的内存区域,由于变量在方法中,所以变量也在这一块区域中
  • :存储new出来的东西,并分配地址。由于数组是new 出来的,所以数组也在这块区域。

总结一下与

  • a是一个变量,在栈内存中,a变量中存储的数据就是10这个值。
  • arr也是一个变量,在栈中,存储的是数组对象在堆内存中的地址值
 

10.2 多个变量指向同一个数组的问题

各位同学,我们了解了数组在内存中的执行原理。我们知道数组类型的变量,指向的是堆内存中数组对象的地址。但是在实际开发中可能存在一种特殊情况,就是多个变量指向同一个数组对象的形式。

讲解这个知识点的目的,是让同学们注意多个变量指向同一个数组对象存在什么问题?

我们先看一段代码

 

总结一下:

  • 两个变量指向同一个数组时,两个变量记录的是同一个地址值。
  • 当一个变量修改数组中的元素时,另一个变量去访问数组中的元素,元素已经被修改过了。

到这里有关数组的基本操作,和内存原理我们就全部学习完了。

11.数组专项练习

接下来我们做一些专项练习题,把数组的常见操作练习一下。在学习这个案例时,重点掌握数组求最值的思路,代码只是用来表达你的思路的。

11.1 数组求最值

 

我们先看一下选美比赛,是怎么选出颜值最高的人的。然后再以此思路,来写代码找出数组中元素的最大值。

 
 

总结一下:

通过这个案例,我们主要掌握求最值的思路,以后不管遇到求最大值还是最小值,编程思路都是一样的,不同的可能是数据不同。

11.2 数组元素反转

 

数组元素反转的核心,其实是数组中两个数据的交换。我们可以认为两个数据分别存储在两个水杯中。想要交换两个水杯中的东西,我们得借助第三个水杯

数组中元素交换,就是用的借用第三方变量的思想。 我们把数组中的每一个元素当做一个水杯,然后索引控制哪两个元素互换位置。

怎么样,才能达到元素反转的效果呢?我们只需将第一个和最后一个元素互换、第二个和倒数第二个互换、依次内推… 如下图所示

怎么样写代码,才能达到上面的效果呢?我们继续分析

 

具体代码如下

 

总结一下:

通过上面的案例,需要我们掌握元素互换位置的编程思路;以后遇到数据互换问题,都这样做。

11.3 随机排名

各位同学,通过数组元素反转的案例,我们学会了如何对两个数据进行交换。接下来,我们再学习随机排名案例,将数据交换的思路再巩固一下。

先来看一下需求

 

分析一下随机排名的思路

 

如下图所示,每次遍历到一个元素,随机将当前位置元素和随机索引元素换位置。

代码如下

 

到这有关数组的常见练习题我们就讲完了,待会我们在给同学们讲一个开发中用得比较多的工具叫做Debug调试。

12.Debug调试工具

各位同学,为了让大家更好的理解代码的执行流程,这里给大家讲一个在开发中非常重要的工具——叫做Debug调试。

通过Debug调试,我们可以查看代码的执行流程。当你代码中有Bug但是又发现不了的时候,你就可以用Debug调试工具,查看执行流程,逐步分析是哪一行出现了问题。

Debug调试工具的使用步骤如下:

 

13.方法概述

13.1 方法是什么

方法是一种语法结构,它可以把一段代码封装成一个功能,以便重复调用。这句话什么意思呢?意思是,把一段功能代码围在一起,别人都可以来调用它。

我们看一个需求,比如现在张工、李工两个人都需要求两个整数的和。不使用方法,代码如下。

 

阅读上面的代码,我们不难发现。两次求和的代码中,除了求和的数据不一样,代码的组织结构完全一样。

像这种做相同事情的代码,就可以用方法进行封装。需要用到这段代码功能时,让别人调用方法就行。代码如下

 

13.2 方法的执行流程

当调用一个方法时,执行流程,按照下图中标注的序号执行。

​ ① 通过sum方法名找到sum方法

​ ② 把10传递给方法中的参数a

​ ③ 把20传递给方法中的参数b;

​ ④ 执行方法中的代码,此时; 相当于 ; c的值为30

​ 的含义是,把c的结果返回给调用处。 也就是调用sum方法的结果为30,

学习完方法的执行流程之后,下面有几个注意事项需要我们写代码时注意一下。

13.3 定义方法的注意点

  1. 方法的修饰符:暂时都使用public static 修饰。(目前看做是固定写法,后面是可以改动的)
  2. 方法申明了具体的返回值类型,内部必须使用return返回对应类型的数据。
  3. 形参列表可以有多个,甚至可以没有; 如果有多个形参,多个形参必须用“,”隔开,且不能给初始化值。

13.4 使用方法的好处

最好,我们总结一下,用方法有什么好处,可以归纳为下面2点:

  1. 提高了代码的复用性,提高了开发效率。
  2. 让程序的逻辑更清晰。

如下图所示:写好一个方法之后,每一个人都可以直接调用,而不用再重复写相同的代码。所以是提高了代码的复用性,不用写重复代码,自然也提高了开发效率。

那么让程序的逻辑更加清晰,是如何体现的呢? 比如,我们后期会用所学习的技术,做一个ATM系统,ATM系统中有查看账户、存钱、取钱、修改密码等功能,到时候我们可以把每一个功能都写成一个方法。如下图所示,这样程序的逻辑就更加清晰了。

好了,关于方法是什么,以及方法的基本使用就学习到这里。

总结一下

 

14.方法的其他形式

各位同学,刚才我们学习了定义完整格式的方法。但是实际开发中,需要按照方法解决的实际业务需求,设计出合理的方法形式来解决问题。

设计一个合理的方法的原则如下:

  • 如果方法不需要返回数据,返回值类型必须申明成void(无返回值申明), 此时方法内部不可以使用return返回数据。
  • 方法如果不需要接收外部传递进来的数据,则不需要定义形参,且调用方法时也不可以传数据给方法。
  • 没有参数,且没有返回值类型(void)的方法,称为值无参数、无返回值方法。此时调用方法时不能传递数据给方法。

接下来我们看几个案例代码,练习根据实际需求定义出合理的方法

需求1:写一个方法,打印3个"Hello World"

分析:需求已经非常明确,打印的是3个HelloWorld,在方法中直接循环3次就可以完成需求。不需要外部给方法传递数据,所以不需要参数。

需求2:写一个方法,打印若干个"Hello World",具体多少个,有调用者指定

分析:需求不明确打印HelloWorld的个数,而是需要调用者指定。也就是说,调用者调用方法时需要给方法传递打印HelloWorld的个数。那么定义方法时,就需要写一个参数,来接收调用者传递过来的个数。

15.方法使用常见的问题

各位同学,自己第一次写方法时,或多或少会可能会出现一些问题。下面把使用方法时,常见的问题整理一下。

目的是让同学们,以后写方法时避免出现这些问题。一旦出现这些问题,要知道是什么原因。

 

16.方法在计算机中的执行原理

各位同学,刚才我们已经写了好几个方法并成功调用了。但是不知道同学们奇不奇怪一个问题。方法在计算机的内存中到底是怎么干的呢?

为了让大家更加深刻的理解方法的执行过程,接下来,给同学们讲一下方法在计算机中的执行原理。理解方法的执行原理,对我们以后知识的学习也是有帮助的。

我们知道Java程序的运行,都是在内存中执行的,而内存区域又分为栈、堆和方法区。那Java的方法是在哪个内存区域中执行呢?

答案是栈内存。 每次调用方法,方法都会进栈执行;执行完后,又会弹栈出去。

方法进栈和弹栈的过程,就类似于手***夹,上子弹和击发子弹的过程。最后上的一颗子弹是,第一个打出来的;第一颗上的子弹,是最后一个打出来的。

假设在main方法中依次调用A方法、B方法、C方法,在内存中的执行流程如下:

  • 每次调用方法,方法都会从栈顶压栈执行没执行
  • 每个方法执行完后,会从栈顶弹栈出去

16.1 有返回值的方法,内存分析

下面我们分析一下,求两个整数和的代码,在内存中的执行原理。

 

16.2 无返回值的方法,内存分析

刚才我们分析的是有有参数有返回值的方法内存原理。下面再分析一个无返回值、无参数的内存原理。

 

总结一下

 

17.方法参数的传递机制

各位同学,刚才我们学习了方法运行的原理,相信大家对方法的运行过程有更加深刻的认识。但是方法参数的传递过程还需要,还需要进一步学习一下。

因为我们刚才演示的一些方法中传递的参数都是基本类型,实际上参数还可以是传递引用类型。接下来,学习一下当参数是基本类型时、和参数是引用类型时的区别。

先记住一个结论:Java的参数传递机制都是:值传递

所谓值传递:指的是在传递实参给方法的形参的时候,传递的是实参变量中存储的值的副本。 同学们肯定想知道,形参是什么?实参又是什么呢?

17.1 参数传递的基本类型数据

接下来,看一下方法参数传递是基本类型数据时,内存中是怎么执行的。

我们把参数传递的结论再复习一下:Java的参数传递机制都是:值传递,传递的是实参存储的值的副本。

17.2 参数传递的是引用数据类型

接下来,看一下方法的参数是引用类型的数据时,内存中是怎么执行的。

我们发现调用change方法时参数是引用类型,实际上也是值传递,只不过参数传递存储的地址值。此时change方法和main方法中两个方法中各自有一个变量arrs,这两个变量记录的是同一个地址值4c,change方法把数组中的元素改了,main方法在访问时,元素已经被修改了。

总结一下:

 

18.方法参数传递案例

18.1 方法参数传递案例1

 

代码如下

 

18.2 方法参数传递案例2

 

代码如下

 

19.方法重载

接下来,我们学习一个开发中很重要的一个方法的形式——叫方法重载。

所谓方法重载指的是:一个类中,出现多个相同的方法名,但是它们的形参列表是不同的,那么这些方法就称为方法重载了。

我们在这里要能够认识,哪些是重载的方法。

下面案例中有多个test方法,但是参数列表都不一样,它们都是重载的方法。调用时只需要通过参数来区分即可。

 

我们认识了方法重载,那么方法重载有哪些应用场景呢?

一般在开发中,我们经常需要为处理一类业务,提供多种解决方案,此时用方法重载来设计是很专业的。

比如,我们现在看一个案例

 

上面的几个需求中,不管以什么样的方式发武器,其实最终的目的都是发武器。

所以我们可以设计几个名称相同的方法,这样调用者调用起来就不用记那么多名字了

代码如下:

 

总结一下:

 

20.return单独使用

各位同学,关于方法的定义,我们还剩下最后一种特殊用法,就是在方法中单独使用return语句,可以用来提前结束方法的执行。

如,下面的chu方法中,当除数为0时,就提前结束方法的执行。

小讯
上一篇 2024-12-31 17:42
下一篇 2024-12-28 20:05

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/1796.html