static作用:

用来修饰函数成员,成员变量和成员函数。类对象的属性都一致且能共享,比如国籍,这就能用static修饰,name不能共享,因为每个人都有自己的名字。

特有内容(name)随着对象存储,放在堆内存中,共性内容(国籍)随着类存储,放在共享区

static的特点:

1.随着类的加载而加载,静态也会随着类的消失而消失。
2.优先于对象存在,也就是静态先存在,对象后存在。
3.被所有对象共享,也能被所有对象所调用。但是为了节省内存空间,没必要每个对象都存储一份。因此一般默认使用类调用。
4.可直接被类名调用。

静态方法使用:

当功能内部没有访问到非静态数据(对象的特有数据),那么可以定义为静态方法。

静态方法注意事项:
1.静态方法只能访问静态成员,不能访问非静态成员(因为静态成员优先于对象存在,因此对象不存在的话,非静态成员也不存在)。但是非静态方法既能访问静态成员,也能访问非静态成员。
2.静态方法中不可以写this,super关键字(因为静态成员优先于对象存在)

3.静态方法不依赖于任何对象就可以进行访问

  1. class Person
  2. {
  3. String name;//成员变量,实例变量,非静态成员变量
  4. String age="8";//成员变量,实例变量,非静态成员变量
  5. static String country="ZN";//静态成员变量,类变量
  6. public void showCountry()//非静态方法可以访问静态成员
  7. {
  8. System.out.println(country);
  9. }
  10. public static void showStaticCountry()//静态方法可以访问静态成员
  11. {
  12. System.out.println(country);
  13. }
  14.  
  15. public static void showAge()//静态方法不能访问非静态成员
  16. {
  17. System.out.println(age);
  18. }        
  19.      public void showName(String name)//非静态方法访问非静态成员
  20. {
  21. this.name=name; System.out.println(name); }   
  22. }
  23. class PersonDemo
  24. {
  25. public static void main(String[] args)
  26. {
  27. Person p1=new Person();
  28. p1.showName("paul");
  29. p1.showCountry();
  30. p1.showStaticCountry();
  31. }
  32. }

 上面代码在内存表现形式:当New 一个person对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态成员(带有static修饰的成员变量)的代码加载到一个叫做方法区的地方,然后再在堆内存中创建对象。如图所示:

   

静态成员变量(类变量)和非静态成员变量(实例变量)区别:

存放位置:
  类变量随着类的加载而存放在方法区
  实例变量随着对象的建立儿存在堆内存中
生命周期:
  类变量生命周期最长,随着类的消失而消失
  实例变量生命周期随着对象的消失而消失

静态代码块:

格式:

static
{
静态代码块执行的语句
}
特点:
随着类的加载而执行,且只执行一次(即便实例化多个对象也只执行一次,因为类只加载一次),并优先于主函数执行,用于给类进行初始化。

执行先后顺序排序:静态代码块>构造代码块>构造函数>成员非静态函数

  1. class StaticCode
  2. {
  3. public StaticCode()
  4. {
  5. System.out.println("m");
  6. }
  7.  
  8. public StaticCode(int x)
  9. {
  10. System.out.println("n");
  11. }
  12. static
  13. {
  14. System.out.println("a");
  15. }
  16.  
  17. {
  18. System.out.println("d");
  19. }
  20.  
  21. }
  22.  
  23. class StaticCodeDemo
  24. {
  25.  
  26. static
  27. {
  28. System.out.println("b");
  29. }
  30.  
  31. public static void main(String[] args)
  32. {
  33. new StaticCode(5);
  34. System.out.println("over");
  35. }
  36. static
  37. {
  38. System.out.println("c");
  39. }
  40. }
  41.  
  42. //最后输出结果:b c a d n over

 

Person类含有构造函数,构造代码库,静态代码块。Person p =new Person ("zhangsan",20)在内存执行过程为:

1.因为new 用到了Person类,所以先会找到Person.class的文件并加载熬内存中
2.如果有static代码块,执行类中的static代码块,用来给Person.class进行初始化
3.在堆内存中开辟空间,分配内存地址。
4.在堆内存中建立对象的特有属性,并进行默认初始化
5.对属性进行显示初始化
6.对对象进行构造代码块初始化
7.对对象进行对应的构造函数初始化
8.讲内存地址给栈内存中的P变量

