方法的定义
在Java的语言中,方法相当于C语言中的函数,但是它与传统的函数也有着明确的不同:在结构化的语言中,函数是一等公民,整个程序是由一个个函数组成的;但是在面向对象的语言里,类是一等公民,整个程序是由一个个类组成的。因此在Java中,方法不能独立存在,它只能属于类或者对象。因此,如果我们要定义一个方法,就必须在类中定义。值得注意的是,如果这个方法添加了修饰符static(这个修饰符后面会详细说明),这个方法就属于这个类,否则的话,这个方法属于这个类的实例。
我们调用方法的方式为:类.方法 | |实例.方法。但是当我们在一个类中的方法调用相同类中的方法时,如果这个方法是普通的方法,我们需要用到this来调用;如果这个方法是静态的方法(static修饰),我们需要用类名来调用。
方法的格式及说明
修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2,...){
方法体语句;
return 返回值;
}
-
修饰符
:目前就用 public static。后面我们再详细的讲解其他的修饰符。
返回值类型:就是功能结果的数据类型。当这个方法没有返回值的时候,返回值的类型为void;当这个方法有返回值的时候,返回值的类型根据返回的数据来确定(如果有返回值,必须使用return)。 -
方法名
:符合命名规则即可(驼峰命名)。 -
参数类型
:参数像一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数个数。参数是可选的,方法可以不包含任何参数。 -
形式参数
:在方法被调用时用于接收外界输入的数据。 -
实参
:调用方法时实际传给方法的数据。 -
方法体语句
:就是完成功能的代码。 -
return
:结束方法的。 -
返回值
:就是功能的结果,由return带给调用者。
静态方法和非静态方法的区别
非静态方法是相对于静态方法来说的。静态方法使用static关键字来标示,非静态方法没有此关键字。
静态,指以static关键字修饰的,包括类,方法,块,字段。静态方法可以被直接调用。
他们之间最大的区别在于它们生命周期的不同,静态方法属于全局方法,当静态方法第一次被访问的时候,就将常驻内存直到整个系统被销毁;
而非静态方法则与类有关,只有该方法所在的类被实例化之后,该方法才能被访问,类被销毁的同时方法也被销毁。
生命周期的不同决定了它们的调用方式的不同,静态方法使用(类名.方法名)来调用,而非静态方法则需要(new 类名().方法名)来调用。
同时与之相关的就是,静态方法不能调用非静态方法和属性。在了解了它们生命周期的不同后,这一点也比较好理解,因为静态方法生命周期比非静态方法和属性长,当调用非静态方法和属性时就会产生非静态方法和属性已经被销毁的情况导致程序出错。
方法的调用
一般的,在Java语言中,调用方法有三种方式。
第一种:通过对象名.方法名进行调用,这是最普通的也是最常见的一种调用方式。
第二种:通过new关键字调用构造方法,这种是在实例化对象时使用的方式。
第三种:通过类名.方法名调用,当需要调用的那个方法为静态(有static的)方法时使用。
【配合实际操作,附如下实例】
package methods;
public class Demo1 {
public static void main(String[] args) { //main方法
int Max = Max(10,30); //调用Max方法
System.out.println(Max);
}
//比大小
public static int Max(int a,int b) {
int result=0;
if(a==b) {
System.out.println("a==b");
return 0; //终止方法
}
if(a>b) {
result = a;
}else {
result = b;
}
return result;
}
}
运行结果
package methods;
public class Demo2 {
public static void main(String[] args) {
//通过new关键字配合构造Demo2()完成实例化对象并取名为Demo2
Demo2 Demo2 = new Demo2(); //构造的方法必须和类命名一致
//通过对象名.方法名进行调用方法add和del并输出值。
System.out.println(Demo2.add());
System.out.println(Demo2.del());
}
public int add() { //int类型的方法add()
return 1+1; //返回值
}
public static int del() { //
return 2+2;
}
}
方法的重载
如果一个类中有多个具有相同名称但参数不同的方法,则称为方法重载。如果只需要执行一个操作,具有相同的方法名称将增加程序的可读性。
重载的不同方法:
- 通过改变参数的数量
- 通过改变参数的类型
- 重载与返回类型无关
main()方法也是普通方法,可以重载,只不过虚拟机只调用带字符串公共类型的方法,public static void
main(String[] args){},但是你可以自定义你用的main()方法,main(int a);main(String a);
虚拟机只执行一个main方法。
package methods;
//方法的重载 求和
public class Demo3 {
public static void main(String[] args) {
//调用方法并计算输出
System.out.println(add(12,25,8,9,55,88,2541,12,99));
System.out.println(add(99,88));
System.out.println(add(8888,2245,66));
}
static int add(int...nums) {
int result = 0;
for(int i = 0;i<nums.length;i++) {
result += nums[i];
}
return result;
}
static int add(int num1,int num2) {
return num1+num2;
}
static int add(int num1,int num2,int num3) {
return num1+num2+num3;
}
}
可变参数
java
可变参数是1.5版本的新特性,也就是说用户若是想定义一个方法zhidao,但是在此之前并不知道以后要用的时候想传几个参数进去,可以在方法的参数列表中写参数类型或者数组名,然后在方法内部直接用操作内数组的方式操作。
【注意】可变参数必须位于最后一项。
原因:
当可变参数个数多余一个时,必将有一个不是最后一项,所以只支持有一个可变参数。因为参数个数不定,所以当其后边还有相同类型参数时,java无法区分传入的参数属于前一个可变参数还是后边的参数,所以只能让可变参数位于最后一项。
可变参数的特点:
- 只能出现在参数列表的最后。
- …位于变量类型和变量名之间,前后有无空格都可以。
- 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
【用可变参数求多个数的和(个数不确定)】
public class Demo{
public static void main(String []args){
System.out.println(add(1,3));
System.out.println(add(1,3,5,7));
}
public static int add(int ...nums){
int sum = 0;
for(int i = 0;i<nums.length;i++){
sum += nums[i]
}
return sum;
}
}