Java Static关键字详解
来源:互联网 发布:linux fifo 编辑:程序博客网 时间:2024/05/29 19:18
Java static关键字详解
Java static关键字平时用的实在太多了,网上对它的介绍也是非常多的,这里希望通过自己的理解对它进行详细的阐述总结,以加深对该关键字的理解。
static翻译为“静态”,用到static的地方一般都是和类相关的,而不是和对象相关的。在Java中该关键字大体用在5处:静态变量、静态方法、静态代码块、静态内部类、静态导入。
先定个调:被static修饰的变量或者方法可以直接通过类名去访问,而不需要依赖对象去访问,类加载完成后就可以去访问了。
下面将对这几个特性进行详细解释。
静态变量
普通的变量(未用static修饰的)是实例变量,这种变量每个对象都会维护一份,对象创建的时候在堆上分配(对象实例数据中)并初始化,只能通过对象引用拿到该值(getter方法)。
由static修饰的变量称为类变量,这种变量在类加载的时候初始化,并在方法区为该变量分配内存(注意这里只是在方法区的类元数据中为该变量分配了空间,这个空间保存的是对象的引用,而具体的对象分配在堆上),全局只有一个该变量副本,所有对象共享该变量,这样可以节省内存。虽然可以通过对象引用到该变量,但是不推荐这样做,推荐通过类名引用该变量。
静态方法
static修饰的方法(静态方法)和未被static修饰的方法(实例方法)区别在于:
- static方法可以通过类名来调用,当然也可以通过对象来调用(不推荐)。普通方法只能通过对象来调用,因为普通方法是和对象相关的,static方法不依赖对象。
- static方法不可以访问非static的变量,也不能访问this和super,因为static方法不依赖对象,既然没有对象那就谈不上this了。
- static方法不可以访问非static的方法,但是非static方法可以访问static方法。
静态代码块
静态代码块在类加载的时候执行,如果存在多个静态代码块,按顺序执行,每个静态代码块仅会执行一次。例如对于如下示例:
public class Test { static { System.out.println("hello static area"); }}
当虚拟机加载了该类时,将会打印出hello static area
。
静态内部类
普通的类是不允许被声明为static的,但是内部类可以声明为static的。静态内部类定义在类内部、方法外。静态内部类只是定义在一个类的内部,其他的和正常的类没有区别。创建静态类的对象时不需要先创建外部类的对象。关于静态内部类有以下几点需要注意:
静态内部类不能访问外部类的非静态变量,这点不难理解,任何类不能通过类名来访问类的非静态变量,内部静态类也是如此。例如对于以下示例
public class Outer { private Integer x; public static class Inner { public void print() { //此处会报错,因为x是外部类Outer的实例变量,当调用Inner的print方法时,是不需要创建外部类的 //对象的,对象都不存在,肯定访问不了类Outer的实例变量 System.out.println(x); } }}
在
Outer
内部需要Inner
对象直接实例化即可,在Outer外部通过如下方式创建Inner对象Outer.Inner inner = new Outer.Inner()
静态导入
Java 1.5开始支持静态导入,可以直接把其它类的静态变量导入到当前类中,当前类可以直接使用该静态变量而不需要去引用原有的类名。关键字为import static
例如
import static Common.X
看例子:
public class Common { public static Integer X = 100;}
import xxx.xxx.Common;public class Test { public void test() { //此处引用Common的静态变量时需要引用Common int x = Common.X; }}
import static xxx.xxx.Common.X;public class Test { public void test() { //静态导入Common的静态变量X后,此处可以直接引用 int x = X; }}
- java关键字static详解
- java关键字Static详解
- java static 关键字详解
- Java Static关键字详解
- Java 关键字static详解
- Java关键字:static详解
- Java static 关键字详解
- Java Static关键字详解
- Java Static关键字详解
- Java static 关键字详解
- Java Static关键字详解
- java笔记 static关键字详解
- JAVA中static关键字详解
- Java中static关键字详解
- Java中的static关键字详解
- 详解JAVA中的static关键字
- Java关键字static,final详解
- Java中的static关键字详解
- 接口内部的类
- 数据库主从同步复制原理
- JavaBean
- YII2.0电商平台开发笔记-2
- (转)鼎晖投资总裁焦震:别把投资高雅化,就是个做买卖的
- Java Static关键字详解
- 操作系统之线程的基础知识
- Object 类
- POJ 2416 Return of the Jedi 笔记
- ffmpeg开发之旅(5):详解ffmpeg编译与在Android平台上的移植
- BZOJ4443 小凸玩矩阵
- jQuery应用插件总结
- 关于连接mysql数据库——安装ODBC驱动报错
- React Native 学习笔记(一)