目录
1.什么是方法?
定义:一段可以完成某个特定功能且可重复调用的代码,能提高代码的复用性
注意:
- 方法定义在类体中,一个类中可以定义多个方法,方法编写的位置没有先后顺序之分
- 方法体中不能再定义方法【函数里面不能再定义函数】
- 方法体由Java语句构成,遵循自上而下的顺序
2.定义方法的语法格式
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
例如:public static int as(int a,int b){
int c=a+b;
System.out.println(c);
return c;
}
*注释:1.修饰符列表项不是必须的,大部分情况下写成public static;如果修饰符列表有"static"
关键字的话,调用这个方法的正规格式为:类名.方法名(实际参数列表)
2.返回值类型:顾名思义,返回数据的类型,这个选项是可选的,如果没有返回值,写void,
此时方法体中不能出现"return 值",但是可以出现"return;",如果有返回值,返回值可以是
Java中的任意数据类型,包括基本数据类型和引用数据类型且方法体中必须有return语句,
后面数的类型必须和返回值类型一致
3.方法名:方法名最好做到见名知意,首字母小写后面的每个单词首字母大写
4.形参:这个选项是可选的,表示传给方法的模拟参数,与调用时传入的实参必须一致,传入的实参可
以是变量也可以是字面值。形参时局部变量,定义方法时定义了形参再调用时必须有实参
5.方法体:方法体必须由大括号括起来,由Java语句构成,遵循自上而下顺序
3.方法调用注意点
1.一个方法中可以调用其他方法,但是不可以再定义方法
public class Method {
//主方法【程序的入口】
public static void main(String[] args) {
Method.sum (12,13);
//输出结果:25
// hello world
}
//求和方法
public static int sum(int a,int b){
int c=a+b;
System.out.println(c);
some();//求和方法中调用输出hello world字符串方法
return c;
}
//输出hello world字符串方法
public static void some(){
System.out.println("hello world");
}
}
2.方法调用时要求新参与实参个数对应相同,数据类型对应相同。类型不同的时候要求能够进行相应的自动类型转换【比如定义的形参为long,传入的实参为int,小容量向大容量转换可自动转换】
3.前面我们说到,如果方法修饰符包含'static'关键字。正规的调用格式为:类名.方法名(实参),但是如果这个方法在同一个类中,在调用时可以省略类名,但是这个方法在其他类中则需要加上这个类名通过点语法调用
//定义一个公开的类
public class Method {
//主方法
public static void main(String[] args) {
//调用Method本类中的sum方法可以省略类名
sum(12,13) ;//输出25
}
//求和方法
public static int sum(int a,int b){
int c=a+b;
System.out.println(c);
return c;
}
}
//定义一个普通的类
class A{
//主方法
public static void main(String[] args) {
//在A类中调用Method类中的sum方法不可以省略类名
sum(12,13);//报错在A类中找不到方法
}
}
4.方法调用后的返回值我们可以选择接收也可以选择不接受,接收用的变量类型要与返回值类型一致或者可以进行自动类型转换
public class Method {
//主方法
public static void main(String[] args) {
//调用不接收返回值return
sum(12,13);
//调用接收返回值
int i=sum(12,13);
System.out.println(i);//25
}
//求和方法
public static int sum(int a,int b){
int c=a+b;
System.out.println(c);
return c;
}
}
4.return语句使用注意点
1.如果方法有返回类型,return最好放在整个方法的最后面,因为return后面不能写任何代码,后面的代码将永远不会执行
public class Method {
//主方法
public static void main(String[] args) {
}
public static int some(){
int a=10;
if(a>3) {
return 1;
System.out.println();//!报错无法访问的语句
}
return 0;
System.out.println();//!报错无法访问的语句
}
}
2.return语句放在一些分支判断语句或者循环语句中都会出现编译器检测到return有可能不会执行导致报错
//if分支
public class Method {
//主方法
public static void main(String[] args) {
}
public static int some(){
int a=10;
if(a>3) {
return 1;//!报错缺少返回语句,因为虽然10>3会返回true,但是编译器任然认为
//return语句存在无法执行到的风险
}
}
}
//循环
public class Method {
//主方法
public static void main(String[] args) {
some();
}
//some方法
public static int some(){
for(int a=0;a<10;a++){
return 1;//!报错缺少返回语句,编译器认为return语句存在无法执行到的风险
}
}
}
4.return语句一旦遇到会直接结束整个方法
public class Method {
//主方法
public static void main(String[] args) {
some();
}
//some方法
public static void some(){
for (int a=0;a<100;a++){
if(a==5){
return;//尝试把return换成break观察他们的返回结果
}
System.out.println("a--->"+a);
}
}
}
输出结果:
a--->0
a--->1
a--->2
a--->3
a--->4
5.形参与实参转换注意点
1.如果传入的基本数据类型,在方法体中对形参的改变不会影响实参的值
public class Method {
//主方法
public static void main(String[] args) {
int num=1;
some(num);
System.out.println(num);//1
}
public static void some(int num){
num=100;
}
}
2.如果传入的引用数据类型,在方法体中对形参的改变会影响实参的值
6.方法执行过程中的内存分配
JVM内存划分主要有三块主要的内存空间:方法区内存、堆内存、栈内存。当我们的Java文件编译后生成的字节码文件会被分配到方法去内存中,当这个Java文件运行时会首先调用main主函数,此时JVM会为方法分配内存空间,将main压入栈中,此时main在栈底,执行到main中其他方法后也为其分配内存空间,继续压入栈中,直至整个方法结束,方法陆续出栈,【类似JS中的执行上下文,可查看JS专栏详细了解】
7.方法重载
定义:在一个类中定义多个同名的方法,但要求每个方法具有不同的参数类型或参数的个数【当多个方法功能相似时,尽可能保证方法名相同】
public class Over {
public static void main(String[] args) {
sum(12,13);//25
sum(12.5,13.6);//26.1
sum(1L,66L);//67
}
public static void sum(int a,int b){
int c= a+b;
System.out.println(c);
}
public static void sum(double a,double b){
double c= a+b;
System.out.println(c);
}
public static void sum(long a,long b){
long c= a+b;
System.out.println(c);
}
}
//什么情况下可以使用方法重载?
1.同一个类中
2.同一个方法名
3.不同的参数列表:-数量不同
-顺序不同
-类型不同
注意:方法重载只与方法名和参数列表有关系,与返回值类型和修饰符没有关系
8.方法递归
方法调用自身【需要配合return语句使用】
public class 递归 {
public static void main(String[] args) {
some();
}
public static void some(){
System.out.println("a");
some();//调用自身
System.out.println("b");
}
}
输出结果:
a
a
a
...
//b永远也不会输出,因为没有return结束语句,递归方法如果没有结束语句将一直调用自身,无法结束
总结:
- 能不递归尽量不要递归,因为递归非常耗费栈内存
- 递归必须有return结束语句,否则将陷入无限递归