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. [Hibernate] inner Join和 left Join

    @Test public void test11(){ Session ss=HibernateUtil.getSession(); //根据员工名称(SCOTT)找到和他所在的部门的其他员工的信息 ...

  2. caffe生成deploy.prototxt文件

    参考: http://blog.csdn.net/cham_3/article/details/52682479 以caffe工程自带的mnist数据集,lenet网络为例: 将lenet_train ...

  3. sevrlet进行用户名密码校验

    在eclipse中建立了web项目,实现注册和登录还有在个人中心显示用户名密码 注册功能 源码如下 package com.sevlet.demo; import java.io.IOExceptio ...

  4. eXosip sip

    eXosip是对osip的封装,是对sip协议的使用更简单.osip是gnu开源的sip协议实现. 介绍: http://savannah.nongnu.org/projects/exosip 下载地 ...

  5. vim 插件 -- ctags

    vim ctags 插件实现代码跳转的功能.希望在一个项目中快速的找到函数,变量,宏等定义的地方. 下载 http://ctags.sourceforge.net/ 安装 tar -jxvf ctag ...

  6. learning makefile grammar

  7. Java 猜字谜游戏

    package fundmental_excise6; import java.util.Arrays; import java.util.Scanner; /** * @author : jeasi ...

  8. [BZOJ2427]软件安装

    Problem 每个软件都要安装某些软件才能安装,而且都有体积和价值,求安装的价值最大值 Solution 对于每个环,我们可以知道必须全部一起取或者不取,因此我们先用Tarjan缩点 然后我们用一个 ...

  9. weinre 远程调试 安装 配置

    1.第一种方法:安装:npm install -g weinre 2.第一种方法:开启本地监听服务器(修改端口,默认端口是8080):在cmd中运行: weinre --httpPort 8101 - ...

  10. leetcode python 010

    #实现正则表达式匹配并支持'.'和'*'.#''匹配任何单个字符.#'*'匹配前面元素的零个或多个.#匹配应覆盖整个输入字符串(非部分).##Some examples:##isMatch(" ...