目录
案例2:比较两个int类型的数组是否一样,返回true或false
何为方法
System.out.println()
类.对象.方法()
Java方法是语句的集合,它们在一起执行一个功能。
1.方法是解决一类问题的步骤的有序组合。
2.方法包含于类或对象中。
3.方法在程序中被创建,在其他地方引用。
设计方法的原则:
方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性。即一个方法只完成一个功能,这样利于后期的扩展。
package method;
public class Demo01 {
//main方法
//修饰符 返回值 方法
public static void main(String[] args) {
int sum = add(2,3);
System.out.println(sum);
}
//加法
//修饰符 返回值 方法
public static int add(int a, int b){
return a+b;
}
}
方法的定义及调用
方法的定义
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段。
语法:
方法包括一个方法头和一个方法体。
方法的组成部分:
修饰符:可选,告诉编译器如何调用该方法,定义了该方法的访问类型。
返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需操作,但没有返回值。在这种情况下,returnValueType是关键字void。
方法名:是方法的实际名称。遵守驼峰命名法。方法名和参数表共同构成方法签名。
参数类型:参数像是一个占位符,当方法被调用时,传递 值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
形式参数:在方法被调用时用于接收外界输入的数据。
实参:调用方法时实际传给方法的数据。
方法体:方法体包括具体的语句,定义该方法的功能。
注意:
方法使用时的常见问题
方法的调用
调用方法:对象名.方法名( 实参列表)
Java支持两种调用方法的方式,根本方法是否返回值来选择。
当方法返回一个值的时候,方法调用通常被当做一个值。例如:
int larger = max(30, 40);
如果方法返回值是void,方法调用一定是一条语句。
System.out.println("Hello,world!")
package method;
public class Demo02 {
public static void main(String[] args) {
int max = max(10, 20);
System.out.println(max);
}
//比大小
public static int max(int num1,int num2){
int result = 0;
if (num1==num2){
System.out.println("num1==num2");
return 0; //终止方法
}
if (num1>num2){
result = num1;
}else {
result = num2;
}
return result;
}
}
值传递(Java)和引用传递
案例
案例1.计算1-n的和
package array;
public class ArrayDemo13 {
//求1-n的和
public static void main(String[] args) {
int a1 = add(100);
System.out.println(a1);
}
public static int add(int n){
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += i;
}
return sum;
}
}
案例2:判断一个整数是奇数还是偶数
package method;
public class Demo08 {
public static void main(String[] args) {
//判断一个整数是奇数还是偶数
judge(23);
}
public static void judge(int n){
if (n % 2 == 0){
System.out.println(n+"是偶数");
}else {
System.out.println(n+"是奇数");
}
}
}
方法在计算机中的执行
方法在计算机中的执行原理
方法被调用时,是进入到栈内存中运行的
栈:先进后出,用完后会及时清理掉。
保证程序始终会回到main方法中来,也保证了栈中不会因为累计过多方法而导致内存溢出的问题
java的参数传递机制
基本类型的参数传递
引用类型的参数传递
基本类型和引用类型的参数在传递的时候有什么不同?
引用类型参数传递的案例
数组的传递
案例1:打印int类型的数组内容
package method;
public class Demo09 {
public static void main(String[] args) {
//打印int类型的数组内容
int[] arr = {11,22,33,44,55};
printArray(arr);
int[] arr2 = null;
printArray(arr2);
int[] arr3 = {};
printArray(arr3);
}
public static void printArray(int[] arr){
if (arr == null){
System.out.println(arr); //null
return; //跳出当前方法
}
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
// if (i == arr.length-1){
// System.out.print(arr[i]);
// }else{
// System.out.print(arr[i]+", ");
// }
System.out.print(i == arr.length-1 ? arr[i] : arr[i]+", ");
}
System.out.print("]");
}
}
案例2:比较两个int类型的数组是否一样,返回true或false
package method;
public class Demo10 {
public static void main(String[] args) {
//比较两个int类型的数组是否一样,返回true或false
int[] arr1=null;
int[] arr2=null;
System.out.println(equals(arr1,arr2));
System.out.println("=================");
int[] arr3={1,2,3,4};
int[] arr4={1,2,3};
System.out.println(equals(arr3,arr4));
}
public static boolean equals(int[] arr1,int[] arr2){
//1.判断arr1和arr2是否为null
if(arr1 == null && arr2 == null){
return true;
}
//2.判断arr1是null,或者arr2是null
if (arr1 == null || arr2 == null){
return false;
}
//3.判断两个数组的长度是否一样,如果不一样则直接返回false
if (arr1.length != arr2.length){
return false;
}
//4.两个数组的长度一样,接着比较他们的内容是否一样
for (int i = 0; i < arr1.length; i++) {
//判断当前位置两个数组的元素是否一样,不一样直接返回false
if (arr1[i] != arr2[i]){
return false;
}
}return true;
}
}
方法重载
重载就是在一个类中,有相同的函数名称,但形参不同的函数。
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
方法的重载的规则:
1.方法名称必须相同。
2.参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)。
3.方法的返回类型可以相同也可以不相同。
4.仅仅返回类型不同不足以成为方法的重载。
注意:
案例
return关键字在方法中单独使用
return;可以用在无返回值的方法中,作用是:立即跳出并结束当前方法的执行
命令行传参
使用main方法传参:
package method;
public class Demo03 {
public static void main(String[] args) {
//args.length 数组长度
for (int i = 0; i < args.length; i++) {
System.out.println("args["+i+"]:"+args[i]);
}
}
}
可变参数(不定向参数)
JDK1.5开始,Java支持传递同类型的可变参数给一个方法。
在方法声明中,在指定参数类型后加一个省略号(...)。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
可变参数须为同一类型。
package method;
public class Demo04 {
public static void main(String[] args) {
//创建Demo04类
Demo04 demo04 = new Demo04();
//调用对象.test方法
demo04.test(1,3,5,7,9,11,22);
}
public void test(int x,int...i){
System.out.println(i[0]);
System.out.println(i[1]);
System.out.println(i[2]);
System.out.println(i[3]);
System.out.println(i[4]);
}
}
package method;
public class Demo04 {
public static void main(String[] args) {
//调用可变参数的方法
printMax(34,3,3,2,56,5);
printMax(new double[]{1,2,3});
}
public static void printMax(double...numbers) {
if (numbers.length == 0){
System.out.println("No argument passed");
return;
}
double result = numbers[0];
for (int i = 1;i < numbers.length;i++){
if (numbers[i] > result){
result = numbers[i];
}
}
System.out.println("The max value is" + result);
}
}
递归
A方法调用A方法,就是自己调用自己
递归结构包括的两个部分:
递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
递归体:什么时候需要调用自身方法。
package method;
public class Demo05 {
public static void main(String[] args) {
System.out.println(f(5));
}
//5! 5*4*3*2*1
public static int f(int n){
if (n==1){
return 1;
}else {
return n*f(n-1);
}
}
}
递归的深度越大,时空性不好,会占用大量的空间内存。
大基数的计算不能用递归。
练习
写一个计算器,要求实现加减乘除功能,并且能够循环接收新的数据,通过用户交互实现。
思路推荐:
1. 写4个方法:加减乘除
2. 利用循环+switch进行用户交互
3. 传递需要操作的两个数
4. 输出结果
package method;
import java.util.Scanner;
public class Demo06 {
public static void main(String[] args) {
//用java写一个计算器,要求实现加减乘除功能,并且能够循环接受新的数据,
//通过用户交互实现
Scanner scanner = new Scanner(System.in);
while (true){
System.out.println("请输入第一个数:");
double i = scanner.nextDouble();
System.out.println("请输入第二个数:");
double j = scanner.nextDouble();
System.out.println("请选择算法符号:");
String str = scanner.next();
switch (str){
case "*":
System.out.println(i+"*"+j+"="+(i*j));
break;
case "/":
System.out.println(i+"/"+j+"="+(i/j));
break;
case "+":
System.out.println(i+"+"+j+"="+(i+j));
break;
case "-":
System.out.println(i+"-"+j+"="+(i-j));
break;
default:
System.out.println("输入的算法错误!");
}
}
}
}