static作用:

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

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

static的特点:

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

静态方法使用:

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

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

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

class Person
{
String name;//成员变量,实例变量,非静态成员变量
String age="8";//成员变量,实例变量,非静态成员变量
static String country="ZN";//静态成员变量,类变量
public void showCountry()//非静态方法可以访问静态成员
{
System.out.println(country);
}
public static void showStaticCountry()//静态方法可以访问静态成员
{
System.out.println(country);
} public static void showAge()//静态方法不能访问非静态成员
{
System.out.println(age);
}        
     public void showName(String name)//非静态方法访问非静态成员
{
this.name=name; System.out.println(name); }   
}
class PersonDemo
{
public static void main(String[] args)
{
Person p1=new Person();
p1.showName("paul");
p1.showCountry();
p1.showStaticCountry();
}
}

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

   

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

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

静态代码块:

格式:

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

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

class StaticCode
{
public StaticCode()
{
System.out.println("m");
} public StaticCode(int x)
{
System.out.println("n");
}
static
{
System.out.println("a");
} {
System.out.println("d");
} } class StaticCodeDemo
{ static
{
System.out.println("b");
} public static void main(String[] args)
{
new StaticCode(5);
System.out.println("over");
}
static
{
System.out.println("c");
}
} //最后输出结果: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. ubuntu 关闭 笔记本键盘背景灯

    /etc/rc.local 加入 ' > /sys/class/leds/tpacpi::kbd_backlight/brightness

  2. [JSTL - fmt] fmt标签格式化日期

    <span ><fmt:formatDate value="${ann.adate }" pattern="yyyy-MM-dd"/>& ...

  3. [easyUI] autocomplete 简单自动完成以及ajax从服务器端完成

    通过id取input标签对象,调用autocomplete方法 <script> var sources = [ "ActionScript", "Apple ...

  4. poj3613

    注意最短路转移的单位元是对角线为0,其它为INF. #include <iostream> #include <cstdio> #include <cmath> # ...

  5. google sitemap

    引言 刚开始以为要一个绿色快速通道网页,涵盖常用的地址链接,以便于google的爬虫统计数据,然后看了google sitemap站点文档,原来站点地图是一种文件,您可以通过该文件列出您网站上的网页, ...

  6. IDEA-------破解方法

    ① 到这个地方下载 IntelliJ IDEA 注册码:http://idea.lanyus.com/  就是这个jar包:JetbrainsCrack-2.6.10-release-enc.jar ...

  7. Electron入门之ipcMain,ipcRenderer

    ipcMain 模块是类EventEmitter的实例.当在主进程中使用它的时候,它控制着由渲染进程(web page)发送过来的异步或同步消息.从渲染进程发送过来的消息将触发事件. [发消息] 发送 ...

  8. 在flask中使用websocket-实时消息推送

    - flask默认使用wsgi支持http协议,如需使用websocket需要安装gevent-websocket模块,http,websocket协议都可以支持 Django应用:channel T ...

  9. linux-Centos7安装python3并与python2共存

    1.查看是否已经安装Python CentOS 7.2 默认安装了python2.7.5 因为一些命令要用它比如yum 它使用的是python2.7.5. 使用 python -V 命令查看一下是否安 ...

  10. mycat 入门使用例子

    目的:有 user 和 t_order 两张数据表,表 user 的数据全部存放在 db1_zhang 中,表 t_order 的数据按 id 对 2 取模分别存放在 db1_zhang 和 db2_ ...