文章目录
1. 什么是方法
- 举例来说,
Scanner
是类,sc
是对象,nextInt()
是方法
Scanner sc = new Scanner(System.in);
sc.nextInt();
sc.next();
- 主方法也是特殊的方法:
class abc{
public static void main(String[], args){
System.out.println("Hello world!");
}
}
2. 方法的声明与调用
- 用法:
访问修饰符 返回类型 方法名(参数列表){
方法体
}
- 举例,
public
是访问修饰符,static
代表静态方法,void
是返回类型,main
是方法名,String[] args
是参数列表
public static void main(String[], args){
System.out.println("Hello world!");
}
-
返回类型:可以是
void
或任何数据类型 -
方法名:命名方法,首字符小写之后单词的首字母得大写,
javaMethod
-
main
函数调用方法,与同一个类下的两个非main方法相互调用
package aaa.bbb.method;
public class ExchangeDemo {
public void swap(int a, int b) {
int temp;
temp = a; a = b; b = temp;
System.out.println("Swap successfully");
}
public void swapTest(){
int m = 4, n = 5;
swap(m, n); //不需要重新定义了,可以直接调用
}
public static void main(String[] args) {
ExchangeDemo ed = new ExchangeDemo();
ed.swapTest();
}
}
3. 方法的分类
- 方法定义的位置是在类的内部,但是不能嵌套定义
3.1 无参无返回值方法
- 例子(用void):打印
hello word
package aaa.bbb.method;
public class MethodDemo {
public void printStar() {
System.out.println("Hello world!");
}
public static void main(String[] args) {
//创建一个MethodDemo类的对象myMethodDemo
MethodDemo myMethodDemo = new MethodDemo();
//使用对象名.方法名()去调用方法
myMethodDemo.printStar();
}
}
3.2 无参有返回值方法
- 例子(可以任意指定数据类型,这里是int):矩形面积
package aaa.bbb.method;
public class Rectangle {
public int area() {
int leng = 10;
int width = 5;
int getArea=leng*width;
return getArea;
}
public static void main(String[] args) {
Rectangle rec = new Rectangle();
System.out.println(rec.area());
}
}
3.3 有参无返回值方法
- 例子:找最大值
package aaa.bbb.method;
public class Max {
public void max(float a, float b) {
float max;
max = a>b?a:b;
System.out.println("MAX: " + max);
}
public static void main(String[] args) {
float a = 1.0f, b = 2.0f;
Max max = new Max();
max.max(a, b=b);
max.max(1.2f, 2.4f);
}
}
3.4 有参有返回值方法
- 例子:求阶乘
package aaa.bbb.method;
public class Factorial {
public int fac(int n) {
int s = 1;
for (int i=1; i<n; i++)
s *= i;
return s;
}
public static void main(String[] args) {
Factorial fac = new Factorial();
System.out.println(fac.fac(5));
}
}
4. 方法重载
- 方法名相同,参数列表不同(可以是数量不同也可以是数据类型不同)
- 举例下面几个都是方法重载
public void hello(){}
public void hello(String s){}
public void hello(int n){}
public void hello(float f1, float f2){}
public int hello(int n){}
- 举个例子
package aaa.bbb.method;
public class Method {
public int plus(int m, int n) {
return m+n;
}
public double plus(double m, double n) {
return m+n;
}
public int plus(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 a = 10, b = 5, arr[]= {1,2,3};
double d1 = 10.0, d2 = 5.1;
Method method = new Method();
System.out.println("int: "+method.plus(a, b));
System.out.println("arr: "+method.plus(arr));
System.out.println("double: "+method.plus(d1, d2));
}
}
5. 特殊参数与传参
5.1 数组作为方法参数
- 用法L
public void printArray(int[] arr){}
\ - 例子:
package aaa.bbb.method;
public class ArrayMethod {
public void printArray(int[] arr) {
for(int i=0; i<arr.length; i++)
System.out.println(arr[i]+" ");
System.out.println();
}
public static void main(String[] args) {
ArrayMethod arr=new ArrayMethod();
int[] a={1, 2, 3};
arr.printArray(a);
}
}
- 练习:查找一个数是不是数组元素
package aaa.bbb.method;
import java.util.Scanner;
public class ArraySearch {
public boolean search(int n, int[] arr) {
boolean flag=false; //默认是没找到
for (int i=0; i<arr.length; i++) {
if (arr[i]==n) {
flag = true;
break;
}
}
return flag;
}
public static void main(String[] args) {
int n, arr[]= {1,2,3,4,5,6,7,8,9,10};
System.out.print("Input a number: ");
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
ArraySearch arrSrch = new ArraySearch();
boolean flag;
flag = arrSrch.search(n, arr);
System.out.println(flag);
}
}
5.2 基本数据类型的传参与数组的传参
- 基本数据类型的值在方法中被改变,是不会影响主方法里的值
- 数组的值在方法中被改变,会影响主方法里的值
- 例1:基本数据类型的值在方法中被改变是不会影响主方法里的值得。传递的只是变量的值,是局部变量,不会传递变量的地址。
package aaa.bbb.method;
public class ExchangeDemo {
public void swap(int a, int b) {
int temp;
System.out.println(" a: "+a+",b: "+b);
temp = a; a = b; b = temp;
System.out.println(" a: "+a+",b: "+b);
}
public void swapTest(){
int m = 4, n = 5;
System.out.println("m: "+m+",n: "+n);
swap(m, n);
System.out.println("m: "+m+",n: "+n);
}
public static void main(String[] args) {
ExchangeDemo ed = new ExchangeDemo();
ed.swapTest();
}
}
返回
m: 4,n: 5
a: 4,b: 5
a: 5,b: 4
m: 4,n: 5
- 例2:数组的变量存的是第一个数组元素的地址,在传参是也是传递的地址,因此会随着方法中的调用而被改变。
package aaa.bbb.method;
public class ChangeDemo {
public void printArray(int[] arr){
for (int i=0; i<arr.length; i++)
System.out.print(arr[i]+" ");
System.out.println("");
}
public void change(int[] arr) {
arr[2] = 10;
}
public void changeArrValue(){
int[] arr={1, 2, 3, 4, 5};
System.out.println("Origin arr: ");
printArray(arr);
change(arr);
System.out.println("Changed arr: ");
printArray(arr);
}
public static void main(String[] args) {
ChangeDemo change = new ChangeDemo();
change.changeArrValue();
}
}
返回
Origin arr:
1 2 3 4 5
Changed arr:
1 2 10 4 5
5.3 可变参数列表
- 用法:
public void sum(int... n){}
- 注意:
-
当参数列表中有多个参数,可变参数一定是放在最后的,如
(int n, int... a)
-
可以传递数组给可变参数
-
可变参数列表所在的方法是被最后访问的,比如一个方法重载的问题,我们定义了两个方法
- 第一个:
public int plus(int a, int b){}
- 第二个:
public int plus(int... a){}
当我们用
plus(1, 2)
来调用的时候,我们主要调用的是第一个方法,而不是第二个 - 第一个:
-
- 当我们不确定有几个数作为参数的时候,我们可以使用可变参数
- 举例:用求和来学习可变参数的循环,类似于数组,主要是这句
for(int i:n)
package aaa.bbb.method;
public class ArgsDemo {
public void sum(int... n) {
int sum=0;
for(int i:n) {
sum += i;
}
System.out.println("sum: "+sum);
}
public static void main(String[] args) {
ArgsDemo ad = new ArgsDemo();
ad.sum(1);
ad.sum(1, 2);
ad.sum(1, 2, 3);
}
}
Return
sum: 1
sum: 3
sum: 6
6. 异常处理
- 用法
try{
pass;
}catch(带包名的异常){
pass
}
- 输入数组,当我们尝试输入一个字符串时,会报错
package aaa.bbb.datamanage;
import java.util.Scanner;
public class DataManage {
public int[] insertData() {
int[] a = new int[5];
Scanner sc = new Scanner(System.in);
for(int i=0; i<a.length-1; i++) {
System.out.println("请输入第"+(i+1)+"个数据:");
a[i] = sc.nextInt();
}
return a;
}
public static void main(String[] args) {
DataManage dm = new DataManage();
int[] a = dm.insertData();
for (int n:a)
System.out.print(n + " ");
}
}
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at aaa.bbb.datamanage.DataManage.insertData(DataManage.java:20)
at aaa.bbb.datamanage.DataManage.main(DataManage.java:35)
因此我们需要处理java.util.InputMismatchException
这个异常
也就是用以下代码
package aaa.bbb.datamanage;
import java.util.Scanner;
public class DataManage {
public int[] insertData() {
int[] a = new int[5];
Scanner sc = new Scanner(System.in);
//少接收一个数据,为在指定位置处插入数据做准备
for(int i=0; i<a.length-1; i++) {
System.out.println("请输入第"+(i+1)+"个数据:");
// 异常处理
try {
a[i] = sc.nextInt();
}catch(java.util.InputMismatchException e) {
System.out.println("输入的数据格式有误,不能有非数字!");
sc.next();
i--;
}
}
return a;
}
public static void main(String[] args) {
DataManage dm = new DataManage();
int[] a = dm.insertData();
for (int n:a)
System.out.print(n + " ");
}
}