【java】static用法的更多相关文章

  1. Java static的用法以及原理(06)

    静态:static 用法:是一个修饰符,用于修饰成员(成员变量,成员函数), 当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调:类名.静态成员 类名.静态成员 存在:方 ...

  2. Java static 的一两点使用

    这篇文章是关于Java static关键字的使用,主要会介绍以下的内容: static 的概念 static的各种应用 总结 static 是什么 static 顾名思义是静态的意思.与this相对, ...

  3. 【转】java list用法示例详解

    转自:http://www.jb51.net/article/45660.htm java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对java list用法做了详解. Lis ...

  4. Java List 用法代码分析 非常详细

    Java中可变数组的原理就是不断的创建新的数组,将原数组加到新的数组中,下文对Java List用法做了详解. List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3 ...

  5. Java split用法

    Java split用法 java.lang.string.split split 方法  将一个字符串分割为子字符串,然后将结果作为字符串数组返回. stringObj.split([separat ...

  6. Java Enum用法详解

    Java Enum用法详解 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举 ...

  7. 你真的了解java的lambda吗?- java lambda用法与源码分析

    你真的了解java的lambda吗?- java lambda用法与源码分析 转载请注明来源:cmlanche.com 用法 示例:最普遍的一个例子,执行一个线程 new Thread(() -> ...

  8. java static 变量,和方法从属于类

    第36集 java static 变量,和方法从属于类 可以用类来直接调用static属性和方法 static方法不能调用非静态的属性和方法,反之可以 new产生的对象,不包括static 属性和方法

  9. 从零开始学C++之对象的使用(二):四种对象生存期和作用域、static 用法总结

    一.四种对象生存期和作用域 栈对象 隐含调用构造函数(程序中没有显式调用) 堆对象 隐含调用构造函数(程序中没有显式调用),要显式释放 全局对象.静态全局对象 全局对象的构造先于main函数 已初始化 ...

  10. [转]java static final 初始化

    http://tanbing1986411.blog.163.com/blog/static/7259798220103610224434/ java static final 初始化 1.stati ...

随机推荐

  1. [Oracle11g] 通过伪列查询

    oracle中的伪列默认第一行是1,所以可以选择<=rownum的方法选取,但是>是无法选取的.这时候需要固化伪列. 固化前可以这样查询:select * from  表名 where r ...

  2. MSF MS17_010漏洞测试

    0x00 window 2003 R2 x86 use exploit/windows/smb/ms17_010_eternalblue show options set rhost 192.168. ...

  3. arch Linux 安装完,无法通过 SSH 远程连接 root 用户问题

    访问 arch Linux 主机的该文件 [root@eric-laptop ~]# vim /etc/ssh/sshd_config 对应注释部分后边补上下边三行: LoginGraceTime 1 ...

  4. java常用类介绍

    1 日期时间.Math.枚举 1.1 日期时间 计算机如何表示时间? GMT时间指格林尼治所在地的标准时间,也称为时间协调时(UTC),其他地区的时间都是相对于GMT时间的偏移. 北京位于东八区 = ...

  5. doctrine/annotation 的简单使用

    <?php // 错误处理机制 register_shutdown_function('myShutDown'); set_error_handler('myError'); set_excep ...

  6. 『cs231n』卷积神经网络的可视化与进一步理解

    cs231n的第18课理解起来很吃力,听后又查了一些资料才算是勉强弄懂,所以这里贴一篇博文(根据自己理解有所修改)和原论文的翻译加深加深理解,其中原论文翻译比博文更容易理解,但是太长,而博文是业者而非 ...

  7. 查看局域网指定IP的电脑名

    nbtstat -a 192.168.0.139 节点 IP 址址: [192.168.0.140] 范围 ID: [] NetBIOS 远程计算机名称表 名称 类型 状态 ------------- ...

  8. wrk 使用记录及踩过的坑

    wrk是什么?https://github.com/wg/wrk wrk 是一个非常小巧高效的开源性能测试工具,支持lua脚本来创建复杂的测试场景.wrk 的一个很好的特性就是能用很少的线程压出很大的 ...

  9. 使用python来访问Hadoop HDFS存储实现文件的操作

    原文:http://rfyiamcool.blog.51cto.com/1030776/1258292 在调试环境下,咱们用hadoop提供的shell接口测试增加删除查看,但是不利于复杂的逻辑编程 ...

  10. LSTM如何解决梯度消失或爆炸的?

    from:https://zhuanlan.zhihu.com/p/44163528 哪些问题? 梯度消失会导致我们的神经网络中前面层的网络权重无法得到更新,也就停止了学习. 梯度爆炸会使得学习不稳定 ...