在Java语言中,static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。
static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
类名.静态方法名(参数列表...)
类名.静态变量名
用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大)。
static在Java语言中的使用有四种:(变量、方法、代码块、内部类)
1、static变量
按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类
变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过
程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2、静态方法
静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!
因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
public class Test4 {
static int a;
int b;
static String k="abcd";
static void say() {
//static不能修饰局部变量,即使在静态方法中,同时public,protected,private也一样
//static int p=0; //error
int c =1;
System.out.println(a);
// System.out.println(b);不能使用类的实例变量
System.out.println(c);
// 不能调用get()
}
void get() {// 非静态可以调用静态
// static int i=0;static不能修饰局部变量,
// System.out.println(i);
say();
}
public static void method(int p){
k = k+p; //自动转化为静态变量
System.out.println(k);
}
public static void main(String[] args) {
//new B().get();
Test4.say();
Test4.method(5);//abcd5
Test4.method(5);//abcd55
}
}
3、static代码块
static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。
4. 静态内部类(Inner Class)
为正确理解static在应用于内部类时的含义,必须记住内部类的对象默认持有创建它的那个封装类的一个对象的句柄。然而,假如我们说一个内部类是static的,这种说法却是不成立的。
static内部类意味着:
(1) 为创建一个static内部类的对象,我们不需要一个外部类对象。
(2) 不能从static内部类的一个对象中访问一个外部类对象。
但在存在一些限制:由于static成员只能位于一个类的外部级别,所以内部类不可拥有static数据或static内部类。
倘若为了创建内部类的对象而不需要创建外部类的一个对象,那么可将所有东西都设为static。为了能正常工作,同时也必须将内部类设为static。如下所示:
abstract class Contents {
abstract public int value();
}
interface Destination {
String readLabel();
}
public class Test4 {
private static class PContents extends Contents {
private int i = 11;
public int value() {
return i;
}
}
protected static class PDestination implements Destination {
private String label;
private PDestination(String whereTo) {
label = whereTo;
}
public String readLabel() {
return label;
}
}
public static Destination dest(String s) {
return new PDestination(s);
}
public static Contents cont() {
return new PContents();
}
public static void main(String[] args) {
Contents c = cont();
Destination d = dest("Tanzania");
}
}
在main()中,我们不需要Test4 的对象;相反,我们用常规的语法来选择一个static成员,以便调用将句柄返回Contents和Destination的方法。
通常,我们不在一个接口里设置任何代码,但static内部类可以成为接口的一部分。由于类是“静态”的,所以它不会违反接口的规则——static内部类只位于接口的命名空间内部:
interface IInterface {
static class Inner {
int i, j, k;
public Inner() {}
void f() {}
}
}
建议大家在每个类里都设置一个main(),将其作为那个类的测试床使用。但这样做的一个缺点就是额外代码的数量太多。若不愿如此,可考虑用一个static内部类容纳自己的测试代码。如下所示:
class TestBed {
TestBed() {
}
void f() {
System.out.println("f()");
}
public static class Tester {
public static void main(String[] args) {
TestBed t = new TestBed();
t.f();
}
}
}
这样便生成一个独立的、名为TestBed$Tester的类(为运行程序,请使用“java TestBed$Tester”命令)。可将这个类用于测试,但不需在自己的最终发行版本中包含它。
不过对于内部的Static类,需要注意下面几点:
●为创建一个static内部类的对象,我们不需要一个外部类对象
●不能从static内部类的一个对象中访问一个外部类对象
●由于static成员只能位于一个类的外部级别,所以内部类不可拥有static数据或static内部类
分享到:
相关推荐
该文档介绍了java中static的作用,并详细的描述了static的不同用法,和含义 。
根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。
static关键字详解: 内容摘要: 一、static关键字定义属性 二、static属性与非static属性还有一个最大的区别,所有的非static属性必须产生实例化对象之后才可以访问,但是static属性不受实例化对象的控制,也就是 说...
主要介绍了JAVA中static方法的用法,结合实例形式较为详细的分析了Java中static方法的功能、使用技巧与相关注意事项,需要的朋友可以参考下
主要为大家详细介绍了java中static关键字的用法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Static关键字可以修饰什么? 从以下测试可以看出, static 可以修饰: 1....那么当声明一个事物为static时,意味着这个域或者方法不会与包含它的那个类的任何对象关联在一起,也是说,它不依赖
Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问.下面我们来详细了解一下吧
010402_【第4章:数组与方法】_方法的声明及使用笔记.pdf 010403_【第4章:数组与方法】_数组的引用传递笔记.pdf 010404_【第4章:数组与方法】_Java新特性对数组的支持笔记.pdf 020501_【第5章:面向对象基础】_...
主要介绍了Java中this,static,final,const用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
static 关键字可以用来修饰:属性、方法、内部类、代码块; static 修饰的资源属于类级别,是全体对象实例共享的资源; 使用 static 修饰的属性,静态属性是在类的加载期间初始化的,使用类名.属性访问 案例说明 ①...
5.4.4 Java中对象的创建和使用127 5.5 属性130 5.5.1 属性的定义130 5.5.2 变量131 5.6 方法132 5.6.1 方法的定义132 5.6.2 构造方法135 5.6.4 方法重载138 5.6.5 自定义方法138 5.6.6 系统提供方法139 5.6.7 方法...
当 Java 成长起来的时候,许多的 C 程序员开始转向学习 Java,他们发现,使用类似 SwapValue 的方法仍然不能改变通过参数传递进来的简单数据类型的值,但是如果是一个对象,则可能将其成员随意更改。于是他们觉得...
本文主要介绍了Java中final的使用方法,final是java的关键字,本文就详细说明一下它的使用方法,需要的朋友可以参考下
本文将对Java File文件操作类进行详细地分析,并将File类中的常用方法进行简单介绍,有需要的Java开发者可以看一下。 构造函数 public class FileDemo { public static void main(String[] args) { ...
在这个例子中我们使用了容器类的方法getGraphics()来获取一个Graphics对象(可以理解为一个画笔)。 例子 6 (效果如图1所示) 图1 双线程绘画程序 import java.applet.*; import java.awt.*; ...
Java学习笔记 1 命令行运行 1 Java基础 1 注释 1 单行注释 1 多行注释 1 文档注释 1 标识符和关键字 2 数据类型 4 类型转换 7 ...使用命令行生成 12 使用idea生成 12 Java流程控制 13 ...Java方法 22 ...static详解
null 只是-种特殊的值使用 Null-Safe 方法null 判断 关于思维导图 Java.IO Java.lang Java.math Java.net Java 基础核心总结 V2.0 IO 传统的 BIO BIO NIO 和 AIO 的区别什么是流 流的分类 节点流和处理流 Java ...
synchronized可以用来同步静态和非静态方法,下面就具体来看一下Java中synchronized关键字修饰方法同步的用法详解:
5. 方法详解 6. 编程思维案例 7. 面向对象基础 8. 常用API 9. 综合项目实战 Java加强篇包括: 1. static、单例设计、继承 2. 权限修饰符、常量、枚举、抽象类 3. 多态、内部类、常用API 4. 日期与时间、日期类、包装...
如何使用方法的返回值? 166 7.4.4 使用return结束方法 166 7.5 方法重载(overload):给汽车加速添个限制 168 7.5.1 什么是方法的签名 168 7.5.2 什么是重载?为什么要重载? 168 7.5.3 给汽车加个重载的方法...