java的方法到底是什么

一、定义和调用

方法(Method)的定义

方法: 完成某一特定功能(如:求和,统计数量等)且可以被重复调用的代码块

定义方法,语法格式:

[修饰符] 返回值类型 方法名称(参数类型 参数名1,参数类型 参数名2 ...) {

// 方法体

[return 返回值;]

}

看看最熟悉的main方法的定义。

格式分析:

  修饰符:  publicstatic, static修饰的方法直接使用类名调用即可,目前都使用static修饰

  返回值类型:限定返回值的类型,方法在完成一个功能后,是否需要给调用者返回一个结果?

  如果需要给调用者返回结果,就写上返回数据的类型

  如果不需要给调用者返回结果,此时使用关键字void,表示无返回值

  方法名称:用于调用方法,遵循标识符规范,使用动词表示,首字母小写,采用用驼峰表示法

  形式参数:方法圆括号中的变量,可以有多个,多个参数使用,号分割。

  方法体:方法的{}中的代码,编写如何完成该功能的代码

   return关键字:在方法体中使用return关键字

  功能1:把值返回给该方法调用者,此时该方法不能使用void修饰

   功能2:结束当前方法

  注意:方法体没有return时,方法的返回类型声明为void,表示无返回。

  实际参数:在调用某一个具体方法时,实际传递的参数值

注意事项:

  方法必须定义在类中,在Java中最小的程序单元是类,必须先有类

  一个类中可以定义多个方法

  方法和方法是平行的,不能在方法中定义另一个方法

  方法的定义没有先后顺序

 方法调用

需求:在MethodDemo类中,定义一个求两个整数之和的方法

方法定义分析:

   求两个数之和,到底是哪两个整数?说明有两个未知的因素,使用两个int类型变量表示。 

  该方法要求求两个数之和,必定需要给调用者返回一个结果,否则,毫无意义。

public static int getSum(int a, int b) {

int c = a + b;

return c;   //返回 a + b之和

}

注意:

  方法中的int aintb就是形式参数,即使参数名不叫ab,也不影响,仅仅是变量名唯一。 

  方法定义出来,必须要调用才能生效。

方法调用:

  方法调用格式:因为方法是static修饰的,可以直接用方法所在类的名称调用。

  如果方法有返回类型,此时需要返回类型定义变量,接受方法返回的结果,并打印,这才有意义。

  调用方法的地方,可以称之为调用者/调用处

// 语法格式:

返回值类型 变量 = 方法所在类名 .方法名(实际参数) ;

int  result = MethodDemo.getSum(2 , 3);

System.out.println(result);     //输出5

  调用方法时,传递的参数23就是实际参数,简称实参,和顺序,类型有关。

设计练习      

如何定义一个方法,主要是确定有没有参数,是什么参数,有没有返回值,返回什么,这得结合具体需 求来确定。

  形式参数:完成一个功能,存在哪些未知的因素需要调用者传入,把它们作为方法定义时的参数( 式参数)

  返回值类型:完成一个功能,要不要给调用者返回一个结果?

  如果需要给调用者返回结果,就写上返回数据的类型

  如果不需要给调用者返回结果,此时使用关键字void,表示无返回

public static ? 方法名(?) {

// TODO

}

方法设计练习

需求1:定义一个方法,打印指定行数的指定字符串

调用方法:

public static void main(String[] args) {

// static修饰的方法调用:类型 .方法名(实参)

MethodDemo.print(3,"你好师姐");

MethodDemo.print(5,"你好龙哥");

}

需求2:定义一个方法,传入一个int数组,按照指定格式(格式:[x,x,x]) 在控制台打印int类型数组

//返回值类型:因为只要求打印指定的字符串, 所以,该方法不需要返回值,void

//参数:打印的数据所在的数组是未知的,所以定义一个形参来接收调用者传递进来的实参

public static void printArray(int[] arr) {

String str = "[";

int item;

for (int i = 0; i < arr.length; i++) {

item = arr[i];

str += item;

if (i == arr.length - 1) {

str += "]";

} else {

str += ", ";

}

}

System.out.println(str);

}

调用方法:

int indexOf(int[] arr, int key) {

for (int i = 0; i < arr.length; i++) {

if (arr[i] == key) {

return i;

}

}

return -1;//如果没找到, 返回-1

}

public static void main(String[] args) {

int[] arr = new int[] { 1, 3, 5, 7, 9 };

MethodDemo.printArray(arr);

}

需求3:定义一个方法,传入一个int数组,返回指定元素在数组中第一次出现的索引

//返回值类型:因为要求返回元素的索引,所以返回值的类型应该为int
//参数:数组和要找的元素是未知的,所以定义两个形参来接收调用者传递的实参 public static

调用方法:

public static void main(String[] args) {

int[] arr = new int[] { 1, 2, 3, 5, 3, 7, 9 };

int index = MethodDemo.indexOf(arr, 3);//mainindexOf两个方法在同一个类中,也可以直接使用方法名来调用

System.out.println(index);

}

练习需求4:定义一个方法,传入一个int数组,返回该数组所有元素之和的平均数

