Java中的static变量、方法、代码块
2011-07-20 16:32
507 查看
1、static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2、static方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3、static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
结果:
说明:类的执行顺序是:
父类静态代码 → 子类静态代码 → 父类非静态代码块 → 父类构造 → 子类非静态代码块 → 子类构造
分别对应(3)(4)(5)(6)(7)(8)
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2、static方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3、static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
class StaticSuper { static String country="SuperClass"; { System.out.println("Class StaticSuper block is loading!"); //(5) } static { //country = "china"; System.out.println("Class StaticSuper static block is loading!"); //(3) } StaticSuper() { System.out.println(country); //(6) } void ShowMe() { System.out.println(country); } } class StaticSub extends StaticSuper { static String country2="StaticSub String"; { System.out.println("Class StaticSub block is loading!");//(7) } static { System.out.println("Class StaticSub static block is loading!"); //(4) } StaticSub() { System.out.println(country2); //(8) } void ShowMe() { System.out.println(country2); } } class test { static { System.out.println("Class test is loading!");//(1) } public static void main(String [] args) { System.out.println("Begin executing main method!");//(2) //StaticCode st1=new StaticCode(); StaticSuper st=new StaticSub(); st.ShowMe();//(9) } }
结果:
Class test is loading! Begin executing main method! Class StaticSuper static block is loading! Class StaticSub static block is loading! Class StaticSuper block is loading! SuperClass Class StaticSub block is loading! StaticSub String StaticSub String
说明:类的执行顺序是:
父类静态代码 → 子类静态代码 → 父类非静态代码块 → 父类构造 → 子类非静态代码块 → 子类构造
分别对应(3)(4)(5)(6)(7)(8)
相关文章推荐
- Java中的static变量、方法、代码块初始化执行顺序
- Java中的static变量、方法、代码块
- Java的static修饰变量,方法,代码块的初始化顺序
- java: 封装缓存池(int与Integer)、常量池(拘留池)、static变量 static代码块 static方法、 final变量、final 方法、final类 整理
- Java中static成员变量、成员变量、static代码块、代码块、构造方法的执行顺序
- 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类
- java中static变量和方法的总结
- Java中静态代码块、静态方法、static关键字详解
- java中 static变量和方法到底是存在内存什么区域呢?
- java中static变量和方法的总结
- java静态方法、非静态代码块{}、静态代码块static{}
- java中的static(包括类前面修饰的static、方法前面修饰的static、成员变量前面修饰的static)
- Java static变量和static方法介绍
- Java自学笔记(第六天)-static-类变量-对象变量-javadoc文档-static代码块-单例设计模式
- 5-2 Java 中的 static 使用之静态变量 ;;Java 中的 static 使用之静态方法;;Java 中的 static 使用之静态初始化块
- java中静态代码块、静态方法、static关键字详解
- java中static变量及方法的访问
- Java基础之子类会不会继承父类的static变量和static方法
- Java的static方法为什么不允许直接使用非static的变量
- java——构造函数、构造代码块、Static关键字、main函数 & 继承:子父类中的变量、函数的特点、抽象类、接口等