static关键字

概述

关于 static 关键字的使用,它可以用来修饰的成员变量和成员方法,被修饰的成员是属于类的,而不是单单是属于某个对象的。也就是说,既然属于类,就可以不靠创建对象来调用了。

static 修饰的内容:

  • 是随着类的加载而加载的,且只加载一次。
  • 存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。
  • 它优先于对象存在,所以,可以被所有对象共享。
    -方法使用静态: 当方法中没有访问到成员变量的时候,使用static来修饰方法
  • 变量使用静态: 当类中的变量被所有对象共享的时候,使用static修饰在加载类的时候开辟空间

定义和使用格式

当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。

静态变量
使用 static关键字修饰的成员变量。
定义格式:static 数据类型 变量名;

静态方法
当static 修饰成员方法时,该方法称为类方法 。静态方法在声明中有static ,建议使用类名来调用,而不需要创建类的对象。调用方式非常简单。

静态方法调用的注意事项:

  • 静态方法可以直接访问经静态类变量和静态方法。
  • 静态方法不能直接访问普通成员变量或成员方法。反之,成员方法可以直接访问类变量或静态方法
  • 静态方法中,不能使用this关键字。

静态方法只能访问静态成员

调用格式

被static修饰的成员可以并且建议通过类名直接访问。虽然也可以通过对象名访问静态成员,原因即多个对象均属于一个类,共享使用同一个静态成员,但是不建议,会出现警告信息。

静态代码块

定义在成员位置,使用static修饰的代码块{ }

  • 位置:类中方法外
  • 执行:随着类的加载而执行且执行一次,优先于main方法和构造方法的执行。
  • 作用:给类变量进行初始化赋值

static 关键字,可以修饰变量、方法和代码块。在使用的过程中,其主要目的还是想在不创建对象的情况下,去调用方法。

静态和非静态成员变量的区别

  • 它们在内存中出现的时间不同
    静态成员变量:它是在加载类的时候,就在方法区的静态区中存在。
    非静态成员变量:当创建类的对象的时候,随着对象的产生在堆中出现。

  • 它们所在的内存区域不同
    静态成员变量:在方法区的静态区中。
    非静态成员变量:对象所在的堆内存中。

  • 它们的初始化时间不同
    静态成员变量:在类加载的时候就会初始化,类加载完成,变量已经初始化结束。
    非静态成员变量:它是在对象的创建过程中被初始化。

  • 它们的生命周期不同:
    静态成员变量:它随着类的加载在方法区的静态区中存在。直到类被从方法区卸载,才会消失。
    非静态成员变量:它是随着对象的产生而存在,随着对象的消失就消失。

静态方法注意事项(重要)

  • 调用方式
    静态方法变量,可以使用类名直接调用。
    非静态成员方法变量,需要使用对象调用。

  • 静态关键字是一个修饰符。可以修饰类中的成员方法和成员变量。但是不能修饰构造方法。因为构造方法的作用是用来创建对象给对象初始化,一旦被static修饰,就不需要对象调用。那么构造方法就和对象没关系了。没对象的话,构造方法就没价值了。

静态方法它是在类加载的时候,就在内存中加载完成,可以直接运行的方法。非静态方法,它的运行必须是在类加载完成之后,通过new关键字创建出对象之后,通过对象才能调用

  • 静态方法中不能调用非静态成员
    因为静态方法在类加载完成之后可以通过类名直接调用,而类加载完了不代表类中产生了对象。非静态成员必须依赖于对象才能运行。

  • 非静态方法中是可以调用静态方法的
    当非静态方法可以运行的时候,在内存中就一定有对象产生,既然有对象了,就说明对象所属的那类肯定已经被加载完成了。类都加载完成了,静态方法就已经准备就绪

  • 静态方法中不能使用this 关键字
    this关键字它表示的是当前调用方法的那个对象。而在静态方法中是没有对象的

class文件的加载过程
  • 在加载class文件的时候,JVM会从上往下逐行加载代码。遇到静态内容则加载到方法区的静态区中遇到非静态内容则加载到方法区的非静态区中
  • 当把所有的代码加载完成之后,开始给类中的所有静态成员变量进行默认初始化
  • 当类中的所有静态成员变量默认初始化之后,接着开始给所有静态成员变量显示赋值
  • 在给静态成员变量显示赋值的过程中,如果遇到静态代码块,则执行当前静态代码块
  • 当类中所有的静态成员变量显示赋值结束,并且静态代码块运行结束表示当前class文件加载完成

你可能感兴趣的:(javase)