Java学习记录2.0

本文详细探讨了Java中方法执行的内存分配,包括栈内存、堆内存和方法区的作用。阐述了递归的概念和应用场景,并通过实例展示了如何编写递归代码。此外,还解释了多态的概念,包括向上转型和向下转型,并通过动物类和猫、狗子类的例子进行了说明。最后,介绍了内部类的不同类型及其访问特性。

方法执行内存分析

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 外部类名或接口名(){
代码体(可自定义)
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值