方法

方法的本质:

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

定义在java类体中,方法体中的代码自上而下,方法编写的位置没有顺序,可以随意。

方法的语法结构:

  [修饰符列表] 返回值类型 方法名[形式参数列表]{

    方法体;

  }

关于修饰符列表:可以选项不是必须的目前是public static,有static调用:

    类名.方法名[实际参数列表];

关于返回值类型:一个方法是可以完成某个特定功能,这个功能完成之后大多数都是需要返回最终执行结果的,执行结果可能是一个具体存在的数据,只要是数据一定会有类型。而这个具体存在的数据就是返回值。返回值是一个具体存在的数据数据是有类型的,此处是需要制定的是返回值的具体类型。返回值类型都可以指定哪些类型呢?java任意一种类型都可以包括基本数据类型和所有的引用数据类型。这个方法的返回值类型是void表示没有返回任何值  

如果有返回值类型就是用:return 值;

只要带有renturn关键字的语句执行,return语句所在的方法结束。【不是JVM结束是所在的方法结束】

 

方法名:最好见名知义,首字母小写后面每个单词大写,遵循驼峰命名方式。能用字母数字下划线美元符号等组成,一般起的名字就是功能的大意。

形式参数类别简称形参

  形参是局部变量,形参的个数可以有无数个0-N个

  形参中起决定性作用的是形参的数据类型,形参的名字就是局部变量的名字。

  方法在调用的时候,实际给这个方法传递的真实数据被称为:实际参数,简称实参。

方法调用:

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

  语法规则:

  方法的修饰符列表当中有static:类名.方法名(实参,这个实参是实际的形参中的参数类型数据,是java语句)

 

方法体必须有大括号括起来,方法体当中的代码有顺序,遵循自伤而下的顺序依次执行。

并且方法体由java语句以;结尾

 

方法调用的时候是实参和形参个数一样,数据类型一样或者存在自动转换类型

方法如果有static修饰符那么类名可以省略 如果没有static那就需要加上类名.方法名

 

 

 

 建议在一个java源文件当中定义一个class,比较清楚

 


public class MethodTest05
{
public static void main(String[] args){
System.out.println("main begin");
m1();
System.out.println("main over");

}
public static void m1(){
System.out.println("m1 begin");
m2();
System.out.println("m1 over");
}

public static void m2(){
System.out.println("m2 begin");
m3();
System.out.println("m2 over");
}
public static void m3(){
System.out.println("m3 begin");

System.out.println("m3 over");
}
}

main begin
m1 begin
m2 begin
m3 begin
m3 over
m2 over
m1 over
main over

 

 

方法的返回值类型不是void的时候要求方法必须保证执行return值,美欧这个语句编译器会报错


public class MethodTest06
{
public static void main(String[] args){
//需求请定义并实现一个方法,该方法可以计算两个int类型数据的商
//要求将最终的计算结果返回给调用者

System.out.println(division(10,3));

}
public static int division(int a,int b){
return a/b;
}
}

 

深入return语句:return必须被执行
  带有rerurn关键字的java语句只要执行所在的方法执行结束。

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

 

//编译报错:缺少返回语句,以下程序编译器任何无法保证"return 1"会执行。
public class MethodTest07
{
public static void main(String[] args){
System.out.println("m2 over");
}
public static int m(){
int aa=10;
if(aa>3){
return 1;
}
}
}

 


public class MethodTest07
{
public static void main(String[] args){

System.out.println(m());
}
/*
public static int m(){
int aa=10;
if(aa>3){
return 1;
}
}
*/
public static int m(){
int aa=10;
if(aa<3){
return 1;
}
return 0;

}
}

 

简单写:

public static int m(){
    return 10>3?1:0;
}

 

在返回值类型是vod的方法中还是用“return”语句

 


public class MethodTest08
{
public static void main(String[] args){

m();
}

//编译报错 对于结果类型为void不能直接写return
/*
public static void m(){
return 10;
}
*/

//这个方法 是为了结束整个方法 不是for循环

//break结束的是for循环不耽误后面的语句输出

public static void m(){
for(int i=0;i<10;i++){
if(i==5){
//return;0 1 2 3 4
break;// 0 1 2 3 4 HelloWorld
}
System.out.println(i);

}


System.out.println("HelloWorld");


}

}

 

 

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

方法只定义不调用是不会执行的,并且在JVm中也不会给该方法分配“运行所属”的内存空间

在JVM内存划分上有这样三块主要的内存空间(当然除了三块之外还有其他的内存空间)

方法内存

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

  方法代码片段存储在方法内存中。 

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

  代码片段虽然在方法区内存当中只有一份但是可以被重复调用每次一次调用这个的时候需要给该方法分配活动场所,在栈内存中分配。(小说中的故事情节是方法区 导演在各个区比如海淀区朝阳区演电视剧这个场所就是栈内存)【栈内存中分配方法运行所属内存空间】

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

局部变量是在栈中分配内存

栈内存 stack 是一种数据结构 数据的存储数据结构是独立的学科不属于任何编程语言 数据结构+算法

常见的数据结构:

  数组

  队列

  栈

    栈帧永远指向栈顶元素

    栈顶元素处理活跃状态,其他元素静止

    压栈push  

    弹栈pop

    栈数据结构存储数据的特定是:先进后出  后进先出

  链表

  二叉树

  哈希表/散列表

  ……

堆内存

posted @ 2019-12-07 21:01  动起来mygod  阅读(200)  评论(0)    收藏  举报