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. 开机自动启动WEB服务,共享目录。

    最近工作中,需要共享一个目录,每次重启总要手动执行一下  nohup python -m SimpleHTTPServer 8000这个命令,想着实现让它开机自动启动,就一劳永逸了. 手动步骤如下: ...

  2. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建自定义视图

    jQuery EasyUI 数据网格 - 创建自定义视图 在不同的情况下,您可能需要为数据网格(datagrid)运用更灵活的布局.对于用户来说,卡片视图(Card View)是个不错的选择.这个工具 ...

  3. 如何使用 Deepfakes 换脸

    如何使用 Deepfakes 换脸 1. 获取deepfakes工具包 git clone https://github.com/deepfakes/faceswap.git 2. 补齐依赖包: pi ...

  4. cookie,session和token的概念以及区别

    cookie: 采用客户端保存状态的方案: cookie的组成:名字,值过去时间,路径以及域: 没有设置时间:随着浏览器的打开和关闭决定: 设置了时间:浏览器就会把cookie保存在硬盘上,根据时间来 ...

  5. JavaScript 复杂判断的更优雅写法

    我们编写js代码时经常遇到复杂逻辑判断的情况,通常大家可以用if/else或者switch来实现多个条件判断,但这样会有个问题,随着逻辑复杂度的增加,代码中的if/else/switch会变得越来越臃 ...

  6. Mac安装brew(遇到的坑)

    1.安装方法: 网上都会有 命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/i ...

  7. UVa LA 4254 - Processor 二分,贪心 难度: 1

    题目 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  8. 走进JavaScript

    JavaScript的作用:操作HTML元素,响应用户的操作,处理数据: script标签的type或者language可以写也可以不写: script标签防止位置:head结束之前或者body结束之 ...

  9. 海量数据处理之top K问题

    题目: CVTE笔试题https://www.1024do.com/?p=3949 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节. 假设目前有一千万 ...

  10. 团队-爬虫豆瓣top250项目-模块开发过程

    项目托管平台地址:https://github.com/gengwenhao/GetTop250.git 开发模块功能: "get_info()单个页面的爬取"功能,开发时间:15 ...