public static double getAvg(int[] arr){

double avg = 0.0;

int sum = 0;

for(int item:arr){

sum += item;

}

avg = sum * 1.0 / arr.length;

return avg;

}

调用方法:

public static void main(String[] args) {

int[] arr = new int[] { 1, 2, 3, 5, 3, 7, 9 }; double avg = MethodDemo.getAvg(arr); System.out.println(avg);

}

需求5:定义一个方法,传入两个参数,一个double类型的折扣,一个double数组表示多个货品的价格,返回支付货品的总价格

public static double getTotalPrice(double cutOff,double[] arr) { double total = 0;

for (double ele : arr) {

total = total + ele;// 求和

}

return total * cutOff; // 返回折后总价

}

调用方法:

public static void main(String[] args) {

double[] arr = new double[] { 10.0, 20.0, 30.0, 50.0, 30.0, 70.0, 90.0 }; double totalPrice = MethodDemo.getTotalPrice(arr,0.8); System.out.println(totalPrice);

}

 方法可变参数

在方法中传递数组有一种更简单的方式——方法的可变参数,其本质是一个语法糖,目的是让开发者写代码更简单。

语法:

[修饰符] 返回值类型 方法名称(参数类型 参数1,xx,xx,可变参数类型...参数名) { 方法体;

[return 返回值;]

}

 可变参数必须作为方法的最后一个参数,避免多个参数的歧义

 推论:方法最多只有一个可变参数

需求6:定义一个方法,传入两个参数,一个double数组表示多个货品的价格,一个double类型的折扣,返回货品总价格(使用可变参数)

static double getTotalPrice(double cutOff, double... arr) { 

double total = 0;

for (double ele : arr) {

total = total + ele;

}

return total * cutOff;

}

调用方法:

public static void main(String[] args) {

double[] arr = new double[] { 10.0, 20.0, 30.0, 50.0, 30.0, 70.0, 90.0 }; double totalPrice = MethodDemo.getTotalPrice(0.8, arr);

double totalPrice2 = MethodDemo.getTotalPrice(0.8, 10.0, 20.0, 30.0, 50.0, 30.0, 70.0, 90.0);

System.out.println(totalPrice);

}

 方法重载

方法的重载(Overload),在同一类中,方法名称相同,但参数列表不同的多个方法构成方法重载。

方法重载判断原则:两同一不同

 两同:在同一个类中,方法名是相同

 只要参数类型、参数个数、参数类型的顺序任意一个不同,就叫参数列表不同

方法重载的作用:解决了同一功能的方法由于参数不同所造成方法名称不同。

注意:方法重载和方法的返回值类型无关,只是一般要求返回值类型相同。

实际开发中,需要更简单、快速的识别方法重载 —— 方法签名

 方法签名:方法名称 + 参数类型,在同一个类中,方法签名必须是唯一的,否则编译报错。

public class MethodSignDemo {

// addNum(int,int) 这个是方法的签名

public static int addNum(int num1,int num2) { int result = num1 + num2;

return result;

}

public static void main(String[] args) {

}

}

有了方法签名,重载:在同一类中,方法名称相同,但方法签名不同的多个方法构成方法重载。

以下的方法都在同一个类中,且方法名都为doWork

// doWork(int,char,boolean)

void doWork(int a,char b,boolean c){}

三个参数:分别是int类型、char类型、boolean类型.

下列方法哪些是上述doWork方法的重载方法

// doWork(char,int,boolean)

void doWork(char b, int a, boolean c){} //YES

// doWork(boolean,char,int)

int doWork(boolean a,char c ,int b){}

//YES

// doWork(int,char,double)

void doWork(int a,char b,double c){}

//YES

// doWork(int,char,boolean)

void doWork(int x,char y,boolean z){}

int doWork(int x,double y){}

int doWork(int x, char y,boolean z){}

//编译报错

//YES

//编译报错

 方法参数的值传递机制

值传递:方法在调用时,把实参的值复制一份给形参的过程称为值传递。java方法调用时的参数传递过程就采用值传递。

基本类型参数

static void change(int x

System.out.println("change before,x=" + x);//10

x = 100;// 修改x变量的值

System.out.println("change after,x=" + x);//100

}

public static void main(String[] args) {

int a = 10;

System.out.println("main change before,a=" + a);//10 change(a);

System.out.println("main change after,a=" + a);//100? 10?

}

输出结果:

main before,a=10

change before,x=10

change after,x=10

当把main方法中a变量的值复制一份,传递给change方法,main方法中的a变量的值不受改变。

引用类型参数

static void change(int[] arr) {

System.out.println("change before,arr[0]=" + arr[0]);//10

arr[0] = 30;// 修改数组中第一个元素的值

System.out.println("change after,x[0]=" + arr[0]);//30

}

public static void main(String[] args) {

int[] a = new int[] { 10,90 };

System.out.println("main change before,a[0]=" + a[0]);//10 change(a);

System.out.println("main change after,a[0]=" + a[0]);//30

}

输出结果:

main before,a[0]=10

change before,arr[0]=10

change after,x[0]=30

main after,a[0]=30

小结:

传递基本类型参数:传递参数

传递引用类型参数:传递参数所引用的堆空间地址值

  • 9
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值