`
234390216
  • 浏览: 10233053 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:462625
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1775522
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1398366
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:395023
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:679990
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:530894
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1183954
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:467934
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:151399
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:68154
社区版块
存档分类
最新评论

static关键字详解——static与非static的区别

    博客分类:
  • java
阅读更多

      在本篇博客中,我主要会讲两个方面的内容,第一个是实例变量与类变量的区别,第二个是实例方法与类方法的区别。大家应该都知道,用static修饰的方法是类方法,用static修饰的变量是类变量。

 

1.实例变量与类变量的区别

       一个类通过使用new关键字可以创建多个不同的对象,这些对象将被分配不同的内存空间,说得准确些就是不同对象的实例变量将被分配不同的内存空间,如果类中有类变量,那么所有对象的这个类变量都分配给相同的一处内存,改变其中一个对象的这个类变量会影响其他对象的这个类变量。也就是说,对象共享类变量。

 

      当Java程序执行时,类的字节码文件被加载到内存,如果该类没有创建对象,类中的实例变量不会被分配到内存。但是,类中的类变量 在类被加载到内存时,就分配了相应的内存空间。如果该类创建对象,那么不同对象的实例变量互不相同,即分配不同的内存空间,而类变量不再重新分配内存,所有对象共享类变量,即所有对象的类变量是相同的一处内存空间,类变量的内存空间直到程序退出运行,才释放所占有的内存。

 

      类变量是与类相关联的数据变量,也就是说,类变量是和该类创建的所有对象相关联的变量,改变其中一个对象的这个类变量就同时改变了其他对象的这个类变量。因此,类变量不仅可以通过某个对象访问,也可以直接通过类名访问。实例变量仅仅是和相应的对象关联的变量,也就是说,不同对象的实例变量互不相同,即分配不同的内存空间,改变其中一个实例变量不会影响其他对象的这个实例变量。实例变量只能通过对象来进行访问。

 

 

2.实例方法和类方法的区别

      类的方法分为实例方法和类方法两种,用static修饰的方法是类方法。当类的字节码被加载到内存的时候,类的实例方法不会被分配入口地址,当该类创建对象后,类中的实例方法才分配入口地址,从而实例方法可以被类创建的任何对象调用执行,需要注意的是,当创建一个对象时,类中的实例方法就分配了入口地址,当再创建对象时,不再分配入口地址,也就是说,方法的入口地址被所有的对象共享,当所有的对象都不存在时,方法的入口地址才被取消。

 

      对于类中的类方法,在该类被加载到内存时就已经被分配了入口地址,从而类方法不仅可以被类创建的任何对象调用,也可以直接通过类名进行调用。类方法的入口地址直到程序退出才被取消。

 

      类方法在类的字节码被加载到内存的时候就分配了入口地址,因此,Java允许直接通过类名来访问类方法,而实例方法则不能直接通过类名来访问。类中的类方法不可以操作实例变量,也不可以调用实例方法,就是因为在类创建对象之前,实例成员变量还没有分配内存,而实例方法也还没有入口地址。

 

      如果一个方法不需要操作实例变量就可以实现某种功能的话,那么这样的方法就应该声明为类方法。这样做可以避免创建对象浪费内存。

 

2
3
分享到:
评论

相关推荐

    static关键字详解

    二、static属性与非static属性还有一个最大的区别,所有的非static属性必须产生实例化对象之后才可以访问,但是static属性不受实例化对象的控制,也就是 说,在没有产生实例化对象的情况下依然可以使用static属性。 ...

    java static关键字详解(csdn)————程序.pdf

    Java中的`static`关键字是一个非常重要的关键字,它用于声明类级别的成员,包括变量、方法和代码块。`static`关键字的使用有以下四个主要方面: 1. **类属性/类变量**: 类属性(也称为静态变量)是属于类本身的,...

    Static关键字详解.docx

    总的来说,Static关键字提供了一种机制,让我们可以创建与类关联而不是与类实例关联的成员。正确使用静态成员可以提高代码的效率和可维护性,但也需谨慎,避免过度使用,因为静态成员会使得类难以实现多线程安全,并...

    static 关键字详解

    ### static关键字详解 在Java编程语言中,`static`关键字是一个非常重要的概念,它用于定义类成员(变量、方法和内部类)的行为属性。当一个类成员被声明为`static`时,它就成为了该类的静态成员,这意味着无论创建...

    Duanxx的Java学习:关键字Static详解

    关键字Static就是为了满足上面提到的两种特殊情况而诞生的。当某一个变量或方法被声明为Static的时候,这个变量或方法就不再和任何一个类的实例对象绑定,即便没有创建任何一个实例对象,也可以方位Static的变量或者...

    C++面试基础之static关键字详解

    C++面试基础之static关键字详解 本文主要讲解了C++面试基础之static关键字的相关知识点,通过示例代码介绍了static关键字的作用和使用场景。 1. static关键字的作用 static关键字在C++中有多种用途,既可以修饰...

    JAVA面试题 static关键字详解

    静态内部类与非静态内部类的主要区别在于,非静态内部类可以访问外部类的私有成员,而静态内部类不行。 4. **修饰代码块**: 静态代码块是一段在类加载时执行的代码,只执行一次。它们通常用于初始化静态变量或...

    C++ static关键字的原理及用法详解

    ### C++ `static` 关键字的原理及用法详解 #### 一、引言 在C++编程语言中,`static`关键字扮演着至关重要的角色。它不仅可以用来控制变量和函数的可见性和生命周期,还能在类的设计中发挥独特的作用。正确地理解...

    有关JAVA关键字详解

    ### JAVA关键字详解:Static 关键字的深入理解与应用 #### 一、Static 关键字简介 在 Java 编程语言中,`static` 是一个非常重要的关键字,它被广泛应用于类成员变量、方法和代码块等场景之中。通过使用 `static` ...

    Java下static关键字用法详解

    Static关键字可以修饰什么?  从以下测试可以看出, static 可以修饰:  1. 语句块  2. 成员变量(但是不能修饰局部变量)  3. 方法  4. 接口(内部接口)  5. 类(只能修饰在类中的类, 即静态内部类)  6. ...

    final和static用法详解JAVA

    Java 中的 final 和 static 关键字详解 final 关键字是 Java 中的一种访问修饰符,用于修饰类、方法和变量,以确保它们不能被修改或继承。下面是 final 关键字的详细解释: 1. final 类 final 类不能被继承,也...

    java中static关键字用法详解

    java中static关键字用法详解 Java中的static关键字是一个非常重要的概念,它在Java编程中扮演着非常重要的角色。本文将详细介绍Java中static关键字的用法,包括静态变量、静态方法和静态代码块等几个方面。 静态...

    Java静态static关键字原理详解

    Java静态static关键字原理详解 Java静态static关键字是Java语言中一个非常重要的概念,它可以修饰成员变量和成员方法,使其具有特殊的特性。在本文中,我们将详细介绍Java静态static关键字的原理和应用。 一、静态...

    Java——static关键字总结(含义、定义属性或方法、使用时机)

    【Java——static关键字详解】 Java中的`static`关键字在编程中扮演着重要的角色,它用于定义类级别的变量和方法,而不是实例级别的。这意味着`static`修饰的成员是属于类的,而不属于类的任何特定实例。理解`...

    C#关键字详解

    `implements`关键字使类实现接口,`密封`(`sealed`)防止子类继承,`静态`(`static`)关键字用于声明静态成员。 6. **泛型**: 泛型提供类型安全的数据结构和方法,如`List<T>`、`Dictionary, TValue>`。`where`关键字...

Global site tag (gtag.js) - Google Analytics