Java方法(函数):
函数的概念:
函数的定义:在类中的一段独立的代码块,用来实现某个功能。Java中,函数又被称为方法。
函数的主要:作用是为了提高代码的复用性
函数的格式:
修饰符 返回值类型 函数名 (参数类型1 参数名1,参数类型2 参数名2.... ){
// () 里面表示可选项,即参数不是必须的
执行语句的代码块...
return 返回值; //返回值的类型必须与返回值类型一致
}
-
修饰符:可以是访问修饰符,也可以说是函数修饰符(abstract、final、 static、synchronized),还可以是两者的组合。
-
返回值类型:用于限定函数返回值的数据类型。
-
参数类型:用于限定调用函数时传递的数据类型。
-
参数名:是一个变量,用来接收调用方法时传递的数据。
-
return:用来接收方法以及返回函数指定类型的值。
-
返回值:这个值会返回给函数的调用者(java中方法只能有一个返回值)。
基本数据类型和引用数据类型在参数传递时的问题: 对于基本数据类型,做函数调用传参时,会将具体的参数值传递出去 引用数据类型:做参数传递时传递的是地址
形参:在声明方法的参数表里需要声明参数类型以及在方法内使用的参数名称,因为参数声明并不具有实际值,所以只是一个形式参数,需要在调用时赋值。 实参:定义变量时已经给定变量值
函数的调用:
除了主函数之外,任何自定义的函数都必须手动调用才能执行。调用也就是执行函数内容,使用一段指令来完成对函数的调用,这段指令通常写在主函数以及其他函数中:
对象或类名.函数名(参数表);
若在一个类中,可以直接使用函数名+参数列表在main中调用。
若不在一个类中,可以使用new 类型的形式创建一个对象,用对象名.函数名的形式去调用。
对于有返回值的函数,在调用时可能还需要去用一个变量接收函数的返回值。
Java函数调用时内存的变化
jvm内存区域构成:
堆:存放new出来的对象,函数调用时的对象或数组等
栈:存放一些变量,每个方法都会开辟一片单独的栈空间
方法区:存储一些常量,类,方法
本地方法区:存放一些本地(系统方法)
程序计数器:寄存器 CPU
当进行函数调用时,对象在内存的表现:
首先,把Perosn类的Java文件转化为class文件,并把sayHello()方法加载进jvm内存的方法区,并且它们都有对应的内存地址。
在main方法执行Person person时,会先在栈内存中创建一个person的变量。
然后在执行new Person()时,把Person在堆中的地址赋值给栈中的person变量,同时会在堆中创建一个Person对象,同时保存class文件区的地址和成员方法区的地址。
对Person类中的name,age,weight等变量进行初始化操作,即给它们赋值为默认值。之后再把Person类中的变量值赋值给这些变量。
当Person类中的sayHello函数被调用时,堆中的对象可以通过成员方法区的地址找到sayHello方法。sayHello()方法会在堆中的内存中寻找变量的属性,同时在栈中创建一片内存,加载sayHello方法,在栈中获取堆中变量值并运行。
函数的重载
函数的功能是一样的,只是参与运算的未知内容不同时,可以定义多个函数,使用同一函数名称,虚拟机通过参数列表的不同来区分同名函数。
概念:在一个类中允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可。
好处:方便阅读,优化程序设计
-
函数重载:
同一个类中
同名称
参数个数不同,或者参数类型不同
与返回值类型无关
public static void eat(String a){} public static void eat(int a){}
参数的类型自动转换
当实参类型与任何一个方法的参数类型都不同时,Java会尝试从实参类型向上慢慢寻找能够自动类型转换的类型,当找到最近的能够转换的参数时将调用其方法。例如下文中存在两个参数分别定义了short和int类型的形参,但实参类型为byte类型。那Java就会从byte类型想上寻找最近的能够自动类型提升的形参,也就是short类型,并调用方法:
public class Index{ public static void main(String[] args){ byte b = 10; run(b); } public void run(int i){ System.out.print("in int"); } public void run(short f){//byte向上转型为short执行此处代码。 System.out.print("in short"); } }
匿名函数
没有绑定标识符的函数定义。匿名函数通常是被传递给高阶函数的参数,或者用于构造需要返回函数的高阶函数的结果。
System.out.print(“in short”);
}
}
匿名函数
没有绑定标识符的函数定义。匿名函数通常是被传递给高阶函数的参数,或者用于构造需要返回函数的高阶函数的结果。