java零基础入门第九天 堆栈 局部变量 实例变量 构造函数

今天我们主要的任务是实例变量的局部变量生命周期,堆,栈,构造函数有个了解。

在我的对技能划分中,将对知识点的熟悉程度划分为:了解,熟悉,掌握,精通四个等级。

了解:就是有看过这个知识点,大体上的思路,功能能表述给别人听。

熟悉:有用这个知识点,能自己或者参照了第三方资料,使用这个知识点。

掌握:熟练运用这个知识点,对这个知识点,已经了如指掌。

精通:最好别想了,短期不是要看这个文章人的目标,就算工作几年,能自己独立做项目了,会数据库里的存储过程、触发器,会Linux写脚本,会自己搭建项目框架了。开始算作一个Java中级开发工程师了,这也只是说熟悉或掌握基础了。

先说下我们为什么要学习这章的目的,在工作中会碰到许多的bug,或者编写代码过程中,你要考虑到代码的运行情况,之前说过代码先执行主函数,那其他方法呢?他们是什么时候运行,什么时候结束呢?了解方法的运行情况,你在编写代码,寻找bug的过程中就能快速的实现或者定位到问题。

这就好像,我们现在学的java基础就像是武功招式,学的越精通用起来的时候威力就越大,如果学的差也没关系,只要你的对手不是太厉害,你已经足够应对,之后工作过程中再做具体的补充。等招式学完了,还有内功心法(算法)等你掌握了,那么你随便一掌就是开山劈石。我们不好高骛远,先学学堆跟栈。

堆与栈

一句话总结,栈跟堆都是java虚拟机为java程序分配的内存空间,栈用于方法调用和局部变量,堆用于所有对象。

堆上方法的运行情况如下图

栈我们可以用一句话表述方法的生命周期:先进后出,后进先出

局部变量 

仔细看下面的例子 注释要看哦

public class StackRef{
    public void foof(){
        barf();
    }

    public void barf(){
        //Duck d = New Duck(24);//将这个拆分为两步
          Duck d ;//1:申明引用变量
          d = New Duck(24);//2:创建对象 并与引用变量建立连接
        //这个我们已经讲了很多遍,但是还在讲,为什么呢?因为很重要啊
        //d是可以看做遥控器,指向new Duck(24);
        //new Duck(24);就创建在堆上,
        //后面还有如果d空了,或者不指向了,那么堆上的对象如果没有引用对象来指向了话,我们虚拟机会自动回收
        //而d的话就在barf()存在栈顶的时候 一起存在,如果barf()被弹出栈的时候,d也销毁
        //foof()先进后出 barf()后进先出
        //运行图如下图
    }

}


 

实例变量

刚刚我们说了,对象在堆上,如果对象带两个primitive主数据类型实例变量如下图

如果对象中带有引用对象的变量,但是没初始化引用的对象如下图

如果对象中带有引用对象的变量,有新建出一个对象那么就如下图

由此我们简单总结一句话:实例变量位于堆中,生命周期取决于对象的生命周期

构造函数

还是这句代码

Duck myDuck = new Duck();//这个看起来就像是一个Duck()方法

之前我们说过,我们是在巨人肩上开发,其实巨人帮我们做了很多事,Duck()不是方法,是Duck的构造函数,我们没有写这个构造函数,编译器会自动帮我们实现,我们当然也可以重写这个构造函数。例:

如果重写了构造函数,只要入参不一样,我们可以写很多个构造函数方法例如这样子

到这里我们可以对构造函数做一个回顾

现在我们要把两招分开练的招式串在一起,白鹤亮翅和白虹贯日这两招怎么串起来呢,父类继承怎么跟构造函数结合用?

继续看例子

这题答案选A,因为先进后出,后进先出,先执行的hippo,后执行的animal,所以先完成的animal的构造,再完成hippo的构造,也有另一种理解,先有父类,才会有子类。

如果要调用带参数的父类构造函数则如下图

都重写了animal 和hippo的构造函数,hippo中用super将参数传给了父类,而在main中我们将“buffy”做为入参传入hippo的构造函数。

所以第一步是先执行main将“Buffy”传入到hippo构造函数中。

第二步hippo构造数中,将Buffy作为形参 name 传给animal

第三步中animal构造函数中将 name的值作为形参 theName赋值给了name。

对象的生命周期

局部变量,就是在局部使用。

如图s只能在read中使用,当read结束的时候,s也销毁了,这里read没结束,s是活着,但是范围只限于read,所以sleep调用不到s。

实例变量,我们前面说过了,他存在对象中,如果对象存在,它就活着,如果对象死了,它也就死了。而判断对象是否销毁的依据是 是否有引用变量指向对象,如果没有引用变量指向,那么这个对象也就没有存在的必要,所以java虚拟机就会把它给回收了,顺带对象中的实例变量。以便腾出更多的内存,防止内存溢出。

没有引用变量指向的对象会被回收,那么怎么让引用变量不指向对象呢?

第一种将 引用变量放入方法中,当方法结束了,引用变量都销毁了,那么肯定没有引用变量指向对象了

void go(){
    Life z = new Life();
}

第二种 引用变量被赋值其他的对象

Life z = new Life();//第一个new Life();因为没有指向,很快就会被销毁
z = new Life();

第三种 直接将引用变量设定为null

Life z = new Life();=//第一个new Life();当z被赋值为null的时候就会被销毁
z = null;

具体的流程图可以看书本261-263页

总结下今天的内容:堆,栈,局部变量,实际便量,对象,构造函数,java内存。

局部变量存在在方法中,方法跟局部变量存在栈上,先进后出,后进先出,当方法退出栈顶的时候,局部变量也就销毁,实例变量存在对象中,与对象同生共死,对象是无引用变量指向的时候就会销毁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值