文章目录
java–方法
一.了解
(1)方法的本质是什么:
方法就是一段代码片段,并且这段代码片段可以完成某个特定的功能,并且可以被重复利用。
(2)方法定义在类体中,在每一个类中可以定义多个方法,方法编写的位置没有先后顺序,可以随意。但,在方法体中不能再定义方法!
(3)方法体由java语句构成,方法体中的代码遵守自上而下的顺序依次执行。
二.关于java语言中的方法
1.方法怎么定义 【语法结构】
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体
}
2.对以上的语法结构进行解释说明
(2.1)对于修饰符列表
(2.2)返回值类型:
-
什么是返回值?
一个方法是可以完成某个特定功能的,这个功能结束之后大多数都是需要返回最终执行结果的,执行结果可能是一个具体存在的数据,而这个具体存在的数据就是返回值。 -
返回值类型
返回值是一个具体存在的数据,数据都是有类型的,此处需要指定的是返回值的具体类型。 -
返回值类型都可以指定哪些类型呢?
Java中的任何一个类型都可以,包含基本数据类型和所有引用的数据类型。 - 也可能这个方法执行结束后不返回任何数据,java中规定,当一个方法执行结束之后不返回任何数据的话,返回值类型位置必须填写:void关键字。
-
返回值类型可以是:
byte int long short float
double boolean char string
void … - 返回值类型若不是void,表示这个方法执行结束之后必须返回一个具体的数值,当方法结束之后没有返回任何数据的话编译器报错。
-
如何返回值?
reture 值;
且要求值的数据类型必须和方法的返回值一致,否则编译器报错。
***注意:返回值类型为void的时候,在方法体当中不能编写return值,但可以写return这样的语句。
只要带有return关键字的语句执行,return语句所在的方法结束【不是JVM结束,是return所在的方法结束】***
(2.3)方法名
(2.4)形式参数列表:简称形参
- 形参是局部变量:int a; double b; …
- 形参的个数可以是:0~N个
- 多个形参之间用“逗号”隔开。
- 形参中起决定性作用的是形参的数据类型,形参的名字就是局部变量的名字。
- 方法在调用的时候,实际给这个方法传递真实数据被称为:实际参数(简称实参)
- 实参列表和形参列表必须满足:
--数量相同
--类型对应相同
例如:方法定义
public static int sum(String 变量名,int 合法标识符){
}
(2.5)方法体必须由大括号括起来,方法体中的代码有顺序,遵循自上而下的顺序依次执行,并且方法体由java语句构成,每一个java语句由“;”结尾。
三.方法怎么调用
1.方法只定义不调用时是不会执行的,只有在调用时才会执行。
***语法规则:(方法的修饰符列表当中有static)
*** 类名.方法名(实参列表);
这是一条java语句,表示调用某个类的某个方法,传递这样的实参。
2.例子
例一:
/*
public表示公开的
class表示定义类
MethodTest01是一个类名
*/
public class MethodTest01{//表示定义一个公开的类,起名为MethodTest01,由于是公开的类,所以源文件名必须:MethodTest01.java
//类体
//类体中不能直接编写java语句,除声明变量之外
//方法出现在类体当中
//方法
//public表示公开的
//static表示静态的
//void表示方法结束后不返回任何数据
//main是方法名:主方法
//(String[] args)形式参数列表,其中String[]是一种引用数据类型,args是一个局部变量的变量名
//主方法就需要这样固定的编写,这是程序的入口【sun公司规定的,必须这样写】
public static void main(String[] args){
//这里的程序是一定会执行的
//main方法是JVM负责调用的,是一个入口位置
//从这里作为起点开始执行程序
//既然是这样,我们就可以在这里编写java语句来调用其他的方法
MethodTset01.sum(10,20);
}
//自定义方法,不是程序的入口
//方法作用:计算两个int类型数据的和,不要求返回结果,但是要求将结果直接输出到控制台
//修饰符列表:public static
//返回值类型 void
//方法名 sum
//形式参数列表(int i,int j)
//方法体:主要任务是求和之后输出计算结果
public static void sum(int i,int j){
System.out.println(i+"+"+j+"="+(i+j));
}
}
注:方法的调用不一定在main方法中,可以在其他方法当中,只要是程序可以执行到的位置,都可以调用其他方法。
例二:
public class MethodTest02
{
public static void sum(int a,int b){
System.out.println(a+"+"b+"="+(a+b));
//调用dosome方法
MethodTest02.dosome();
}
public static void main(String[] args){
MethodTest02.sum(1,2);
System.out.println("Hello World!");
}
public static void dosome(){
System.out.println("do some!");
}
}
方法的调用:
(1)方法的修饰符列表中有static关键字,完整的调用方法是:类名.方法名(实参列表)
(2)"类名."省略后,默认从当前类中找方法,若该方法不在当前类中,则编译报错。(分清楚什么时候能省略)
(3)建议在一个java源文件只定义一个class,比较清晰。
例三:利用“套娃”深刻理解
public class MothodTest03{
public static void main(String[] args){
System.out.println("main begin!");
m1();
System.out.println("mian 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方法最先被调用,main方法也是最后一个结束,最后调用方法是m3方法,该方法最先结束
3.方法的返回值不是void的时候:
(1)要求方法必须百分百执行“return 值;”这样的语句来完成值的返回,没有这个语句编译器会报错。
(2)一个方法有返回值的时候,当我们调用这个方法的时候,方法也返回了一个值,对于调用者来说,这个返回值可以选择接收,也可以不接收,但大部分情况下我们都选择接收。
4.深入return语句:
(1)带有return语句关键字的java语句只要执行,所在方法执行结束。
(2)在同一个作用域中,return语句下面不能编写任何代码,因为这些代码永远都执行不到,所以编译报错。
四.方法在执行过程中,在JVM中内存是如何分配的呢?内存是如何变化的呢?
1.方法只定义不调用,是不会执行的,并且在JVM中也不会给该方法分配“运行所属”的内存空间,只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间。
2.在JVM内存划分上有这样三块主要的内存空间:
- 方法区内存
- 堆内存
- 栈内存
3.关于栈数据结构
- 栈:stack,是一种数据结构
- 数据结构反映的是数据的存储形态
- 数据结构是独立的学科,不属于任何编程语言的范畴,只不过在大多数编程语言中要使用数据结构
- 作为程序员要提前精通:数据结构+算法
- java程序员在不精通数据结构和算法的前提下也能进行java开发,是因为java有一套庞大的类库支撑
- 常见的数据结构类型:
数组 队列 栈 链表 二叉树 哈希表/散列表
…
补充:关于栈内存存储机制
1.栈帧永远指向栈顶元素
2.栈顶元素处于活跃状态,其他元素静止
3.术语:
压栈/入栈/push
弹栈/出栈/pop
4.栈数据结构存储数据的特点是(看作是弹夹):
先进后出
后进先出.
从下图可以看出先压入弹匣的最后才会弹出
4.方法执行的时候代码片段存放在哪里?方法执行的时候内存在哪里分配?
- 方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将其放在了方法区当中,所以JVM中三块主要的内存空间最先有数据,存放了代码派片段的是方法区内存空间。
- 代码片段虽然在方法区内存中只有一份,但是可以重复被调用,每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配【栈内存中分配独立的内存空间】
5.方法在调用的瞬间,会给该方法分配内存空间,会在栈中发生压栈动作,方法执行结束后,给该方法分配的内存空间全部释放,此时发生弹栈动作。
6.局部变量在“方法体”中声明。局部变量运行阶段内存在栈中分配
五.方法执行内存分析
例子:
public class MethodTest04{
public static void main(String[] args){
int a = 10;
int b = 20;
int retValue = sumInt(a,b);
System.out.println("retValue="+retValue);
}
public static int sumInt(int i,int j){
int result = i+j;
int num = 3;
int retValue = divide(result,num);
return retValue;
}
public static int devide(int x,int y){
int z = x / y;
return z;
}
}
重点:方法调用的时候,在参数传递的时候,实际上传递的是变量中保存的那个“值”传过去了。
画内存分析图:1.只要涉及到参数传递的问题,传递的是变量中保存的值
2. 画图的时候,必须遵循自上而下的顺序执行这个原则。
六.方法重载机制(overload)
1.功能虽然不同,但是功能相似的时候,可以让程序员使用这些方法的时候就像在使用同一个方法一样,这样程序员以后编写代码比较方便,也不需要记忆更多方法名,代码也会很美观。
例5:
public class OverloadTest05
{
public static void main(String[] args)
{
System.out.println(sum(1,2));
System.out.println(sum(1.0,2.0));
System.out.println(sum(1L,2L));
}
//以下三种方法构成了方法重载机制
public static int sum(int a,int b)
{
System.out.println("sum(int,int)");
return a + b;
}
public static long sum(long a,long b)
{
System.out.println("sum(long,long)");
return a + b;
}
public static double sum(double a,double b)
{
System.out.println("sum(double,double)");
return a + b;
}
}
2.前提:
功能相似的时候,方法名可以相同(但是功能相同/不相似的时候,尽可能让方法名不同)
3.什么条件满足之后构成了方法重载:
4.方法重载和什么有关系,和什么没有关系?
原文地址:https://www.jb51.cc/wenti/3285640.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。