Java如何解决代码的复用问题(1)-方法

一、什么是方法,为什么会有方法?

现在有两个需求,需要计算100和200的和,还有300和400的和。

//需求1:求100和200的和
int x =100;
int y =100;
int z = x + y;
//需求2:求300和400的和
int a =300;
int b =400;
int c = a+b

需求1和需求2在本质上是一样的,本来就可以只写一次的,如果没有方法,那么就会存在复用性很差。所以可以将上面写到方法里面,然后用变量去接受。

方法是一段可以重复利用的代码片段,并且这个代码片段是可以完成某个特定功能的,可以重复利用的代码片段。

注意:x、y、z在方法中都属于局部变量,方法结束以后,局部变量占用的空间会自动结束。

二、方法怎么定义,语法机制是什么?

[访问修饰符] 返回值 方法名(形式参数){

    方法体;
}

注意:

  (1)返回值类型可以是任何类型,基本数据类型和引用数据类型。

(2)返回值一般指的是一个方法执行结束之后的结果。方法就是为了完成某个特定的功能,方法结束之后大部分情况下都是有一个结果的,而体现结果的一般都是数据。数据得有类型,这就是返回值类型。

(3)当方法不返回任何值的时候,需要写上void。

(4)如果返回值类型“不是void”,那么在方法体执行结束的时候必须使用"return值";这样的语句来完成“值”的返回,如果没有"return值;"这样的语句编译器就会报错。

(5)如果返回值类型未void,那么方法体中可以写”return;“

(6)形式参数列表

形式参数列表中的每一个参数都是“局部变量",方法结束之后内存释放,形参的个数是:0~N个。

新参有多个的话使用"逗号,"隔开,逗号是英文的,形参的数据类型起决定性作用,形参对应的变量名是随意的。

(7)方法体

由Java语句构成。java语句以“;”结尾。方法体当中编写的是业务逻辑代码,完成某个特定功能,在方法体中的代码遵循自上而下的顺序依次逐行执行。在方法体中处理业务逻辑代码的时候需要数据,数据来源就是这些形参。

三、方法定义之后,如何调用?

//方法必须调用才能执行,语法是什么?
类名.方法名(实际参数列表);

注意:(1)实际参数和形式参数的类型必须要一一对应,个数要对应。

(2)如果返回值是int类型,可以用double接收吗?可以的,因为Int为小容量,double为大容量,自动类型转换。

(3)当一个方法有返回值的时候,可以不接受吗?可以,你可以返回值,我可以选择不这个值。返回之后内存马上释放,因为没有变量去接受。

Methord.sum(100,200);

四、在调用方法的时候类名什么时候省略掉?

在同一个类中,A方法调用B方法的时候,类名可以省略。如果不在同一个类中,类名.不可以省略。

	Public class MethodTest{
		Public static void main(String [] args){
			sayHello();
			 Myclass.sayHello()
		}
		Public void sayHello(){
		System.out.println("Hello");
		}
	
	}
	Class Myclass{
		Public void sayHello(){
		System.out.println("Hello");
		}
		
	}

五、方法执行过程中内存如何变化的

(1)JVM

首先警告编译阶段形成了.class文件,然后有类加载器classloader去加载.class文件到JVM虚拟机的方法区当中,虽然叫方法区,但是和方法没有半毛钱关系,虚拟机寻找main方法,从main方法中开始执行,main方法的内存会分配到栈中。 

(2)方法执行过程中内存是如何变化的:

方法调用时:压栈,分配空间。

方法结束时:弹栈,释放空间。

(3)栈中存储的是什么?

栈中存储的是方法执行的空间和存储方法的局部变量。

六、方法重载

(一)没有方法重载的代码


public int sum(int a,int b ){
    int sum = 0 ;
    sum = a+b;
    return sum ;
}

public double sum1(double a ,double b){
     double sum = 0;
    sum = a+b;
    return sum;
}

没有方法重载的代码的缺点:

(1)代码不美观

(2)程序员需要记忆更多的方法名称,比较累。

如果使用方法重载机制,解决之前的两个缺点:

(1)代码整齐美观

 (2)"功能相似"的,可以让"方法名相同",更易于以后的代码编写。

(二)什么时候会考虑方法重载?

在同一个类当中,如果"功能1"和"功能2"他们的功能是相似的,那么可以考虑将他们的方法名一致,这样代码既美观,又便于后期的代码编写。

(三)什么时候代码会发生方法重载?

条件1:在同一个类当中。

条件2:方法名相同

条件3:参数列表不同

参数的个数不同算不同,参数的类型不同算不同,参数的顺序不同算不同。

(四)方法重载和返回值类型没有关系,同时也和修饰符列表没有关系。

	Public static int m5(){
		Return 1;
	}
	Public static double m5(){
		Return 0.5;
	}
	Int m6(){
	
	}
	Public static double m6(){
		Return 0.5;
	}
	

七、方法的递归

(1)什么是方法的递归?

方法自己调用自己,这就是方法递归。

(2)当递归时程序没有结束条件,一定会发生栈溢出错误,所以递归一定要有结束条件。

(3)如果递归是有结束条件,就一定不会发生栈溢出错误吗?

不一定。有可能递归的太深了,导致内存不够用了。

(4)在实际开发中,如果有一天遇到了StackOverflowError,你怎么解决这个问题?

首先,第一步:

先检查递归的结束条件对不对,如果递归的结束条件不对,必须对条件进一步的修改,直到正确为止。

第二步:如果递归的条件没有问题,怎么办?

这个时候可以调整JVM的栈内存初始化大小,可以将栈内存的空间调整的大一点。

第三部:调整了大小,如果运行还有错误,只能继续扩大栈的内存大小。

八、判断以下方法是否合格?

Public class MyClass{

Public static int  main(String [] args){
	Boolean flag = true;
	If(flag){
	System.out.println("哈哈哈");
	}
}
}

 分析:编译器不会去判断flag是不是true,他只是认为flag是boolean类型的,if语句有可能执行也有可能不执行,不执行的话,就没有办法返回return了,所以会报错。

(2)如果我们在return后面写值呢?

 因为在reurn后面写值就会无法访问了。

九、总结

我个人感觉方法就是为了方便程序员开发,对代码进行封装的一种机制,这样做有利于对代码的复用,减少内存的开销,其实它和数学的函数很相似,都是有一种映射关系在里面,它是接受变量,变量又是存储数据的,同时方法里面可以写控制语句,方法名又是标识符,说到底就是把变量,标识符,控制语句等的一种杂烩。同时根本上是对数据的一种处理。

猜你喜欢

转载自blog.csdn.net/MyxZxd/article/details/105797522