1.方法执行内存分析:
(1)方法在执行过程中,在JVM中的内存是如何分配的?内存如何变化?
方法之定义,不调用调用,是不会执行的,并且在JVM中也不会给给方法分配所属的内存空间
只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间
(2)在JVM内存划分上有三块主要的内存空间
*方法区内存
*堆内存
*栈内存
(3)关于栈的数据结构:
栈:stack,属一种数据结构,数据结构反映的是数据的存储形态,是独立的学科,不属于任何编
程语言的范,畴只不过在大多语言中使用数据结构,作为程序员需要精通:数据结构+算法
常见的数据结构:
-数组
-队列
-栈
-链表
-二叉树
-哈希表/散列表
...
(4)方法代码片段存在哪里?方法执行的时候执行过程的内存在哪里分配?
*方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放到了方法区,
当中,所以JVM中的中的三块主要的内存空间中方法区内存最先有数据,存放了代码片段
*代码片段虽然在方法区内存当中只有一份,但是可以被重复调用
每一次调用这个方法的时候,需要给这个方法分配独立活动场所,在栈内存中分配。
(5)方法在调用的时候,会给该方法分配独立的内存空间,会在栈中发生压栈动作,方法
执行结束之后,该方法分配的内存空间全部释放,此时会发生弹栈动作。
*压栈:给方法分配内存
*弹栈:释放该方法的内存空间
(6)局部变量在栈中存储,局部变量在方法体中声明
方法调用的时候,在参数传递的时候时间上传递的是变量中保存的那个值,传过去了
(8)会画图
2.方法的重载机制:
以下代码不适用方法重载机制,overload,分析程序缺点?
*sumInt,sumLong,sumDouble方法虽然功能不同,但是功能相似都是求和。
功能相似的方法,起了不同的名字,对于程序员记忆不方便,调用不方便
*代码不美观
有这样一种机制:方法重载。当虽然功能不同,但是功能相似的时候,可以让程序员使用这些方法的时候
就想在使用【同一个方法】一样,这样程序员比较方便,不必记忆更多的方法名
public class OverloatTest01
{
//入口
public static void main(String[] args){
//调用方法
int result1=sumInt(1,2);
System.out.printIn(result1);
double result2=sumDouble(1.0,2.0);
System.out.printIn(result2);
long result3=sumLong(1L,2L);
System.out.printIn(result3);
}
//定义一个方法,可以计算了两个int类型数据的和
public static int sumInt(int a,int b){
return a+b;
}
//定义一个方法,可以计算了两个double类型数据的和
public static double sumDouble(double a,double b){
return a+b;
}
//定义一个方法,可以计算了两个long类型数据的和
public static long sumLong(long a,long b){
return a+b;
}
}
优点:
程序员调用方法的时候,比较方便,虽然调用的是不同的方法,但是个感觉在使用一个方法一样,不需要
记忆更多的方法名
前提:功能相似的时候,方法名可以重名,但是功能不同的时候,尽可能让这两个方法名字不同
public class Overload02
{
public static void main(String[] args){
System.out.printIn(sum(1,2));
//参数的类型笔筒,对应调用的方法不同,此时区分方法不再依靠方法名了,依靠的是
参数的数据类型
System.out.printIn(sum(1.0,2.0));
System.out.printIn(sum(1L,2L));
}
public static int sum(int a,int b){
return a+b;
}
public static long sum(long a,long b){
return a+b;
}
public static double sum(double a,double b){
return a+b;
}
}
3.在什么条件下满足之后构成了方法重载?
*在同一个类当中
*方法名相同
*参数列表不同
数量不同
顺序不同
类型不同
4.方法重载和什么有关系,和什么没关系?
方法重载和方法名+参数列表有关系和返回值类型(void int等)、修饰符列表(public static)无关
5.方法的递归调用:
方法自身调用自身
a(){
a()
}
递归算法可以不用尽量不用,当出现java.lang.StackOverflowErrow发生了这样一个错误,不是异常,
是错误,栈内溢出错误。
递归如果没有结束条件,就会出现溢出错误
采用递归计算1-4的和:
4+sum(3)
4+3+sum(2)
4+3+2+sum(1)
4+3+2+1
public class DateTypeTest06
{
public static void main(String[] args){
int n=4;
int retValue=sum(n);
System.out.printIn(retValue);
}
public static int sum(int n){
if(n==1){
return 1;
}
return n+sum(n-1);
}
}