static 与 final 关键字详解
1、static? (1)静态成员变量 被static修饰的成员变量其实是一个类成员变量,当这个类被虚拟机第一次加载的时候,就会为该变量分配内存空间,当该类创建实例时,不会生成对static变量的拷贝。而是多个该类的实例共享该变量。所有该类的对象都可以操作这块存储空间。 static定义的变量的初始化必须在定义时或者通过静态代码块初始化,并会优先于任何其它非static变量,
1、static?
(1)静态成员变量
被static修饰的成员变量其实是一个类成员变量,当这个类被虚拟机第一次加载的时候,就会为该变量分配内存空间,当该类创建实例时,不会生成对static变量的拷贝。而是多个该类的实例共享该变量。所有该类的对象都可以操作这块存储空间。static定义的变量的初始化必须在定义时或者通过静态代码块初始化,并会优先于任何其它非static变量,不论其出现的顺序如何,在涉及到继承的时候,会先初始化父类的static变量,然后是子类的。
静态成员变量可以使用”类名.变量名“直接使用,当然也可以通过对象来访问(但是不推荐)。 被类中所有方法使用(static与非static),如果该类中某一个对象修改了变量的值,其他所有该类对象中的对应值都会随之改变。
(2)静态方法
被static修饰的方法称之为类方法。可以通过类直接调用该方法(类名.方法名),而没必要创建该类的实例后调用该方法。静态方法只能调用其他静态方法,只能使用静态成员变量, 因为是由类名直接调用,不能由对象调用,所以不能以任何形式引用this和super。用途:静态方法常常为应用程序中的其它类提供一些实用工具,在Java的类库中大量的静态方法正是出于此目的而定义的。如Arrays和Collections等工具类。也因为是工具类,所以这些类是不能够被继承的。
(3)静态类
普通类不允许声明为静态的,只有内部类才可以,请访问我的博客《内部类》。
查漏补缺:static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
static 变量前可以有private修饰,表示这个变量可以在类的静态代码块中、或类的其他静态成员方法中使用,但是不能在其他类中通过类名来直接引用。用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块,关于静态代码块会在之后的博客中做详细介绍。
2、final?
(1)用final修饰的变量表示常量。被final修饰的变量是一个常量,必须被赋值后才能使用。可以在定义时赋值,也可在构造方法中赋值(只要在构造方法结束前给赋值就可以)。final修饰的基本类型变量对象地址不能被修改,对象内部的成员可以被修改。
(2)用final修饰的方法不能被重写。
(3) 用final修饰的类不能被继承;final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。但是final类中的成员变量可以被定义为final或非final形式。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,那么就设计为final类,如工具类。
(4)final不能用来修饰构造方法。
3、static和final的结合?
static final用来修饰成员变量和成员方法,可简单理解为“全局量”;对于变量,表示一旦给值就不可修改,并且通过类名可以访问;对于方法,表示不可覆盖,并且可以通过类名直接访问。
小结:static 和 final 关键字是Java常用的基础知识,static 随类的加载而加载,final 则相当于限制,其修饰的变量是常量,修饰的方法不能被重写,修饰的类不能被继承。
更多推荐
所有评论(0)