方法执行内存分析
1.JVM内存划分中三种主要的内存空间:
- 方法区内存
- 堆内存
- 栈内存
2.栈 数据结构
栈是一种数据结构,反映数据的存储状态。
数据结构不属于任何一门编程语言,它本身就是一个学科
常见的数据结构: - 数组
- 队列
- 栈
- 链表
- 二叉树
- 哈希表、散列表
栈的理解
3.方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候将它放到了方法区当中,所以jvm中的三块主要的内存空间中方法区内存最先有数据,存放了代码片段。代码片段在方法区只有一份,但可以被重复调用。
4.调用这个方法时,需要给这个方法分配独立的活动场所 ,是在栈内存中分配的。栈内存中分配方法运行的所属内存空间。 - 方法在调用的瞬间,给他分配内存空间,此时栈中发生压栈动作。方法执行结束之后,会给该方法分配的内存空间全部释放,此时发生弹栈动作。
6.局部变量作用范围在方法体内,是在方法体中声明的,运行阶段的内存也是在栈中分配的,所以弹栈后它就没有作用了。
7.方法调用时,它们之间传递的是参数的值,而不是参数
方法递归
-
那些场景下可以使用递归解决问题?
1.一个大问题可以拆分成多个子问题的解
2.拆分后的子问题和原问题除了数据规模不一样,他们解决思路完全相同
3.存在递归终止条件。 -
如何写出递归代码?
一定要注意方法的语义(这个方法能做什么),不要纠结这个递归如何实现
需要思考如何使用这个方法解决问题
不要当作是自己调用自己,认为是调用的别人写好的代码
eg:
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
int num= scanner.nextInt();
System.out.println(jieCheng(num)+" "+factor(num));
}
public static int jieCheng(int num){
int n=1;
for (int i = 1; i <=num ; i++) {
n*=i;
}
return n;
}
//传入一个值就能返回他的阶乘
public static int factor(int num ){
//终止条件
if(num==1){
return num;
}
//拆分问题
//现在已经知道num但是不知道num-1的结果,因此将num-1交给factor
return num*factor(num-1);
}
使用递归方法实现一个数的阶乘
多态
通过父类型引用指向子类对象、通过接口回调实现多态。
多态中涉及到的概念:
向上转型、向下转型(强制类型转换,需要加强制类型转换符)
eg:动物为父类、猫、狗为子类
class 动物{
public void sheng(){
System.out.println("动物的声音");
}
}
class cat extends 动物 {
public void sheng(){
System.out.println("喵喵");
}
public void eat(){
System.out.println("一条小鱼");
}
}
class dog extends 动物{
public void sheng(){
System.out.printl("汪汪");
}
public void eat(){
System.out.println("骨头");
}
}
public class yunxing{
public static void main(string[]args){
动物 c1=new cat();//上转型、自动类型转换
c1.sheng();
动物 c2=new dog();
dog b1=(dog)c2;//下转型。这个就是强制类型转换。
}
}
上转型只要编译通过,运行就不会出错。
下转型当对象之间不存在继承关系,运行会报错。
如:动物a3 = new dog(); cat c3 =(cat)a3
为了避免这种错误,可以使用instanceof运算符;
instanceof
1.语法格式:
(引用 instanceof 数据类型名)
2.运算符的执行结果类型是布尔类型,(true、false)。
3.引用格式:
假设(c3 instanceof cat)
ture表示引用指向的对象是cat类型,false表示不是。
eg:
if(a3 instanceof cat){
cat c3=(cat)a3;
c3.方法名();
}else if(a3 instanceof dog){
dog b3=(dog)a3;
b3.方法名();
}
内部类
1.内部类分为:成员内部类、静态内部类(方法构造时加static)、局部内部类(只在一定范围内作用,超出区域无法访问)、匿名内部类
2.访问时,内部类可以直接访问外部类中的成员,包括私有成员。访问方式:外部类名.this
但是外部类去访问内部类时必须要建立内部类的对象。
eg:成员内部类
//调用时主方法中
A p1=new A();
A.B b=p1.new B();
//
class A{
int a;
public void h(){
System.out,println("这是外部类");
}
class B{
public void c(){
System.out.println("这是内部类");
}
}
}
匿名内部类就是在调用时格式:new 外部类名或接口名(){
代码体(可自定义)
}
本文详细探讨了Java中方法执行的内存分配,包括栈内存、堆内存和方法区的作用。阐述了递归的概念和应用场景,并通过实例展示了如何编写递归代码。此外,还解释了多态的概念,包括向上转型和向下转型,并通过动物类和猫、狗子类的例子进行了说明。最后,介绍了内部类的不同类型及其访问特性。
424

被折叠的 条评论
为什么被折叠?



