zoukankan      html  css  js  c++  java
  • 静态与非静态

    一、静态变量和实例变量的区别

    1、静态变量

      由static修饰,在jvm中,静态变量加载顺序在对象之前,所以静态变量不依赖对象的存在,可以不实例化对象的情况下使用类的静态变量。

    通过上面的代码可以看出,静态变量可以在未实例化对象的时候使用,但是非静态变量只能在实例化对象时候才能使用。

     

    运行结果为:

    30
    李四

    40
    李四

    把User中的name改为非静态变量后

    运行结果为:

    30
    李四

    40
    张三

    根据上面两次运行结果可以看出,静态变量属于类,不属于类中任何一个对象,因此静态变量又叫做类变量,一个类不管创建多少个对象(对象是类的一个实例),静态变量在内存中有且仅有一个,所以name为静态变量时,即使是实例化对象,获得的name值是在内存中的,实例化对象并不会初始化该对象静态变量的值。

    2、实例变量

      必须依附于对象存在,只有实例化类后才可以使用此类中的实例变量,实例变量即非静态变量。

    上面例子User中的age即是实例变量。

    二、静态方法与实例方法的区别

    1、静态方法

      方法用static关键字修饰,静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。使用时也是不需要实例化类,能够直接使用。

      

    通过上面的代码可以看出,在静态方法中只能访问类中的静态成员跟静态方法,不能直接访问类中的实例变量跟实例方法。

     因为静态方法和静态变量一样,在jvm中,加载顺序在对象之前,可能在调用非静态方法或非静态变量时,被调用的非景田方法或非静态变量还未被实例化,所以在静态方法中要使用非静态变量或方法,只能通过实例化对象来调用。

    2、实例化方法

      属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。

    上面例子User中showAge就是实例化方法,实例化方法即非静态方法。

    注:

    1.线程安全:静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发的问题。非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。 
    2.如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。

  • 相关阅读:
    JAVA设计模式之单例模式
    JAVA设计模式之建造模式
    JAVA设计模式之原型模式
    JAVA设计模式之适配器模式
    JAVA设计模式之合成模式
    JAVA设计模式之享元模式
    JAVA设计模式之门面模式
    JAVA设计模式之桥梁模式
    JAVA设计模式之不变模式
    JAVA设计模式之模版方法模式
  • 原文地址:https://www.cnblogs.com/guochang/p/9555848.html
Copyright © 2011-2022 走看看