3.1 JAVA方法:

2023-05-15,,

JAVA方法

何为方法

方法是语句的集合,这个集合执行一个功能
方法包含于类或对象中
方法在程序中被创建,在其他地方被引用
java全是值传递


方法的定义和调用

方法的定义:

修饰符 返回类型 方法名(参数类型 参数){
方法体
return 返回值;
}

修饰符(可选):告诉编译器如何调用该方法
返回值类型:方法可能会返回值;无返回值的方法用void
方法名:开头小写,后面首字母大写
参数类型(可选):一个方法被调用时,传递值给参数,这个值成为实参或变量;参数是可选的,方法可以不包含任何参数,如void方法不包含任何参数
形参:定义方法时,用于接收外界输入的数据
实参:调用方法时,向方法传递的数据
方法体:具体语句,实现的功能
返回值:除了void方法外,其余都可以返回;一般把return写在方法的最外层 ;void用 return; 终止方法、其他类型retrun 0 用于终止方法

方法的调用:

对象名.方法名(实参);
void();

当方法返回一个值的时候,方法调用通常会被当做一个值如:int a=max(30,40);
当方法是void时,方法调用一定是一条语句

方法的小细节:

返回值的细节:

一个方法最多有一个返回值。当返回多个结果的时候,我们可以把方法定义成数组类型,把结果存入数组,最后返回一个数组
返回类型可以为任何类型
如果方法要求有返回数据类型,则方法体中最后执行的语句必须为return 值,且返回类型必须和return的值类型保持一致或兼容(如方法是double类型,返回int是可以的;反之则不行,会丢失精度)
如果方法是void,则方法体中可以没有return语句,或者只写return ;

形参列表的细节:

一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开
参数类型可以为任意类型
调用带参数的方法时,一定要对应着参数列表传入相同类型或兼容类型的参数!
形参和实参的类型要一致或兼容、个数、顺序必须一致!

方法体的细节:

一个方法里不能定义另一个方法

方法调用的细节:

同一个类中的方法调用:直接调用即可,格式 方法名(参数列表) ;

跨类中的方法调用:需要通过new一个对象调用, 格式如下:

跨类的方法调用还和修饰符相关


静态方法与非静态方法

静态方法:

当定义方法时加修饰符static,此时的方法就是静态方法。其他的类(自己这个类也是)可以直接调用这个方法,通过类名 . 方法名(); 就直接调用

非静态方法:

当定义方法时不加修饰符static,此时的方法就是非静态方法,其他的类(自己这个类也是)调用这个方法的时候必须先实例化方法所在的类。

通过 对象类型 对象名 =new 对象值(); 最后再通过对象名 . 方法()来调用这个非静态方法

重点:一个静态方法不能调用一个非静态方法

以下代码会报错!!!

值传递和引用传递

方法的值传递就是传递基本数据类型的实参,传递的参数的值并不会发生改变,原因:若参数是基本数据类型,调用方法时会在栈中开辟一个方法栈,在这个方法栈里面执行完的方法体后,方法栈弹出

//值传递
public class Demo02 {
public static void main(String[] args) {
int a=1;
System.out.println(a); //结果是1
change(a);
System.out.println(a); //结果还是1
}
public static void change(int a){
a=10;
}
}

方法的引用传递就是传递引用类型的实参,传递的参数发生改变

原因:若参数是引用类型,实际上是传递了地址,方法体的形参指向了堆中的内容。调用方法体时在栈中开辟了一个方法栈,在这个方法栈里面执行完的方法体后,虽然方法栈弹出,但是引用类型是存在于堆中的,方法执行完后,堆并不会消失,所以传递的参数就会发生改变

//引用传递:传递的是对象的地址,本质还是值传递
public class Demo03 {
public static void main(String[] args) {
//实例化一个person对象
Person person=new Person();
System.out.println(person.name); //结果是NULL change(person); //向方法传递了一个对象
System.out.println(person.name); //结果是aaaaa
}
public static void change(Person person){
//person是一个对象
person.name="aaaaa";
} }
//定义了一个Person类,有一个属性:name
class Person{
String name;
}

方法的重载

重载就是在一个类中,有相同的函数名,但形参不同的函数

方法重载的规则:

方法名必须相同
参数列表的必须不同,与形参的名字无关
返回类型无要求

方法的重载可以使得调用相同的方法名的时候,根据参数列表的不同(如个数、类型)和接收结果的变量类型不同,从而选择对应的方法

命令行传参

通过命令行对一个类进行传参

打开cmd 进入类的存储路径
javac 类名.java 生成类名.class
java 包名.类名 参数


可变参数

定义一个方法时候,参数列表里的参数个数不确定,可以通过可变参数来解决。可变参数可以减少方法的重载(方法的重载必须是相同类型的情况下);可以这么认为,可变参数就是一个长度自定义的数组

规则:

在方法的声明中,在指定参数类型后面加三个点 ... 即方法名(数据类型... 形参);
一个方法只能有一个可变参数,它必须是方法的最后一个参数
调用的方法里含有可变参数时,实参的类型必须和形成的类型保持一致

可变参数的细节:

可变参数的实参可以是0个或者任意多个
可变参数的实参可以为数组
可变参数的本质就是数组
一个方法只能有一个可变参数,它必须是方法的最后一个参数

使用可变参数时,可以当作数组来使用

public class Demo02 {
public static void main(String[] args) {
printMax(1,34,45,12,4); //1会传递给a,34,45,12,4会传递给numbers,就如同进了一个数组
printMax(1,new double[]{1,2,3,4,5}); //也可以传递一个数组
}
public static void printMax(int a,double... numbers){//numbers可以当作数组
if(numbers.length==0){
return;
}
double result=numbers[0];
for (int i = 1; i <numbers.length ; i++) {
if(numbers[i]>result){
result=numbers[i];
}
}
System.out.println("The max value is:"+result);
}
}

递归

递归就是方法调用自己

递归结果包括两个部分:

递归头:什么时候不用调用自身方法。如果没有头,会死循环 也就是递归的尽头
递归体:什么时候需要调用自身方法

递归的规则:

执行一个方法时,就创建一个新的受保护的独立空间
方法的局部变量是独立的,不会相互影响,比如n变量
如果方法中使用的是引用类型,就会共享该引用类型的数据
递归必须向退出递归的条件逼近,否则就会无限递归,出现栈满StackOverflowError

大计算一般不用递归,因为java用的是栈机制

public class Demo03 {
public static void main(String[] args) {
System.out.println(f(10));
}
//5! 5*4*3*2*1
public static int f(int n){
if(n==1){
return 1;
}else{
return n*f(n-1);
}
} }

作用域

java中作用域分为全局变量和局部变量

全局变量:也就是属性,作用域为整个类体,全局变量可以不赋值,直接使用,因为有默认值

局部变量:除了属性之外的其他变量,作用域为定义它的代码块中,局部变量必须赋值后才能使用,因为没有默认值

作用域的细节:

属性和局部变量是可以重名的,访问时遵循就近原则
同一个作用域中,两个局部变量不能重名
属性的生命周期伴随对象的创建而创建,伴随对象的死亡而死亡;局部编辑则是和代码块一起的,即在一次方法调用的过程中
全局变量/属性:可以被本类使用或其他类使用(通过对象调用);局部变量:只能在本类中对应的方法中使用
全局变量/属性可以加修饰符;局部变量不能加修饰符

3.1 JAVA方法:的相关教程结束。

《3.1 JAVA方法:.doc》

下载本文的Word格式文档,以方便收藏与打印。