当前位置: 首页 > news >正文

转java中静态方法和非静态方法的存储

Java中非静态方法是否共用同一块内存?

将某 class 产生出一个 instance 之后,此 class 所有的 instance field 都会新增一份,那么所有的 instance method 是否也会新增一份?答案是不会,我们用field表示字段,用method表示方法,那么加上static区分后就 有四种:

class field:有用static修饰的field
class method:有用static修饰的method
instance field:没有用static修饰的field
instance method:没有用static修饰的method

那么他们在内存中的表示为:

class field:共用一块记忆体
class method:共用一块记忆体
instance field:随着每个instance各有一块记忆体
instance method:共用一块记忆体

如果instance method也随着instance增加而增加的话,那内存消耗也太大了,为了做到共用一小段内存,Java是根据this关键字做到的,比如:instance1.instanceMethod(); instance2.instanceMethod(); 在传递给对象参数的时候,Java编译器自动先加上了一个this参数,它表示传递的是这个对象引用,虽然他们两个对象共用一个方法,但是他们的方法中所产生的数据是私有的,这是因为参数被传进来变成call stack内的entry,而各个对象都有不同call stack,所以不会混淆。其实调用每个非static方法时,Java编译器都会自动的先加上当前调用此方法对象的参数,有时候在一个方法调用另一个方法,这时可以不用在前面加上this的,因为要传递的对象参数就是当前执行这个方法的对象。

为什么静态方法中不能调用非静态方法?这是因为静态方法直接跟class相关,调用此方法的时候是类直接调用的,而不是对象,所以Java编译器就没有对象参数可以传递,这样,如果你在静态方法内部调用非静态方法,那么Java编译器怎么判断这个非静态方法是哪个对象调用的?对吧,所以Java编译器就会报错,但是也不是绝对的,Java编译器是隐式的传递对象参数,那么我们总可以显示的传递对象参数吧,如果我们把某个对象的引用传递到static方法里,然后通过这个引用就可以调用非静态方法和访问非静态数据成员了。

转载于:https://www.cnblogs.com/dongguol/p/5865211.html

相关文章:

  • 五周第二次课(11月14日) 7.6 yum更换国内源 7.7 yum下载rpm包 7.8/7.9 源码包安装...
  • Android样式的开发:Style篇
  • npm-folders
  • Android怎么使用字体图标 自定义FontTextView字体图标控件-- 使用方法
  • JAVA 设计模式 模板方法模式
  • C++primer 9.49
  • springmvc学习笔记--json--返回json的日期格式问题
  • 在php中,如何将一个页面中的标签,替换为用户想输出的内容
  • docker常用命令
  • Java 反射 ParameterizedType 参数化类型
  • 基于jQuery的下拉菜单插件,诸位上眼!!!
  • 【转】整理了一些常用的面试题,掌握了这些基本上就没什么问题了
  • linux 内核库函数 【转】
  • java 切割日期时间段,分割时间段
  • shell、python脚本终端颜色输出
  • 【翻译】babel对TC39装饰器草案的实现
  • Angular2开发踩坑系列-生产环境编译
  • co模块的前端实现
  • CSS3 变换
  • CSS实用技巧干货
  • Django 博客开发教程 16 - 统计文章阅读量
  • es的写入过程
  • JavaScript HTML DOM
  • MYSQL 的 IF 函数
  • rc-form之最单纯情况
  • 分布式熔断降级平台aegis
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 复杂数据处理
  • 关于springcloud Gateway中的限流
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 聊聊flink的TableFactory
  • 设计模式(12)迭代器模式(讲解+应用)
  • 我是如何设计 Upload 上传组件的
  • 小程序button引导用户授权
  • 智能合约开发环境搭建及Hello World合约
  • 06-01 点餐小程序前台界面搭建
  • 白色的风信子
  • 如何用纯 CSS 创作一个货车 loader
  • 数据库巡检项
  • #每天一道面试题# 什么是MySQL的回表查询
  • %check_box% in rails :coditions={:has_many , :through}
  • (4)logging(日志模块)
  • (a /b)*c的值
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (离散数学)逻辑连接词
  • (十一)c52学习之旅-动态数码管
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)JPA - JQPL 实现增删改查
  • (新)网络工程师考点串讲与真题详解
  • (一)插入排序
  • (转)视频码率,帧率和分辨率的联系与区别
  • ****Linux下Mysql的安装和配置
  • .NetCore项目nginx发布
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • ?.的用法