前言:上一篇中我们介绍了new关键字 点击打开链接,new一个类,实际上就是调用该类的构造函数,返回该类的对象。如a = new Animal();返回的对象赋给变量a。我们来分析一下内存分配的步骤,new一个类,实际上就创造了一个对象,就要为这个对象分配内存来存储成员变量,放在哪里?放在了堆内存中。那么把这个对象赋给a,需要再开辟一块儿堆内存然后复制成员变量么?答案是否定的。实际上a是一个引用变量,它只存储内存的地址,系统会让这个引用变量指向对象的内存,而不会重新开辟。所以,如果希望垃圾回收机制回收某个对象,那么只需要切断该对象所有引用变量和该对象(该内存空间)的关系,即a=null;内存将会自动被回收。

那么a存放在哪里?a存放在栈中。

this:this关键字引用(指向)调用该方法的对象。但倘若this出现在构造器中则是引用该构造器正在初始化的对象。那么this到底有什么用?我们会遇到这种情况,一个方法中需要调用另一个方法,由于调用任何方法都需要对象,那么如果调用的是本方法对象中的另一个方法,则用this关键字来表示这个对象。当然,不用this关键字,同一个对象中的方法可以相互调用,但是其本质还是隐式的调用了this方法。

那么问题就来了1:static修饰的方法中,是否可以调用非static修饰的成员方法?答案:否,因为调用方法实际上隐式的调用了this来告知对象是谁,但是static修饰的方法是属于类的,而不是属于对象的。所以无法找到对应该方法的对象。也就是不能使用this,也就无法调用其他方法了。

那么问题就来了2:static修饰的方法中,是否可以调用static修饰的成员方法?答案:是,因为调用static修饰的方法,实际上默认调用了该类(见点击打开链接),而不是this,又static修饰的方法可以找到该类,所以static调用static是可行的。

如果实在是必须在静态方法中调用非静态变量或方法,怎么办?那就只能在调用的时候重新申请对象:比如

System.out.println(new Animal().foot);那么问题又来了,既然static这么不好使,为什么还要设置static这么个关键字?其实,其区别就在于使用static修饰的方法,无论对象是谁,调用的结果都一样。但是非使用static修饰的方法,不同的对象调用就会不同。比如static修饰了一个变量x,则无论创建多少实例,其调用的都是这个x。但是如果调用普通变量b,那么每次创建实例都要重新给b赋值。因为static变量是属于类的,其生存周期和类相同,但是普通变量是属于对象的,其生存周期与变量是相同的,对象不存在了,该变量就不存在了。

成员变量(无论是类变量还是对象变量)都存放在堆中,但是局部变量则存放于栈中,由于局部变量不需要系统垃圾回收,随着代码块儿或者方法的运行结束而结束,所以所占内存比较小。

堆栈关系java_从关键字说Java对象、引用、指针、堆栈的关系相关推荐

  1. 计算 java_两种计算Java对象大小的方法(转)

    原文:http://blog.csdn.net/iter_zc/article/details/41822719 另一篇类似文章:http://www.cnblogs.com/magialmoon/p ...

  2. instrumentation java_使用Instrumentation计算java对象大小

    对象大小的计算 正如笔者看的这篇文章所描述的一样,当我们试图获取一个JVM中的对象实际占用的空间大小时.通常使用的方法是徒手计算,或者通过gc计算前后内存差来估计对象大小.而今天要介绍的方法--利用I ...

  3. java对象 引用 原理,java对象引用和对象值得行为

    关于java对象和传值得问题,偶然间在看js的时候,发现的一个无效转换对象数据的问题,自己感觉有点疑惑,以为是js的特性,随机想在java上面证实一下,结果发现并不是js的特性,java也是如此然后查 ...

  4. java对象的内存分配

    (1) 寄存器(register).这是最快的保存区域,这是主要由于它位于处理器内部.然而,寄存器的数量十分有限,所以寄存器是需要由编译器分配的.我们对此没有直接的控制权,也不可能在自己的程序里找到寄 ...

  5. 谈谈Java与大数据之间的关系你们都了解了清楚了吗?

    Java是计算机编程语言界的王者,大数据是当下IT领域中最新潮的技术,Java和大数据都是当下十分受企业欢迎的IT技术,也是企业核心竞争力的重要组成部分,都说学大数据要先学Java,那么Java和大数 ...

  6. 谈谈Java对象的生命周期

    经过前面的分析 ,我们现在来看一下创建的对象到底是什么东西,并且完整的总结一下一个对象从创建到回收到底经过了哪些阶段. 1 对象的创建 对象创建的主要流程:  1.类加载检查 虚拟机遇到一条new指令 ...

  7. java对象关系映射ROM

    一.对象关系映射ORM概述 对象关系映射(Object-Relational Mapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术:简单的说,ORM是通过使 ...

  8. spring boot 菜鸟教程学习:spring是一个超级大工厂能够管理java对象(bean)和他们之间的关系(依赖注入)

    springboot的java对象叫做bean 用一个叫依赖注入的方法来管理bean的依赖关系 说白了 就是bean是节点 依赖注入能够构建节点之间的关系 创建bean的三种方式 如何依赖注入?

  9. java面试题6 牛客:哪个关键字可以对对象加互斥锁?

    哪个关键字可以对对象加互斥锁?() A synchronized B volatile C serialize D static synchronized的4种用法 1.方法声明时使用,放在范围操作符 ...

最新文章

  1. golang中的byte与rune
  2. flink的datastream进行join操作没有输出结果一例
  3. springboot点击运行没反应,什么都不显示的解决方式
  4. 启动不起来_国产开源工具:U盘启动工具Ventoy v1.0.29发布——墨涩网
  5. svn , github工作流
  6. Java多线程:线程休眠
  7. redis介绍与使用
  8. Python读取一个文件并删除换行输出到另外一个文件中
  9. 用QQ邮箱接收网易163企业邮箱的邮件
  10. 超好用的手机录屏软件推荐
  11. WordPress快速增加百度收录,加快网站内容抓取
  12. Intent的用法(初步)
  13. 若依(RuoYi-Vue)+Flowable工作流前后端整合教程
  14. POI导出Excel(用户自己选择路径)
  15. 3D 小姐姐模型是怎么“捏”成的? 初识 Mesh 知识点!
  16. Navicat安装及简单使用
  17. vue中nextTick使用引起的一个小问题
  18. oracle局域网相互连接,Oracle局域网客户端连接服务器
  19. SAP MM模块常用的表
  20. L3-2 拼题A打卡奖励 (30 分)

热门文章

  1. hikari如何切换数据源_如何使用Spring为HikariCP设置数据源?
  2. redis 可视化工具_自荐一个有情怀的跨平台Redis可视化客户端工具——RedisViewer...
  3. 如何删除第一张单页_单页网站-网站建设中独有的风景线
  4. ElasticSearch 并发的处理方式:锁和版本控制_07
  5. Elasticsearch7.15.2 集成ik中文分词器 适用于单机和集群
  6. RabbitMQ非root用户安装(Linux环境)
  7. vue控制台报错Duplicate keys detected: 'xxxx'. This may cause an update error.解决方案
  8. java.net.SocketException: 权限不够
  9. 查看linux系统版本信息(Oracle Linux、Centos Linux、Redhat Linux、Debian、Ubuntu)
  10. 第九篇:Spring Boot整合Spring Data JPA_入门试炼03