复习回顾
1、数组的特点
长度固定, 存储的数据类型一致
2、数组的两种初始化格式?
动态初始化
int[] arr = new int[5];
静态初始化
int[] arr = new int[]{1,2,3};
int[] arr = {1,2,3,4};
4、数组索引的特点
索引 : 元素的编号,从0开始, 到数组长度减1
5、如何访问数组元素?如何获取数组长度?
数组名[索引]
数组名.length
6、数组元素的默认初始化值?
整数 0
浮点数 0.0
布尔类型 false
字符型 空字符
引用类型 null
7、数组遍历
int[] arr = {1,2,3,4};
for(int i=0; i<arr.length; i++){
System.out.println(arr[i]);
}
1 方法的概述
目标:理解什么是方法以及方法的作用
什么是方法
方法是将具有独立功能的代码组成一个整体,使其成为具有特殊功能的代码块。
方法的两个注意
- 方法必须先定义才能使用。(方法定义)
- 方法定义后不会自动运行,需要手动调用才能执行方法的功能。(方法调用)
2 方法的定义和调用
2.1 方法的定义格式1
定义格式
public static void 方法名(){
方法体代码; //需要在方法内完成的代码
}
调用格式:
通过方法名调用
方法名();
示例代码:
/*
需求:
1. 定义一个方法,方法名为: printHelloWorld
2. 在方法中使用循环打印5次hello world.
3. 在main方法中调用执行 printHelloWorld 方法.
*/
public class MethodDemo {
}
2.2 方法调用图解(了解)
[外链图片转存失败(img-DTDYVcYZ-1563073256636)(/assets/1559404209171.png)]
方法在栈中的调用执行过程:
结论:
1、栈是方法运行的内存区域。
2、先调用的方法先入栈,后调用的方法后入栈,后入栈的方法先执行完毕,并在栈内存中消失。
3、main方法是最先开始执行,最晚从内存中消失的。
练习案例
/*
【方法练习】设计方法printMax打印两个数的较大值
*/
public class MethodDemo {
public static void main(String[] args) {
//2 在main方法中调用执行
printMax();
}
//1 定义方法打印两个数的较大值
public static void printMax(){
int a = 10;
int b = 20;
if(a > b) {
System.out.println(a);
} else {
System.out.println(b);
}
}
}
2.3 带参数的方法
定义格式:
public static void 方法名( 参数类型1 参数名1, 参数类型2 参数名2, ...){
方法体代码;
}
注意:
方法的参数,可以是一个,也可以是多个,如果是多个参数,中间需要以逗号分隔。
调用格式:
在main方法中,通过方法名调用,并传入对应的参数值
方法名(参数值1, 参数值2);
调用带参方法的注意事项
- 调用带参方法,传入方法括号里的参数,无论个数和类型,都必须和方法定义时的个数和类型匹配。
- 传入方法的参数,可以是变量,也可以是常量。
示例代码:
/*
需求:定义一个方法,该方法接收一个参数,判断该数据是否是偶数
*/
public class MethodDemo {
public static void main(String[] args) {
//1.常量值的调用
isEvenNumber(10);
//变量的调用
int number = 10;
isEvenNumber(number);
}
//定义方法,判断一个数是否是偶数
public static void isEvenNumber(int number) {
if(number%2 == 0) {
System.out.println(true);
} else {
System.out.println(false);
}
}
}
2.4 形参和实参
- 形参,也叫形式参数,指的是定义方法的时候,方法小括号中定义的参数。
- 实参,也叫实际参数,指的是调用方法的时候,传入小括号中的常量或变量。
[外链图片转存失败(img-9M5roJFr-1563073256637)(assets/1556537548082.png)]
2.5 带参数方法练习
示例代码:
/*
需求:
设计一个方法,方法可以接收两个整数,在方法内进行逻辑判断,
打印出两个数中的较大值。
*/
public class MethodTest {
public static void main(String[] args) {
//调用方式1:实际参数为常量
getMax(10,20);
//调用方式2:实际参数为变量
int a = 10;
int b = 20;
getMax(a, b);
}
//定义方法,打印两个整数的较大值
public static void getMax(int a,int b) {
if(a > b) {
System.out.println(a);
} else {
System.out.println(b);
}
}
}
练习案例:
/*
需求1:
定义printHelloWorld方法,接收一个整数n,在控制台打印n次HelloWorld。
*/
public class MethodDemo2 {
//定义printHelloWorld方法,接收一个整数n,在控制台打印n次HelloWorld。
public static void printHelloWorld(int n){
// 在控制台打印n次HelloWorld。
for (int i = 0; i < n ; i++) {
System.out.println("hello world");
}
}
public static void main(String[] args) {
// 方法调用
printHelloWorld(10);
System.out.println("----------------");
printHelloWorld(2);
}
}
/*
需求2:
定义sum方法,接收两个整数,计算并打印两个整数的和。
*/
思考:sum方法计算出的两个整数的和,能否返回给调用者继续使用?
2.6 带返回值的方法
定义格式:
public static 数据类型 方法名(参数列表){
方法体代码;
return 数据值;
}
1) 格式要求
有返回值类型,就必须要有return语句。
返回值必须和返回值类型相匹配。
2) return语句的作用?
return语句用于将方法的运算结果返回给调用者。
return语句一旦执行,方法的调用就结束了。
return语句后面不能直接跟其他代码
3) 有返回值的方法是否一定要接收返回结果?
举例:
超市买东西,付钱后给的小票,可以拿也可以不要。如果把付钱的功能定义成一个方法,付钱后给的小票可以理解为方法执行后返回的数据,返回的数据可以接收也可以不接收(相当于小票可以拿走也可以不要)。
结论:
调用有返回值的方法时,方法的返回值可以接收也可以不接收,根据实际需要确定。如果不接收,该返回值就会丢失。大部分情况下,需要接收返回结果的。
4) 有返回值的方法调用方式
1. 直接调用:该方式会丢失返回值数据。
方法名(参数值);
2. 输出调用:在输出语句中调用,直接使用结果。
System.out.println( 方法名(参数值) );
3. 赋值调用:调用方法,并定义变量接收返回值。 (使用最多的方式)
数据类型 变量名 = 方法名(参数值);
示例代码:
//定义方法求两个数的较大值,并返回较大的数
public class MethodDemo {
public static void main(String[] args) {
//赋值调用
int result = getMax(10,20);
System.out.println(result);
//输出调用
System.out.println(getMax(10,20));
}
//定义一个方法,用于获取两个数字中的较大数
public static int getMax(int a, int b) {
//使用if判断并返回a和b中较大的
if(a > b) {
return a;
} else {
return b;
}
}
}
有返回值的方法练习:
/*
需求:
1. 定义求和方法,方法名为sum
2. 方法中接收两个int类型整数.
3. 计算并返回两个整数的和.
*/
public class MethodDemo {
/*
两个明确:
明确参数:两个整数变量
明确返回值:有返回值,类型是int
*/
public static int sum(int a, int b){
return a + b;
}
public static void main(String[] args) {
//有返回值的方法调用
// 1、直接调用
sum(10,20); //丢失方法了返回值
// 2、输出调用
// 直接将返回结果在控制台输出
System.out.println( sum(10,20) );
// 3、赋值调用(最常用的方式)
int result = sum(10,20);
//赋值调用的好处:拿到返回值后可以同时做多种操作
//操作1:打印结果
System.out.println(result);
//操作2:计算平均值
System.out.println( result/2 );
}
}
2.6 方法使用注意事项
1) 方法与方法之间是平级关系,不允许嵌套定义。
2) 方法有明确返回值类型时,必须要有return语句返回对应的数据。
3) 返回值类型为void,则代表无返回值,可以省略return语句,也可以单独使用return关键字,
用于结束方法,但是return后面不能跟任何数值。
4) 方法有形参时,调用时必须传递实参,传递的实参个数和类型必须和形参匹配。
5) return语句后面不能直接跟其他代码。
案例代码:
//定义方法,求两个整数的较大值,并返回较大的值。
public class MethodDemo2 {
public static void main(String[] args) {
}
// 定义方法,求两个整数的较大值,并返回较大的值。
// 该方法会编译报错,因为编译器认为只要是if语句,就有可能不执行,方法就有可能没有return语句。
public static int getMax(int a, int b){
if(a>b){
return a;
}
if(a<=b){
return b;
}
}
}
2.7 方法的通用格式
public static 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2, ...){
方法体代码;
return 返回值;
}
格式说明:
**public static:**public和static都是关键字,具有特殊的含义。(先这样写着,后续讲解)
**返回值类型:**方法有返回值时写返回值类型(基本数据类型、引用数据类型),没有返回值时写void。
**方法名:**用于方法调用时使用。
**( ):**括号里面写参数列表,多个参数使用逗号隔开,没有参数时直接写 ( ) 即可。
**参数类型:**限定传入方法的参数的数据类型。(基本数据类型、引用数据类型)
**参数名:**用于接收传入方法的数据。
**{ }:**大括号和里面的代码称为方法体。
**return:**方法有返回值时需要使用return关键字,返回对应的类型的数据。
没有返回值(void)时不用写return语句。
定义方法的两个明确:
- 明确返回值类型:确定方法是否需要返回值,以及返回值的类型。
- 明确参数:明确参数的类型和个数。
调用方法注意:
- void类型的方法,直接调用即可。
- 非void类型的方法,推荐使用变量接收调用。
- 方法有参数时,调用时需要传参。
//【练习】
//需求:定义方法,方法中接收一个整型数组,对数组所有元素累加求和,并返回求和的结果。
public class MethodDemo7 {
/*
方法定义的两个明确:
明确返回值类型 : int类型
明确参数 : 有参数, 参数类型为数组
*/
public static int getSum(int[] arr){
//对数组所有元素累加求和
int sum = 0;
for(int i=0; i<arr.length; i++){
sum+=arr[i];
}
return sum;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
int he = getSum(arr);
System.out.println("数组求和的结果为:"+he);
}
}
上午回顾
方法的概述:
具有特定功能的代码块
无参数无返回值的方法
定义格式:
public static void 方法名(){
//方法体;
}
调用格式:
直接调用: 方法名();
有参数无返回值的方法
定义格式:
public static void 方法名(数据类型 变量名1, 数据类型 变量名2... ){
//方法体;
}
调用格式:
方法名(参数值1, 参数值2...);
要求: 参数个数和类型要与定义时的参数列表一致
形式参数: 简称形参,方法定义的时候的参数 ,格式为:数据类型 变量名1
实际参数: 简称实参,方法调用的时候的参数 , 可以是常量值/变量名
有返回值有参数的方法
定义格式:
public static 数据类型 方法名(数据类型 变量名1, 数据类型 变量名2... ){
//方法体;
return 数据值/变量名;
}
调用格式:
单独调用 : 方法名(参数值1, 参数值2...);
会丢失返回值.
输出调用: System.out.println( 方法名(参数值1, 参数值2...) );
赋值调用: 数据类型 变量名 = 方法名(参数值1, 参数值2...); //使用最多的方式, 也是推荐使用的方式
3 方法重载
3.1 什么是方法重载
同一个类中,出现了多个同名的方法,叫做方法重载。
3.2 构成方法重载的条件(重点)
1. 多个方法在同一个类中。
2. 多个方法名称相同。
3. 多个方法的参数列表不同(个数或者类型不同)。
注意:
方法重载与返回值和参数名称无关。
简单总结:
同一类中,方法名称相同,参数列表不同,即构成方法重载。
3.3 方法重载的作用
方便程序员对参数不同,但是功能相同或相似的方法进行统一的命名和调用。
3.4 调用重载的方法
调用时,虚拟机会根据参数列表的不同来区分调用对应的重载方法。
正确范例:
/*
方法名相同,参数类型不同,构成方法重载
*/
public class MethodDemo {
public static void fn(int a) {
//方法体
}
public static int fn(double a) {
//方法体
}
}
/*
同一类中,方法名fn相同,参数列表不同(个数不同),构成方法重载
*/
public class MethodDemo {
public static float fn(int a) {
//方法体
}
public static int fn(int a , int b) {
//方法体
}
}
错误范例:
/*
参数列表相同,无法构成重载
*/
public class MethodDemo {
public static void fn(int a) {
//方法体
}
public static int fn(int a) {
//方法体
}
}
/*
方法不在同一个类中,没有重载的概念
*/
public class MethodDemo01 {
public static void fn(int a) {
//方法体
}
}
public class MethodDemo02 {
public static int fn(double a) {
//方法体
}
}
练习案例1:
/*
方法重载的条件:
1. 多个方法在同一个类中。
2. 多个方法名称相同。
3. 多个方法的参数列表不同(个数或者类型不同)。
*/
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. 定义sum方法返回两个int整数的和
public static int sum(int a, int b) {
return a + b;
}
//2. 定义重载的sum方法返回两个double浮点数的和
public static double sum(double a, double b) {
return a + b;
}
//3. 定义重载的sum方法返回三个整数的和
public static int sum(int a, int b, int c) {
return a + b + c;
}
}
练习案例2:
/*
* 定义重载的方法 分别比较 两个byte数、两个short数、两个int数、两个long数 是否相等
*/
public class MethodOverLoad {
// 方法1:判断两个byte数是否相等
public static boolean compare(byte a, byte b) {
System.out.println("byte");
return a == b;
}
// 方法2:判断两个short数是否相等
public static boolean compare(short a, short b) {
System.out.println("short");
return a == b;
}
// 方法3:判断两个int数是否相等
public static boolean compare(int a, int b) {
System.out.println("int");
return a == b;
}
// 方法4:判断两个long数是否相等
public static boolean compare(long a, long b) {
System.out.println("long");
return a == b;
}
//测试方法重载的调用
public static void main(String[] args) {
//输出调用
System.out.println( compare(10, 20) );//整数默认是int类型,所以会调用int参数的重载方法
System.out.println( compare((byte)10, (byte)20) ); //byte
System.out.println( compare((short)10, (short)20) ); //short
System.out.println( compare(10L, 20L) );//long
}
}
【多选题】判断下面属于方法重载的是?( DE )
A:
int fun(int a, float b){...}
float fun(int a, float b){...}
//参数列表相同, 不符合重载
B:
float fun(int a, float b){...}
float fun(int x, float y){...}
//参数列表相同, 不符合重载
C:
float fun1(int a, float b){...}
float fun2(int a, float b){...}
//方法名不同, 不符合重载
D:
float fun(float a){...}
float fun(float a, float b){...}
E:
float fun(int a, float b){...}
float fun(float b, int a){...}
//构成重载 ,但是没有意义
说明:
/*
* 以下两个fun方法也构成了方法重载, 因为对应位置的参数的类型并不相同
* 但是这种重载是没有意义的,因为最后的结果都是求一个整数和一个小数的和.
*/
public static float fun(int a, float b){
return a+b;
}
public static float fun(float b, int a){
return a+b;
}
4 方法参数传递
5.1 方法参数传递基本类型
结论:
方法参数为基本数据类型时,参数为值传递,形式参数的改变不影响实际参数
代码:
/*
参数传递为基本数据类型
*/
public class MethodDemo4 {
public static void main(String[] args) {
int num = 5;
add(num);
System.out.println(num);
}
//方法形参为基本数据类型
public static void add(int num){
num+=10; //num = 15;
}
}
图解:
[外链图片转存失败(img-qEioWywc-1563073256640)(assets/1559479663751.png)]
//分析以下程序的输出结果?
public static void main(String[] args) {
int a = 10;
int b =20;
System.out.println(a); //10
System.out.println(b); //20
sum(a,b);
System.out.println(a); //10
System.out.println(b); //20
}
public static void sum(int a, int b){
a = b ; //a=20
b = a+b; //b=40
System.out.println(a); //20
System.out.println(b); //40
}
5.2 方法参数传递引用类型
什么是引用类型数据?
在堆内存中创建,并产生了一个地址值的数据。(数组、对象,接口)
结论:
方法参数为引用数据类型时,参数为地址传递,形式参数的改变会影响实际参数。
代码:
/*
参数传递为引用类型
*/
public class MethodDemo5 {
public static void main(String[] args) {
int[] arr = {10,20,30};
System.out.println("调用前:"+arr[0]); //10
change(arr);
System.out.println("调用后:"+arr[0]); //100
}
//方法形参为引用类型
public static void change(int[] arr) {
arr[0] = 100;
}
}
图解:
[外链图片转存失败(img-iTXvtxnx-1563073256641)(assets/1559481608759.png)]
//需求:设计一个方法用于获取数组中元素的最大值,并将得到的最大值返回。
总结
方法重载:
条件: 同一个类中,方法名相同, 参数列表不同(类型或者个数不同)
作用: 方便方法的定义和调用
方法的参数传递:
参数为基本类型时的传递:
值传递, 形参的改变不会影响实参.
参数为引用类型时的传递:
地址传递, 形参的改变直接影响实参.
方法的通用格式:
public static 数据类型 方法名(数据类型 变量名, ....){
方法体;
return 数据值; //如果返回类型为void, 此处省略
}
方法的注意事项:
定义位置: 在类中,其他方法外.(不能嵌套定义)
方法要先定义,再调用
调用时,实参的类型和个数要与形参完全一致.
如果方法有返回值, 一般会定义变量接收方法的返回结果
数据类型 变量名 = 方法名(实参);
] arr = {10,20,30};
System.out.println(“调用前:”+arr[0]); //10
change(arr);
System.out.println("调用后:"+arr[0]); //100
}
//方法形参为引用类型
public static void change(int[] arr) {
arr[0] = 100;
}
}
图解:
[外链图片转存中...(img-iTXvtxnx-1563073256641)]
```java
//需求:设计一个方法用于获取数组中元素的最大值,并将得到的最大值返回。
总结
方法重载:
条件: 同一个类中,方法名相同, 参数列表不同(类型或者个数不同)
作用: 方便方法的定义和调用
方法的参数传递:
参数为基本类型时的传递:
值传递, 形参的改变不会影响实参.
参数为引用类型时的传递:
地址传递, 形参的改变直接影响实参.
方法的通用格式:
public static 数据类型 方法名(数据类型 变量名, ....){
方法体;
return 数据值; //如果返回类型为void, 此处省略
}
方法的注意事项:
定义位置: 在类中,其他方法外.(不能嵌套定义)
方法要先定义,再调用
调用时,实参的类型和个数要与形参完全一致.
如果方法有返回值, 一般会定义变量接收方法的返回结果
数据类型 变量名 = 方法名(实参);