static是一个静态修饰符,用于修饰成员(成员变量,成员函数)。《thinking in java》对staic的使用场景有下面2种定义:“一种情形是只想用一个存储区域来保存一个特定的数据—— 无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法”。。在类中,用static声明的成员变量成为静态成员变量,用static声明的方法即称为静态方法。对于static,它有如下几个特点:

 1.随着类的加载而加载。

一旦static被创建,它会一直存在静态常量池中,知道程序执行完,随着类的消失而消失,它的生命周期相对来说是最长的。

2.优先于对象存在

静态是优先于对象存在的。

举个例子:

public class Demo {

    public static void main(String[] args) {
Test.name="hello";
Test.staticHello();//优于对象创建,所以可以直接调用static修饰的方法
//Test.age=0 //调用非静态变量age会报错,因为对象还未创建
Test t=new Test();//创建对象
t.age=18;//这个时候就可以调用非静态变量和方法
t.normalHello(); }
}
class Test{
static String name;
int age;
public static void staticHello(){
System.out.println("static name:"+name);
}
public void normalHello(){
System.out.println("normal age:"+age);
}
}

输出结果为:

static name:hello
normal age:18

从这个例子还可以看出,我们可以在没有创建对象的情况下,通过类名直接调用static修饰的方法和变量,所以可以得知,static是不依赖于对象存在的,即

3.被类的所有对象所共享

因此,静态的成员变量和方法也不能使用this,super关键字,这2个关键字都是基于对象的。

4.可以直接被类名所调用

在上述的例子中,可以看到static修饰的变量方法是直接通过类名Test调用出来的,当然,在创建对象之后,同样可以使用创建的对象去调用这个方法。

在不创建对象的情况下,静态方法不能访问类的非静态成员变量/方法,main方法就是一个静态方法,假如我们在Demo类里创建一个成员变量String names,要在main方法里直接取到这个值是不行的,如果没有创建对象,它就不能直接访问。而非静态方法可以访问静态成员/方法

《Thinking in java4》中“当程序创建第一个对类的静态成员的引用时,就会加载这个类。这个证明构造器也是类的静态方法,即使在构造器之前没有使用static关键字”。因为静态方法可以在未创建对象时调用,从这个角度看,构造方法在对象未创建时调用,可以看作是静态方法。
但从另一个方面来看,静态方法不能调用实例方法,而构造方法可以调用实例方法,所以构造方法也不算是静态方法。

转载请注明出处http://www.cnblogs.com/epilogue/p/5670220.html

最新文章

  1. 全球2/3的DNS瘫痪 顶级域名根服务器故障
  2. HashMap 和 HashTable区别
  3. 数据库操作sql【转】
  4. 获取枚举类型Description特性的描述信息
  5. HDU-4691 Front compression 后缀数组
  6. RHEL7查看网卡配置命令ip addr show
  7. Spring实战笔记2---Bean的装配
  8. POJ - 3249 Test for Job (DAG+topsort)
  9. 基于AFNetworking 3.0的取消已发出的网络请求
  10. 【树莓派】修改树莓派盒子MAC地址
  11. LeetCode 327. Count of Range Sum
  12. Java组合模式
  13. CSS3实现投影效果
  14. windows7+apache2.4+sql server+php7.0
  15. unity3d-知识汇总
  16. [译] 什么阻塞了 DOM?
  17. SD从零开始57-58,第三方订单处理,跨公司销售
  18. 开源软件License汇总
  19. dbt 包管理
  20. print输出

热门文章

  1. 刨根究底字符编码之十——Unicode字符集的字符编码方式CEF
  2. 源代码安装软件-MySQL
  3. 7.ReadWriteLock接口及其实现ReentrantReadWriteLock
  4. MarkDown编辑器快捷方式
  5. 实验:Oracle数据泵导出导入之序列问题
  6. RedHat6.2 x86手动配置LNMP环境
  7. C# ftp 图片上传多快好省
  8. Android之使用JAVA占位符格式数据(很实用)
  9. [Linux] PHP程序员玩转Linux系列-Ubuntu配置SVN服务器并搭配域名
  10. 【Python3之socket编程】