`
hupy
  • 浏览: 188783 次
  • 性别: 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方法里,然后通过这个引用就可以调用非静态方法和访问非静态数据成员了。

分享到:
评论

相关推荐

    PHP中静态方法(static)与非静态方法的使用及区别.docx

    在PHP编程语言中,`static`关键字用于定义类的静态属性和方法,它们与类的实例(对象)无关,而是直接关联到类本身。理解静态方法和非静态...在实际开发中,合理使用静态和非静态方法可以帮助提高代码的可读性和效率。

    静态的魔力:Java中静态方法和变量的深度解析

    ### 静态的魔力:Java中静态方法和变量的深度解析 #### 一、引言 Java作为一门强大的编程语言,在软件开发领域占据着举足轻重的地位。其面向对象的特性、跨平台的能力以及强大的标准库,使得Java成为开发企业级...

    java中静态与非静态的区别

    - **非静态类**则更加灵活,既可以包含**非静态成员**和**非静态方法**,也可以包含**静态成员**和**静态方法**。 2. **实例化**: - **静态类**不可实例化。也就是说,你无法创建一个静态类的对象。这是因为它...

    java中静态与非静态的变量定义与使用

    由于 `t2` 和 `c1` 是静态变量,我们可以直接通过它们调用非静态方法 `f2()` 和 `f3()`,无需创建 `Table` 或 `Cupboard` 的实例。这展示了如何在没有对象的情况下使用静态变量调用非静态方法,尽管这通常不是最佳...

    java-静态变量方法块

    在Java编程语言中,静态变量、静态方法、静态代码块以及非静态变量和非静态方法是核心概念,它们对于理解和编写Java程序至关重要。下面将详细解释这些概念,并通过实例程序来阐述它们的使用和内存管理。 首先,静态...

    java静态文件处理

    在Java编程语言中,处理静态文件是一项常见的任务,特别是在构建Web应用程序时。静态文件通常指的是HTML、CSS、JavaScript、图片等非动态内容,这些文件在服务器端不需要额外的处理即可发送给客户端。本篇文章将深入...

    JAVA中堆、栈,静态方法和非静态方法的速度问题

    JAVA中堆、栈、静态方法和非静态方法的速度问题 JAVA中堆、栈是JVM内存模型中的两个重要组成部分,它们的速度性能分析是非常重要的。堆和栈的速度性能分析可以从多角度来分析,包括从分配的角度、从访问角度、从CPU...

    浅析php静态方法与非静态方法的用法区别

    静态方法和非静态方法的主要用法区别体现在以下几个方面: 1. 访问限制:静态方法不能直接访问非静态的属性和方法,因为静态成员是属于类级别的,而非静态成员是属于对象实例级别的。由于静态成员的创建和调用不...

    从JVM内存管理的角度谈谈静态方法和静态属性

    非静态方法(实例方法)则包含一个隐含的参数,即对象实例的引用,这个引用在栈中存储。当调用非静态方法时,必须先创建对象实例,这样栈中才会有一个指向堆中对象实例的指针。这个指针使得实例方法能够访问并修改...

    java之中的静态变量与静态方法的继承与覆盖问题.doc

    在Java编程语言中,静态变量(也称为类变量)和静态方法(也称为类方法)是由`static`关键字修饰的成员变量和成员方法。它们的特点在于不依赖于对象的存在,可以通过类名直接访问。 #### 静态变量的特点 - **共享...

    Java static修饰方法

    在Java编程语言中,`static`关键字是一个非常重要的修饰符,它有多种用途,但最常见的是用来修饰类的方法和变量。...在实际编程过程中,我们应该根据需求平衡使用静态和非静态方法,以实现最优的设计。

    java静态变量与方法.doc

    4. **可访问性**:静态变量可以被类的任何静态方法访问,但不能被非静态方法访问,因为静态方法不知道具体对象的存在。例如,在`staticExam2`中,静态方法`bb()`不能调用实例方法`aa()`,也不能直接访问实例变量`a`...

    Java成员变量局部变量静态变量成员方法全局方法等概念的区

    成员变量和局部变量用于存储数据,而成员方法和静态方法则用于执行操作。在设计类时,应根据数据和行为的关联来决定变量和方法的类型。合理地使用静态和非静态成员,可以帮助优化内存使用,同时保持代码的整洁和高效...

    Java中的static关键字

    在非静态方法中可以调用静态方法中的静态方法和引用静态方法中的变量,因为静态方法是一个运行时的方法,在程序运行时(类加载)的时候去为类实例化对象,并为其分配空间。 七、使用 static 的注意事项 在使用 ...

    java 使用静态成员变量计算内存中实例化的对象数目

    在Java编程语言中,了解如何计算内存中实例化对象的数量是一项重要的技能,这对于优化程序性能、理解和管理资源分配至关重要。本篇文章将详细讲解如何利用静态成员变量来追踪和计算一个类在运行时创建的实例数量。 ...

    java中带static关键字的程序内存分析

    - **堆(Heap)**:这是Java程序的主要内存区域,用于存储对象实例和其非静态成员。每个对象都有自己的堆内存空间,包含所有非静态字段。 - **栈(Stack)**:每个线程都有自己的程序计数器、Java虚拟机栈和本地...

    JAVAStatic静态变量.doc

    Java中的`static`关键字是用来声明静态变量或静态方法的,它是面向对象编程中非常关键的一个概念。静态变量属于类,而不是类的实例,这意味着它们在内存中只有一份拷贝,所有的类实例共享这个相同的变量。当我们声明...

    什么是静态(static)什么是静态方法,静态变量,静态块

    在Java编程语言中,"静态"(static)关键字是一个非常重要的概念,它具有多种用途,包括定义静态变量、静态方法、静态初始化块以及静态类。理解这些概念对于编写高效的Java代码至关重要。 首先,我们来解释静态变量...

    java-内存-方法区介绍

    总之,方法区是Java内存模型中的一个重要组成部分,它负责存储类的元数据信息,包括类的字节码、静态与非静态方法、静态成员变量、常量以及字符串常量池等。通过对这些信息的高效管理和合理组织,方法区极大地提升了...

    JAVA中static方法的用法实例详解

    - 非静态方法(实例方法)需要通过类的实例调用,它们可以访问实例变量和非静态方法。 - 静态方法不依赖于实例,因此它们不能访问非静态方法和实例变量,但可以访问静态方法和静态变量。 6. **main方法**: - ...

Global site tag (gtag.js) - Google Analytics