day8-方法与占用内存

方法的定义和概念:

方法是什么:某个功能的代码只需要写一遍,要使用这个功能只需要给这个功能传递数据,这个功能完成后返回的一个最终结果,就是方法,使用这个方法我们称为“调用/invoke”

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

方法是定义在类体当中的,不能定义在方法之中。类体当中的方法没有先后顺序,可以随意。

方法的语法结构:

        【修饰符列表】返回值类型 方法名(形式参数列表){

方法体        

}

返回值的类型:返回值是一个具体存在的数据,数据都是有类型的,此外需要指定的是返回值的具体类型。

返回值类型可以指定的类型:java中任意一种类型都可以,包括基本数据类型还有所有的引用数据类型。

也可能这个方法在执行结束以后不返回任何数据,java中规定,当一个方法执行结束之后不返回任何数据的话,返回值类型位置必须编写:void关键字

返回值类型可能是:byte、short、int、long、string、float、double、char、void

返回值类型若不是void,表示这个方法执行结束之后必须返回一个具体的数值。当方法执行结束的时候没有任何数据的话编译器就会报错。

运用“return  值”来返回,要求之“值”的数据类型必须和方法的“返回值类型”一致,不然编译器报错

返回值类型是void的时候,方法体之中不能编写return语句,但是注意可以编写“return;”

只要带有return关键字的语句执行,那么return执行后,该方法执行结束。

方法名:

方法名只要是合法的标识符就行,最好见名知意,方法名最好是动词,首字母要求小写,后边每一个单词的首字母大写。

形式参数列表(形参):形参是局部变量,形参是局部变量 int a, double b, float c ,string d... 形参的个数可以是0-n, 多个形参之间可以用“,”隔开,形参中起决定作用的是形参的数据类型,形参的名字就是局部变量的名字。
        方法在调用的时候,实际给这个方法传递的真实数据被称为:实际参数(实参)

        实参列表和形参列表必须满足:数量相同, 类型对应相同

方法体由{}包括起来,方法体当中的代码是由顺序的,遵循自上到下的顺序依次执行。并且方法由java语句构成,每一个java语句由“;”结尾。

方法的调用:

方法之定义不去调用时是不会执行的,只有在调用的时候才会执行。

方法的修饰符列表当中由“static”关键字,完整的调用方式是“类.方法名(实参)". 在由static关键字的时候,可以省略类名,然后直接调用方法。
但是!在调用别的类中的方法时,不能省略类名

一个方法在有返回值的时候,当我们调用一个方法的时候,对于调用者来说可以选择接收,也可以选择不接收。但大部分情况下,我们都是选择接收的。一般情况下,我们定义一个变量去接收返回值。

深入return语句:

带有return关键字的java语句只要执行,所有的方法执行结束。 

”同一个作用域“当中,return语句下面不能编写任何代码,因为这些代码永远执行不到,所以编译报错。

return出现在返回值为void类型的方法之中,只要是为了终止方法的运行。

方法在执行过程当中,在JVM之中的内存是如何分配?

1.方法只定义但是不调用,是不会执行的,并且在JVM之中也不会给该方法分配“运行所属”的内存空间。只有在方法调用的时候,才会动态的给这个方法分配内存空间。

2.在JVM内存划分上有这样三块主要的内存空间:方法区内存、堆内存,栈内存

3.关于栈数据结构:

        栈结构:stack,是一种数据结构

        数据结构反应的是数据的储存形态

        数据结构是独立的学科,不属于任何编程语言的范畴,不过在大多数编程语言当中要使用数据结构。

        作为开发者需要提前精通:数据结构 + 算法

        常见的数据结构:数组、队列、栈、链表、二叉树、哈希表、散列表等 

 4.方法代码片段存在哪里? 方法执行的时候执行过程的内存在哪里分配? 

    方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放在了方法区当中。所以JVM中的三块主要的内存空间中方法区内存最先有数据,存放了代码片段。

     代码片段虽然在方法区内存当中只有一份,但是可以被重复调用,每一次调用该方法的时候需要给方法分配独立的活动场所,在栈内存中分配。【栈内存中分配方法运行的所属内存空间】

5.方法在调用的时候,会给该方法分配内存空间,会在栈中发生压栈动作,方法执行结束后,会给该方法的内存空间全部释放,发生弹栈动作。

        *压栈:给方法分配内存

        *弹栈:释放该方法的内存空间

6.局部变量在“方法体”中声明,局部变量运行阶段内存在栈中分配。 

 方法初步:

**方法在调用的时候,传递参数的同时,传递的不是变量的名称,而是变量的“值”,在栈内存当中,一个方法无法调用另一个方法的参数名称,只能传递“值”。

方法的重载机制(overload):

功能不同但是却功能相似的情况下,方法的重载机制可以让代码更加的美观。这种机制就是重载机制(overload)。

public class partOverload {
    public static void main(String[] args) {
        System.out.println(sum(1,2));
        System.out.println(sum(1l,2l));
        System.out.println(sum(1.0,2.0));
    }
    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;
    }
}

方法重载被称为overload

功能相似的时候,尽可能让方法名相同,但是功能相同/不相似的时候,尽可能让方法名不同。

什么条件满足以后构成了方法重载呢? 
*在同一个类中
*方法名相同
*参数列表不同:数量不同、顺序不同、类型不同

方法重载与什么有关,与什么无关? 

**方法重载何方法名+参数列表有关系,与返回值类型无关,与修饰符类型无关。

(即返回值类型不同,无法使用方法重载,修饰符类型不同,无法调用方法重载)

方法递归调用:

1.什么是递归? 

递归就是方法本身自己调用自己

2.递归是很耗费栈内存的,递归算法可以不用就尽量不要使用

3.栈内存内存溢出时产生错误,JVM将停止工作。

4.递归必须有结束条件,没有结束条件一定会发生栈内存溢出错误。

5.递归即使有了结束条件,结束条件正确,也会发生栈内存溢出错误,可能是因为递归的太深了导致压栈使得栈内存发生溢出。

public class partCircle {
    public static void main(String[] args) {
    circle(1);
    }

    public static void circle(int i){
        i++;
        System.out.println("begain");
        if(i<5){
            circle(i);
        }else{
            System.out.println("end");
        }
    }
}

直接利用递归来计算累减

public class partCircle2 {
    public static void main(String[] args) {
        int sum = sum(20);
        System.out.println(sum);
    }
    public static int sum(int n){
        if(n == 1){
            return 1;
        }
        return n +sum(n-1);

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值