一、方法
方法相当于C语言中的函数。二者都是程序实现功能的基本单位。
java程序要想运行,必须调动一个或者数个方法,程序入口是main方法。C程序想要运行必须调动一个或数个函数,且程序入口是main方法。
但不同的是,C语言中的函数可以独立存在,而JAVA的方法只能以成员的形式存在在类中。
二、方法的创建与调用
在此之前,大家可以先读一段代码。
package Object1;
/**
* 定义一个类:MyFirstClass
* 1)添加speak 成员方法,输出我是一个好人
* 2)添加cal01成员方法,可以计算从1+..+1000的结果,并返回
* 3)添加cal02成员方法,该方法调用时接收一个数n,计算从1+..+n的结果
*/
import java.util.Scanner;
public class Method001 {
public static void main(String[] arg) {
MyFirstClass a = new MyFirstClass();//创建一个MFC型的变量a
a.speak(); //调用a变量的一个方法speak()
int i1 = a.cal01(); //调用另一个方法,并将返回值赋值给int类型的i1;
System.out.println(i1);
Scanner sc = new Scanner(System.in); //这是键盘输入时的创建,如今应该能够读懂了吧。
//创建一个Scannery类型的对象sc,SC的空间大小由System.in这个变量决定
int n = sc.nextInt();//调用sc下边的方法nextInt,将返回值返回给n
int i2 = a.cal02(n);//调用方法
//n为实参,形参和实参名不一定要一致,但类型要一致
System.out.println(i2);
}
}
class MyFirstClass{
public void speak() {
/* public表示公共类
* void 无返回值方法
* speak是方法名
* ()内部是形式参数表
*/
System.out.println("我是一个好人");
}
public int cal01() {
//int说明一个返回值类型为int的方法
int i1 = 0;
for(int i = 1; i <= 1000; i++) {
i1 += i;
}
return i1;
}
public int cal02(int n) {//形参
//int说明一个返回值类型为int的方法
int i1 = 0;
for(int i = 1; i <= n; i++) {
i1 += i;
}
return i1;
}
}
1、方法的创建
[方法类型] [返回值类型] 方法名(形参类型 形参; 形参类型 形参;。。。){
方法的主体
return 返回值名;
}
方法的修饰符:public(公共类)...proptected,默认,private四种
返回值类型:包括返回值变量的类型和void;其中void表示该方法没有返回值(返回null)。一个方法只能有一个返回值,多个结果时可以借助引用变量。
方法名:方法调用时的名字
()内的是形参表:(下边详讲)
方法的主体:方法被调用时执行的语句。是一段意义完整的代码段。
方法可以嵌套使用,但不能嵌套定义。
return语句:如果需要有返回值,就可以添加,return是方法的结束语句。
2、方法的调用
类名 对象名 = new 类名():;
对象.方法名();
创建一个对象,以对象的名义调用方法。
细心的人应该可以发现,方法的调用与属性的调用不能说类似,只能说说是完全一致。为什么呢?
我的看法是:无论是函数还是方法,都是一段语句的集合,是有返回值的,且只能有一个返回值(哪怕是void,也会返回一个null),由于返回值的存在,我们就可以把这个方法看成一个变量, 根据输入的内容输出一个常量。这就是一个另类的变量,动态的变量。所以从这个角度上来看,方法的调用和属性的调用一致就不难理解了,当然由于它是另类的变量,有一些另类的功能也就可以理解了。
(1)同一个类中的方法可以直接调用
(2)不同类,但是同一个文件中的方法调用要用上述方法调用
(3)跨包的调用则需要先引用import。
(4)方法的调用有限制,被调用也有限制,是否被限制,限制的程度如何与方法前的方法修饰符有关。
3、方法的好处:增加复用性
将已经实现的功能,抽象,封装起来,在之后的代码使用。
4、形参列表:
(1)一个方法可以有0个或多个形参。
(2)形参类型可以是基本数据类型,也可以是引用数据类型
(3)调用时,括号内填的是实参,实参的类型要与形参的类型一一对应。
三、传参
1、形式参数与实参(关于参数定义域的问题,在此不做展开)
形参在被调用的方法内部,调用开始时被创建出来,调用结束,被形参会被销毁,
实参在被调用的方法外,作用是把形式参数需要的值传到给实参。不参与被调用的方法的运行,所以值不会有任何变化(这里把引用参数的值看成那一段地址。)
注: 不同的方法在运行时会形成不同的变量栈,在被调用时,方法就是申请一片空间作为自己的变量栈,存放自己的变量,而方法只能操作自己的变量,对于其他变量栈中的变量无权操作(比如实参对于被调用的方法)
2、引用变量
前边说过,被调用方法无法操作原方法中的变量,但引用变量特别的地方在于,它真正的值存储在堆中,如果有堆中某一个引用变量类型变量的地址,就可以对该堆中的数据进行操作。
那么,被调用方法有这个地址吗?答案是有,因为传参时被传送过来的值就是地址。
3、返回值return;
返回值return返回的也是一个值。还是分成两种:字面值和地址
关于返回值的接收,就需要用对应的数据类型去接受。
需要注意,返回值返回只能返回一个值,如果想要返回多个值,就需要把这些值放入引用数据变量中(如果类型相同就放进数组中,如果不同就放进类和对象中)