static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
1、静态变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响。
静态变量和实例方法,它们的字节码都位于方法区内。
2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3、静态代码块
静态代码块是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块(类被初始化的时候,仅仅调用一次 ),如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
如果类中有静态代码块,它将会先执行静态代码块,然后再执行构造方法。如果父类中有静态代码块,它将会先执行父类中的静态代码块,再执行子静态代码块, 然后再依次执行父类的构造方法和子类的构造方法;
因此,static的用途很广泛:static变量可以用作缓存;static方法可以当做工具方法;static代码块可以执行一些初始化操作。
下面是一个缓存的例子:
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* 使用 LinkedHashMap 创建 LRU cache.
*/
public class LRUCache {
private static int cacheSize = 0;
private static float loadFactor = 0.75f; // default
private static LinkedHashMap map = new LinkedHashMap(cacheSize, loadFactor, true) {
protected boolean removeEldestEntry(Map.Entry eldest) {
return size() > LRUCache.this.cacheSize; // return false;
}
};
private LRUCache(int cacheSize){
this.cacheSize=cacheSize;
}
public static LRUCache newInstance(){
LRUCache cacheMap=new LRUCache(100);
return cacheMap;
}
public synchronized void clear() {
map.clear();
}
public synchronized Object get(Object key) {
return map.get(key);
}
public synchronized void put(Object key, Object value) {
map.put(key, value);
}
public synchronized Object remove(Object key) {
return map.remove(key);
}
public synchronized int size() {
return map.size();
}
public synchronized Collection values() {
return map.values();
}
public static LinkedHashMap getMap() {
return map;
}
public static void setMap(LinkedHashMap map) {
LRUCache.map = map;
}
public static void main(String[] args) {
// testing
int size = 3;
LRUCache cache = new LRUCache(size);
cache.put(new Integer("1"), "1");
cache.put(new Integer("2"), "2");
cache.put(new Integer("3"), "3");
String value = (String) cache.get(new Integer(1));
System.out.println(value);
System.out.println("Testing ...");
// cache.put(new Integer("4"), "4");
Object[] values = cache.values().toArray();
for (int i = 0; i < values.length; i++) {
value = (String) values[i];
System.out.println(value);
}
}
}
分享到:
相关推荐
非访问修饰符包括 final、static 和 abstract 三种,用于控制类、成员变量和方法的继承关系和行为。 一、访问修饰符 访问修饰符是 Java 中最基本的修饰符,用于控制类、成员变量和方法的访问权限。访问修饰符有四...
static 方法访问修饰符表示静态方法,可以被类的所有实例共享,不需要创建类的实例就可以访问。 final 方法访问修饰符 final 方法访问修饰符表示防止任何子类重载该方法。 abstract 方法访问修饰符 abstract ...
以上介绍的权限修饰符在Java中发挥着至关重要的作用。正确地使用它们可以帮助开发者更好地管理代码的可见性和访问控制,从而构建出更安全、更易于维护的应用程序。需要注意的是,在实际开发过程中,应根据具体的需求...
在C#等静态类型语言中,public、private和static是访问修饰符,用于控制类成员的可见性和作用域。而在JavaScript中,由于其原型继承的特性,我们通常使用函数作用域和闭包来模拟这些行为。 下面我们将基于提供的...
以上就是Java中主要的修饰符及其作用,理解并熟练运用这些修饰符是编写高质量、安全、可维护的Java代码的关键。在实际编程中,合理选择和组合这些修饰符可以帮助我们更好地控制代码的结构和行为。
`const`、`static` 和 `volatile`这三个修饰符分别用于定义常量、限制作用域以及确保变量不受优化的影响,是开发高质量C语言程序的重要工具。理解并恰当地使用这些修饰符,能够显著提高代码的质量和效率。
- **static**: 静态修饰符,表示成员变量属于类而非类的实例,可以通过类名直接访问。 - **final**: 最终修饰符,用于声明常量,一旦赋值,不能更改。 - **volatile**: 易失修饰符,用于多线程环境,保证变量在多...
通过合理使用类修饰符,开发者可以更好地控制类成员的可访问性和作用域,从而提高代码的安全性和模块化程度。接下来,我们将深入探讨几种常见的类修饰符,并结合示例来理解它们的功能和应用场景。 #### Public - *...
java 访问权限修饰符详解 在 Java 语言中,访问权限修饰符是指用来限定类、成员变量和方法的可访问范围的关键字。访问权限修饰符分为四种:public、protected、friendly 和 private。每种修饰符都有其特定的访问...
static:修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用。static在函数内部定义的话,分配在堆中,数值保存在data段,而不是在栈中,而且只赋值一次。 extern:修饰符:修饰变量,...
### C#类修饰符详解 在C#编程中,类及其成员的可见性和特性可以通过不同的修饰符进行控制。本文将详细介绍C#中的类修饰符及其使用场景,帮助开发者更好地理解和运用这些修饰符。 #### 类修饰符 - **public**:...
### Java软件开发实战:Java基础与案例开发详解之Static修饰符 #### 6.5 Static修饰符 在Java中,`static`关键字用于声明与类而不是与实例相关的变量、方法或代码块。这一特性使得静态成员能够被类本身直接访问,...
### auto、register、static、extern等存储类修饰符的区别 #### 一、标识符的链接(Linkage) 在C语言中,标识符的链接决定了一个变量或者函数可以在哪些范围内被识别和访问。根据链接的不同,我们可以将其分为...
本文主要给大家介绍了关于c++中static修饰符的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 下面一段是引用自effective c++ 中的一句话: 所谓的static对象,其寿命是从构造出来到...
最后,我们来看`static`修饰符。`static`修饰的变量称为静态变量,它们属于类而不是类的实例,因此可以通过类名直接访问。同样,`static`方法也是属于类的,不依赖于类的实例,因此也称为类方法。在`static`方法中,...
方法的修饰符共有九种:public、private、protected、默认、static、final、abstract、native 和synchronized。 * public:任何包、任何类都可以访问。 * private:只能是自身类。 * protected:自身类、子类、同一...
在这里,我们将深入探讨C#中的主要修饰符,帮助你全面理解它们的作用和用法。 1. 访问修饰符: - `public`:公共访问修饰符,允许任何代码访问。 - `private`:私有访问修饰符,仅限于在同一个类内部访问。 - `...
访问控制修饰符和非访问控制修饰符共同作用,不仅实现了封装、继承和多态等面向对象编程的基本特征,还提供了更高级的功能,如线程安全、不可变性和代码优化等,使Java程序具备了强大的灵活性和适应性。
3. 静态类(static):static 修饰符修饰的类称为静态类,静态类可以在定义时初始化成员变量和方法。 在 Java 中,修饰符的使用是非常重要的,合理地使用修饰符可以提高程序的安全性和可维护性。但是,过多地使用 ...
static修饰符用于声明静态变量或静态成员函数。 1. 静态变量 静态变量的作用范围在一个文件内,程序开始时分配空间,结束时释放空间,默认初始化为0,可以被修改。 2. 函数内部的静态变量 函数内部的静态变量...