day04方法、递归和内存分析

一、 方法

1.1 概述和作用
一堆代码的集合,可重复使用

1)使程序变得更简短更清晰
2)有利于程序维护
3)提高程序开发效率
4)提高代码重用性

  • 方法目的 : 代码重用

  •  相同的操作,不用重复写多遍代码
    
  • 方法就是有名字的代码块 : 一个大括号{} 就是一个代码块/语句块/代码段

  • java 中只有方法, c 中只有函数, C++就不一样了,写在类中,叫方法,写在类外叫函数

  • 或者说 面向对象语言中 只有方法,面向过程中只有函数

  • 函数 是可以直接调用的,不需要二次引用
    1.2 方法声明

  • 方法声明 :

  • 结构 : [修饰符列表] 返回值类型 方法名 (参数1,参数2,参数3…) { 方法体; }

    [] 加中括号 说明 可以有,可以没有,可以有多个

    修饰符 :
    权限控制 : public , protected , private 三选一 ,
    其他修饰 : static ,synchronized abstract , final 二选一

    返回值类型 : 11种数据类型任意一种即可,如果不需要 返回值,就写 void

    方法名 : 合法标识符即可

  • 参数列表

  •  	形参 : 方法的声明处,规定传入的数据的类型以及个数
    
  •  	实参 : 方法的调用处,传入具体的数据
    
  • 方法体 : java代码

  • return : 终止方法执行,并且return后不可以写代码

  • 1 没有返回值类型的时候(void) : return可以有 可以没有,如果有,return只能起到结束方法运行的作用,并且 语法是 return;

  • 2如果有返回值的情况下(不是void) : 方法体中 必须要有return语句,并且return语句需要跟一个返回的数据,语法是 : 比如返回值为 int ,那么格式为return int值 ;

1.3 方法调用

  • 方法调用 :
  •  方法不调用,不执行,调用才执行,并返回到调用处
    
  • 方法定义的时候,是不执行的,也就意味着,编写方法的时候,不需要考虑先后顺序
  •  只需要考虑 调用顺序即可
    
  • 特殊方法main :
  •  JVM自动调用main方法
    

1.4 方法分类

  • 方法分类和调用
  •  变量分类 : 
    
  •  		局部变量 : 方法内声明的变量
    
  •  		静态变量 : 类体中使用static修饰的变量
    
  •  		成员变量 : 类体中没有使用static修饰的变量
    
  •  变量调用 : 
    
  •  		局部变量 : 方法内部之间写变量名调用
    
  •  		静态变量 : 类名.静态变量名,并且当前类中类名可以省略
    
  •  		成员变量 : 对象引用.成员变量名
    
  •  	如何区分同名的静态变量和局部变量 : 类名调用
    
  •  方法分类 : 
    
  •  静态方法 : 使用static修饰的方法,并且静态方法中不能有非静态引用
    
  •  成员方法 : 没有使用static修饰的方法
    
  •  构造方法 
    
  • 方法调用 :
  •  		静态方法 : 类名.静态方法名(参数);,当前类中 类名 可以省略
    
  •  		成员方法 : 对象引用.成员方法名(参数);
    

1.5 方法重载

  • 如何确定方法的唯一性?
  •  	名字 参数列表
    
  • 方法重载 overload : 方法名相同,参数列表不同就是方法重载
  •  	参数列表不同 分为 : 个数不同和类型不同
    
  1. 栈内存
  • 程序 : 可执行文件,静态概念,一般保存在硬盘中
  • 进程 : 正在执行的程序,是个动态概念,会把指定的程序载入内存中执行
  • 运行起来的程序,就是指载入到内存中的可执行文件,这个时候操作系统会开启一个进程来运行这个文件对象,如果我们想要关闭某个程序,只需要杀死这个进程即可
  • java中的内存划分和管理
  •  java Runtime Data Area : java运行时数据区域,我们也可以叫JVM内存
    
  • 首先,内存被划分为 五个区域 : 程序计数器 , 方法区/静态区/静态代码段 , 栈内存(虚拟机栈/VM栈) , 堆内存 , 本地方法栈
  •  程序计数器 : 
    
  • 占用较小的一块空间,作用可以看做是当前线程执行的字节码的位置的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖于这个计数器来完成
  •  	可以理解为保存下一条语句的行号,依次向后递增
    
  •  静态区 : 
    
  • 是用来存放我们的程序文件的,载入到内存之后的程序文件对象的一段空间,java中就是指我们的class文件
  •  	包括方法,方法在被调用之前,都是以静态的形式被保存到静态区的
    
  •  	静态区中还有运行时常量池
    
  •  栈内存 :
    
  •  	以栈数据结构为模型,创建一段内存空间
    
  •  	栈数据结构特性 : 先进后出,像弹夹 
    
  •  	用来执行方法,局部变量也是在栈内存
    
  •  栈的构成
    
  •  	栈空间 : 就是指以栈数据结构为模型的一段内存空间
    
  •  	栈帧 : 栈内存中,每一个栈元素,叫栈帧
    
  •  	栈顶元素 : 最后一个方进入的栈帧
    
  •  	栈底元素 : 第一个放进去的栈帧
    
  •  栈的操作 : 
    
  •  	压栈 : 就是指把元素放入栈空间的过程
    
  •  	弹栈 : 就是把元素从栈空间中弹出的过程
    
  •  java中,方法调用,就是压栈操作,方法执行完 就是弹栈操作
    
  •  堆内存 : 
    
  •  	用来存放对象,根据静态区中的class文件对象,创建的对象
    
  •  	每个对象空间,分为3块
    
  •  		数据部分 : 成员变量
    
  •  		头部	: hashCode值
    
  • 类型 : 是哪个类创建的对象,保存的是类文件在静态区的地址,所以在成员方法中是可以直接访问静态属性的
  •  本地方法栈 : 
    
  •  	用来执行native声明的方法,比如Object类中的hashCode()方法
    
  • java程序的执行流程 :
  •  	1 java程序编写
    
  •  			文本编辑器,按照java规范编写代码
    
  •  	2 java程序的编译
    
  •  			javac  进行编译 生成 class文件
    
  •  	3 java程序调用
    
  •  			java xxxx
    
  • 3.1 开启java虚拟机,然后把程序对应的class文件,载入静态区
  • 3.2 jvm自动调用该class的main方法,并且只有一个main方法,固定写法,java是单入口程序
  • 3.3 main被调用之后,jvm就会在栈内存开辟栈帧,把main中的代码复制进去,然后开始执行
  •  		3.4 main方法执行流程
    
  •  			3.4.1  在main方法中没有其他方法调用
    
  •  					执行完main方法之后,main栈帧弹栈,结束,jvm关机
    
  •  			3.4.2 main中有其他方法调用
    
  • 如果调用了当前类的方法,会在main方法栈帧之上,开辟新的栈帧,并把对应的代码复制进去开始执行,直到执行结束,返回到main栈帧的调用处,继续执行main方法
  • 如果调用了其他类的方法,把对应的类载入到静态区,然后再开辟栈帧,复制代码,执行,执行完返回main,继续执行
  • 如果被调用方法中,还有其他方法调用,就继续压栈,一直到main方法执行结束,弹栈,jvm关机
  •  程序加载 : 
    
  • 静态加载 : 程序开始执行,首先把所有和该程序相关的文件,全部一次性从硬盘载入内存
  • 动态加载 : 程序开始执行,只会载入当前用到的文件,如果执行过程中,需要其他文件,再去硬盘中载入
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值