`
cantellow
  • 浏览: 847318 次
  • 性别: Icon_minigender_1
  • 来自: 草帽海贼团
社区版块
存档分类
最新评论

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方法里,然后通过这个引用就可以调用非静态方法和访问非静态数据成员了。

分享到:
评论
3 楼 cantellow 2010-08-10  
chenyongxin 写道
如果涉及到线程呢?

也是一样的,方法都属于类数据,类数据都放在方法区中,《深入java虚拟机》有一个虚拟机的体系结构,在那里你可以看到线程都放在java栈里,栈帧代表一个方法的返回状态,执行完一个方法就会弹出这个栈帧,方法区和堆中的数据时所有线程都共享的,所以这里没有线程的区分。
2 楼 chenyongxin 2010-08-10  
如果涉及到线程呢?
1 楼 C_J 2009-11-07  
恩,非静态方法在调用的时候会再参数里带this引用进去...这就是static不能调用非static的根本原因..

相关推荐

    laravel框架模型中非静态方法也能静态调用的原理分析

    本文实例讲述了laravel框架模型中非静态方法也能静态调用的原理.分享给大家供大家参考,具体如下: 刚开始用laravel模型时,为了方便一直写静态方法,进行数据库操作。 <?php namespace App\Models; use ...

    Python 调用 C# 静态方法,非静态方法,传参

    - 下面是一个简化的示例,展示了如何使用 Python 调用 C# 静态方法并处理返回的 `DataSet`: ```python import ctypes # 加载 C# 库 lib = ctypes.cdll.LoadLibrary("YC.DataSet_Demo.dll") # 定义方法原型 ...

    Think in java读书笔记

    这类似于局域网中多个用户共享一台服务器的场景,每个用户拥有自己的客户端(相当于对象实例),而服务器(相当于静态方法)则是所有客户端共用的资源,不针对任何单一实例。 四、对象初始化的顺序与过程 对象的...

    认知无线电体系中非静态多频谱接入算法研究.docx

    ### 认知无线电体系中非静态多频谱接入算法研究 #### 1. 引言与背景 在当今数字化时代,随着移动通信技术的飞速发展,频谱资源的需求日益增长,但与此同时,频谱资源的分配和使用却存在严重的不平衡现象。根据美国...

    Java常问到的几个中级以上问题

    - 方法覆盖(Override):当子类重写父类中非静态的同名方法时,若方法签名完全一致,那么子类的方法就会覆盖父类的方法。在多态调用中,会调用子类覆盖后的方法。 - 方法隐藏(Hiding):如果子类和父类中有同名的...

    Java语言中非阻塞算法的实现.pdf

    Java语言中非阻塞算法的实现.pdf

    java异常机制小结

    Exception 是 Java 语言中非严重错误的 superclass,表示程序中非严重的错误,如除数为零、数组越界等。 三、Java 异常的对象 Java 异常的对象来自两个来源:一是 Java 语言本身定义的一些基本异常类型,二是用户...

    Linux下java编程

    解释了方法重载的概念,即在同一类中可以有多个同名但参数列表不同的方法。 #### 6.6 Übungen(练习) 提供了一些方法相关的练习题。 ### 7. Klassen(类) #### 7.1 Einführung in Klassen(类简介) 概述了...

    Java语言中非阻塞算法的实现.zip

    非阻塞算法在Java语言中的实现是一个复杂而深入的话题,涉及到并发编程、多线程以及高效数据结构的设计。非阻塞算法,也称为无锁算法,主要特点是避免了线程间的互斥,使得多个线程可以同时进行计算,从而提高了系统...

    java非技术面试Java非技术方面面试

    Java非技术方面面试Java非技术方面面试Java非技术方面面试

    04JVM是如何执行方法调用的?(上)1

    重载指的是在同一个类中出现多个名字相同,并且参数类型不同的方法,而重写指的是子类定义了与父类中非私有方法同名的方法,并且这两个方法的参数类型相同。重载和重写都是多态的体现方式,但它们的使用场景不同。...

    2024年java面试题-jvm性能调优面试题第一部分

    - **持久代**:主要用于存储类元数据等信息,其主要目的是为了减少内存中非活动对象的数量,提高内存利用率。 ### 4. 新生代中Eden和Survivor区域的划分 - **Eden区和Survivor区**:新生代通常被划分为一个较大的...

    JAVA常见异常整理.docx

    Java异常处理是编程中至关重要的部分,它帮助程序员在程序执行过程中捕获并处理错误情况。在Java中,异常是通过类的实例来表示的,这些类都继承自`java.lang.Throwable`类,它是所有异常和错误的根类。异常分为两种...

    牛客网Java专项50题详解

    - `Arrays.asList()`方法可以将数组转换为`List`对象,但需要注意的是,返回的是`Arrays`类中的静态内部类`ArrayList`的实例,而不是`java.util.ArrayList`。 - 使用该方法创建的`List`是不可变的,试图修改这个`...

    excel用数组公式获取一列中非空(非零)值.docx

    本文将介绍使用 Excel 数组公式获取一列中非空(非零)值的方法。 数组公式的基本概念 在 Excel 中,数组公式是一种特殊的公式,它可以对数组进行操作,而不是单个单元格。数组公式的语法是`= formula`,其中 `...

    java面向对象编程

    方法重载指的是在同一个类中,方法名相同但参数列表不同的多个方法;而方法重写发生在继承关系中,子类可以重写父类的方法,以适应特定的上下文需求。 #### 总结 Java面向对象编程的核心在于理解对象的概念,以及...

    新一代GPS标准中非理想表面模型的建模方法.pdf

    【案例分析】文中通过一个实际工件为例,运用提出的建模方法得到非理想表面的仿真结果,并进行综合分析,验证了该方法的有效性和实用性。 总结:文章详细探讨了在新一代GPS标准下,如何使用离散数学方法建立非理想...

    Java复习要背诵的内容.pdf

    方法的重载是Java中的一种多态性表现,指的是在同一个类中可以有多个同名方法,但这些方法的参数列表必须不同,通常是参数的数量或类型不同。构造方法同样可以重载,允许创建类的不同实例形式。 子类继承父类时,...

Global site tag (gtag.js) - Google Analytics