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. photoshop打开图片显示的是索引,无法编辑解决

    问题如图: 解决方法: 这是因为图像模式是索引颜色,具体为啥图片打开是索引模式我也不是很清楚(捂脸),改成RGB颜色即可修改了 图像=>模式=>RGB颜色 如图:

  2. Spring boot连接MongoDB集群

    主要问题是:MongoDB集群分为复制集(replicaSet)与分片集(shardingSet),那么如何去连接这两种集群: 参考官方文档,我使用了最通用的方法:通过构造connection str ...

  3. TP内部方法访问

    TP定义控制器之后,访问定义的方法: <?php namespace app\index\controller; use think\Controller; class Index extend ...

  4. Saiku本地编译运行后Debug调试(十二)

    Saiku源码拉下来在本地编译通过,然后想进行单元测试 发现不知道怎么写测试类了... 幸好有同事大佬的帮助,教了一招哈哈哈哈... 1.将本地编译通过的Saiku打包好(mvn clean inst ...

  5. 安装Ruby、Sass在WebStrom配置Scss编译环境css自动压缩

    安装Sass和Compass sass基于Ruby语言开发而成,因此安装sass前需要安装Ruby.(注:mac下自带Ruby无需在安装Ruby!) window下安装SASS首先需要安装Ruby,先 ...

  6. 分数化小数(decimal)

    分数化小数 ①我的程序 #include<iostream>using namespace std;int main(void){ int a,b,c,kase=0; while(scan ...

  7. jvm-垃圾收集

    概述 说起垃圾收集,大部分人都把这项技术当做Java语言的伴生产物.其实,GC主要就是考虑完成三件事情: 哪些内存需要回收 什么时候回收 如何回收. 经过半个多世纪的发展,目前内存的动态分配与内存的回 ...

  8. SEH X86

    ( windows 提供的异常处理机制实际上只是一个简单的框架,一般情况下开发人员都不会直接用到.我们通常所用的异常处理(比如 C++ 的 throw.try.catch)都是编译器在系统提供的异常处 ...

  9. wpf-x-指令元素

    1. x:Code 用于代码前置  可以吧 C#代码内嵌到前端里 2. x:XData 用于内嵌xml 文件

  10. JavaScript中的DOM及相关操作

    一.什么是DOM JavaScript由ECMAScript.DOM和BOM三部分组成,其中DOM代表描述网页内容的方法和接口,即文档对象模型(Document Object Model).在网页上, ...