方法是类或对象的行为特征的抽象,是类或对象最重的组成部分。
static
用static修饰的方法属于这个类,属于该类的所有对象所共有。
因此即使没有创建该类的具体对象,类中用static修饰的方法也会存在。
创建对象前初始化。
只能处理静态属性、调用静态方法
静态方法中不能:使用this引用、构造函数中调用、直接访问非静成员。
类 -- 类 の调用: 类名 . 方法名 ( [ 实参表 ] ) ;
类是static方法的调用者 类方法
对象 -- 类 の调用:
对象名 . 静态方法名 ( [ 参数表 ] );.
对象 -- 对象の调用:
对象名 . 方法名 ( [ 实参表 ] );
对象是方法的调用者 普通方法
需注意:
方法不能独立定义,只能在类体里定义。 因此,类体内定义方法。
从逻辑意义上看,方法要么属于类,要么属于对象。因此,执行方法必须使用类或对象作为调用者。
同一个类中的方法相互调用时,普通方法调用者:this ;静态方法调用者:类。
不同:
方法的参数传递
如果定义方法时包含了形参,则调用方法时必须传实参。
注意:Java里方法的参数传递方式为值传递---将实际参数值的副本(复制品)传入方法内,而实际参数值本身不会受到任何影响。
基本类型的变量 \ / 值
值传递
引用---------------- / \ 地址
方法参数的传递方式-----值传递
public class TestTransfer{ public class void changeAB(int a,int b){ int tmp = a; a = b; b = tmp; System.out.println("changeAB方法里,a的值是" + a +";b的值是"+b); public static void main(String[] args){ int a = 10; int b = 5; changeAB(a,b); System.out.println("交换结束后,a的值是" + a +";b的值是"+b); } }
changeAB方法里,a的值是5 ;b的值是10
交换结束后 ,a的值是10;b的值是5
调用方法changAB()时,形参a、b值的交换,并不影响main方法中的实参a、b的值。
引用类型的变量作方法参数
源文件:DataWrap.java
public class DataWrap{
public int a;
public int b;
}
源文件:TestTransfer.java
public class TestTransfer{
public class void changeAB(DataWrap dw){
int tmp = dw.a;
dw.a = dw.b;
dw.b = tmp;
System.out.println("changeAB方法里,a的值是" + dw.a +";b的值是"+ dw.b);
public static void main(String[] args){
DataWrap dw = new DataWrap();
dw.a = 10;
dw.b = 5;
changeAB(a,b);
System.out.println("交换结束后,a的值是" + dw.a +";b的值是"+ dw.b);
}
}
changeAB方法里,a的值是5;b的值是10
交换结束后 ,a的值是5;b的值是10 对象的地址
main方法创建对象DW对象,并定义一个对象指向DW。 调用c,系统开辟出2个栈区存放m和c局变,dw(实参)值传入c。m的dw值赋给c的dw,完成c的dw的初始化
创建对象时,系统有2个实体:堆:本身;栈:该对象的引用 m的dw是一个引用,保存的是地址,dw值赋给c形参后,c的dw形参也保留这地址值,引用到堆中的DW对象
引用操作DW对象,给ab赋值
形参长度可变的方法
从JDK1.5以后,Java允许定义形参长度可变的参数,从而允许为方法指定数量不确定的形参。
形参长度可变的方法定义:如果在定义方法时,在最后一个形参的类型后增加三点…,则表明该形参可以接受多个参数值,多个参数值被当成数组传入。
例4.9 形参长度可变的方法outClassInfo。
public static void outClassInfo(String cname,String…sname){
//在方法体内将参数sname当成是数组
}
在方法体内,将参数sname当成数组处理
for (String student : sname){
System.out.println(student);
}
形参长度可变的方法调用
outClassInfo(“08软件技术”,“李四”,“王五”,“赵六”);
注意:
以可变个数形参来定义方法 public static void outClassInfo(String cname , String... sname);
采用数组形参来定义方法 public static void outClassInfo(String cname , String[] snames)
这两个方法签名的效果虽然一样,但还是有区别的:
调用可变形参的方法,更加简洁;
调用数组形参来声明的方法,必须传给该形参一个数组,outClassInof(“09软件”,new String[]{“王五”,“李四”});
数组形式的形参可以处于形参列表的任意位置,但个数可变的形参只能位于形参列表的最后。
递归方法
如果一个方法定义中直接或间接调用它本身,就是方法的递归调用。
例4.10 编写程序,计算10的阶乘。
public static long calc(int n){
if(n==1){
return 1;
}else{
return n*calc(n-1);
}
}
递归体:递归的方式
递归方法一般由两部分组成:
递归出口:递归终止的条件
例4.11已知有一个数列:f(0)=1,f(1)=4,…,f(n+2)=2*f(n+1)+f(n),其中n是大于0的整数,求f(10)的值。
方法的重载
Java语言允许在一个类中定义几个同名的方法,但要求这些方法具有不同的参数特征,这种做法称为方法的重载(overloaded)。不同的参数特征包括:
参数个数:int GetSort(int x); int GetSort(int x,int y);
参数类型:int GetSort(int x); int GetSort(double x);
参数次序:int GetSort(int x,double y); int GetSort(double x,int y);
注意:返回值类型不是重载的依据。
重载方法的调用:当类中有多个重载的方法,调用该类的某个重载方法时,Java能够根据实参表的不同区分实际调用的是哪一个方法。
例4.12 方法的重载。
Overload ol=new Overload();
ol.test(); //调用无参数的test()
ol.test(“hello”); //调用带一个字符串参数的test()
例4.13 重载方法中有一个带可变长度的形参。
public void test(String msg);
public void test(String… books);
则,olv.test(); //调用test(String… books);
olv.test(“aa”,”bb”); //调用test(String… books);
olv.test(“aa”); //调用test(String msg);
如只传入一个参数,又需要调用参数长度可变的方法,则可采用如下调用形式:olv.test(new String[]{“aa”});