java中静态方法和非静态方法的存储
来源:互联网 发布:克鲁斯卡尔算法 详解 编辑:程序博客网 时间:2024/05/05 21:48
将某 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方法里,然后通过这个引用就可以调用非静态方法和访问非静态数据成员了。
- java中静态方法和非静态方法的存储
- java中 静态方法和非静态方法的调用
- Java中静态方法和非静态方法的区别
- java中静态方法和非静态方法的区别
- java静态方法中调用非静态方法的实现
- Java 中 静态方法与非静态方法的区别
- Java中静态方法与非静态方法的区别
- Java 中 静态方法与非静态方法的区别
- Java中静态方法与非静态方法的区别
- C#中静态方法和非静态方法的区别
- Java的静态方法和非静态方法
- java调用静态方法和非静态的方法
- 浅析java中静态方法,非静态方法和构造方法的执行顺序问题
- 【Java】中静态方法如何访问非静态方法和非静态变量
- 实例说明java中覆盖静态方法和非静态方法的不同
- java中静态方法和非静态方法覆盖的区别
- 实例说明java中覆盖静态方法和非静态方法的不同
- 实例说明java中覆盖静态方法和非静态方法的不同
- PHP 开发框架扩展
- (5.1.3)计算机网络之数据链路层
- C++标准容器
- 构建实时Web的JAVA选择组合:socket.io client + socketio-netty server
- js父页面如何通过子页面查询后回填到父页面的input框中去
- java中静态方法和非静态方法的存储
- xmlns:android作用以及自定义布局属性
- Android JavaScript调用Java 方法
- Razor输出字符串和变量
- OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配
- Medoo入门:安装和配置-Medoo使用指南
- Android 国内集成使用谷歌地图
- 【C++基础之十】友元函数和友元类
- BAT及各大互联网公司2014前端笔试面试题--Html,Css篇