静态:static

用法:是一个修饰符,用于修饰成员(成员变量,成员函数),

  当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,还可以直接被类名调:类名.静态成员

    类名.静态成员

存在:方法区,共享区,数据区(非堆内存、栈内存的另一个存储区),Static 块仅在该类被加载时执行一次。

 

static特点:

1,随着类的加载而加载,也就是说静态会随着类的消失而消失,说明他的生命周期最长

2,优先于对象的存在。(静态先存在,对象后存在。)

3,被所有对象所共享

4,可以直接被类名调用

  由于静态static不依赖于任何对象就可以进行访问,因此对于静态来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

  内部类中不能存在static修饰的成员,因为static随着类加载产生,内部类依附于宿主类,系统加载:宿主类-->静态-->内部类,而内部类的静态是随着内部类加载产生,与加载类就加载static矛盾,所以内部类中不能存在static修饰

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

静态使用注意事项:

1,静态方法只能访问静态成员,非静态方法既可以访问静态也可以访问非静态。(Java虚拟机(JVM)加载类时,就会执行该static,静态优先于其他产生对象产生)。

2,静态方法中不可定义this,super等关键字:

    (this:this代表当前对象,static于类加载的时候存在优先于实例对象的产生,static调用非静态时并未产生对象,所以this不代表任何对象为null,未进行初始化操作。)

3,主函数是静态方法。

静态有利有弊:

利:对对象的共享数据进行单独空间的存储,节省空间,没有必要每一格对象中都存储一份。可以直接被类名调用。

弊:生命周期过长,访问出现局限性(静态虽好,只能访问静态)

static和final一块用表示什么 
1,static final用来修饰成员变量和成员方法,可简单理解为"全局常量"
2,对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 
3,对于方法,表示不可覆盖,并且可以通过类名直接访问。

类成员变量:

static修饰:静态变量或类变量

无static修饰:实例变量

  静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存(方法区,共享区,数据区),在加载类的过程中完成静态变量的内存分配,可用类名.成员,当然也可以通过对象来访问(但是这是不推荐的,对象产生新的开辟内存空间,static优先于对象的产生,节省内存)。

  不能直接访问所属类的实例变量和实例方法

  static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。

什么时候使用静态:

  因为静态修饰的内容有成员变量和函数。

  使用静态变量(类变量):当对象中出现共享数据时,该数据被静态所修饰。对象中的特有数据要定义成非静态存在于堆内存中。

  使用静态函数:当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的

静态代码块。
  格式:
    static{
        静态代码块中的执行语句。
      }

  特点:随着类的加载而执行,只执行一次,并优先于主函数。用于给类进行初始化的。

class StaticCode
  {
int num = 9;
StaticCode()
{
System.out.println("b");
} static
{
//只执行一次,并优先于主函数。 System.out.println("a");
}
{
System.out.println("c"+this.num);
} StaticCode(int x)
{
System.out.println("d");
}
public static void show()
{
System.out.println("show run");
}
} class StaticCodeDemo
  {
static
{
System.out.println("b");//(1)
}
public static void main(String[] args)
{ //尽管new StaticCode两次,但是静态代码块只执行一次
(1)new StaticCode();
new StaticCode();
System.out.println("over"); //b c a over
//构造代码块优先于对象产生
//优先级:静态代码库>代码块>对象产生
(2)new StaticCode(4);//b c a c9 d
//StaticCode.show();//b c a show run c9
(3)当构造代码对象为空时,没有任何意义,未使用该类,所以哪怕是静态成员也不存在
//StaticCode s = null;
(4)
//s = new StaticCode();//b c a c9 b }
static
{
System.out.println("c");//(2)
}
}
//d:\>java0217\day06>java StaticCodeDemo 先加载b c

  

  

Java static的用法以及原理(06)的更多相关文章

  1. java this的用法以及原理

    /** * this存在方法中,在方法中被调用. * 且是非static方法中被调用.(this 表示这个类的当前实例,而静态方法不依赖于该类的任何实例,随着类产生而装载,因此方法内不能引用 this ...

  2. Java之反射 — 用法及原理

    Java之反射 - 用法及原理 定义 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象 ...

  3. Java中static的用法

    static静态,作为修饰符,最初是由c引入,一开始static表示退出一个块后依然存在的局部变量.随后,static表示不能被其他文件访问的全局变量和函数.到了C++和java,static表示属于 ...

  4. Java中static的用法,初始化块

    使用 Arrays 类操作 Java 中的数组语法: Arrays.sort(数组名); 可以使用 sort( ) 方法实现对数组的排序,只要将数组名放在 sort( ) 方法的括号中,就可以完成对该 ...

  5. Java线程:概念与原理

    Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...

  6. 四种Java线程池用法解析

    本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 执行一个异步任务你还只是如下 ...

  7. Java序列化的机制和原理

    Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对象,什么时候需要序列化以及Java序列化的算法. 有关Java对象的序列化和反序列化也算是Java基础 ...

  8. Java序列化的机制和原理 转

    转 http://developer.51cto.com/art/200908/147650.htm Java序列化的机制和原理 本文讲解了Java序列化的机制和原理.从文中你可以了解如何序列化一个对 ...

  9. java并发包&线程池原理分析&锁的深度化

          java并发包&线程池原理分析&锁的深度化 并发包 同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的, ...

随机推荐

  1. [JZOJ]1293.气象牛[区间DP]

    Description 为了研究农场的气候,Betsy帮助农夫John做了N(1 <= N <= 100)次气压测量并按顺序记录了结果M_1-M_N(1 <= M_i <= 1 ...

  2. TensorFlow中的L2正则化函数:tf.nn.l2_loss()与tf.contrib.layers.l2_regularizerd()的用法与异同

    tf.nn.l2_loss()与tf.contrib.layers.l2_regularizerd()都是TensorFlow中的L2正则化函数,tf.contrib.layers.l2_regula ...

  3. 八、React实战:可交互待办事务表(表单使用、数据的本地缓存local srtorage、生命同期函数(页面加载就会执行函数名固定为componentDidMount()))

    一.项目功能概述 示例网址:http://www.todolist.cn/ 功能: 输入待做事项,回车,把任务添加到 [正在进行] [正在进行] 任务,勾选之后,变成已[经完成事项] [已完成事务], ...

  4. MERGE INTO:存在就更新不存在就新增——oracle

    MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your ...

  5. vue学习(十一)vue-cli3开发单文件组件

    一 单文件组件介绍 二 如何安装Vue-Cli3脚手架 三 快速原型开发 四 vue-cli3生成项目 五 购物车项目搭建 六 购物车项目操作 七 Mock模拟数据 八 Vue中使用第三方组件(ele ...

  6. Mysql :分支结构—if函数

    一分支结构 1.if函数 功能:实现简单的双分支 语法: IF (表达式1,表达式2,表达式3) 执行顺序 如果表达式1成立 则if函数返回表达式2的值,否则返回表达式3的值 应用: 任何地方

  7. DCGAN

    Deep Convolutional Generative Adversarial Networks we introduced the basic ideas behind how GANs wor ...

  8. springboot整合mybatis与thymeleaf

    1.创建springboot项目 (1)选择Spring Initializr (2)填写自己的Group 与 Artifact (3)选择依赖框架 等待maven下载好依赖和插件即可 2.主配置文件 ...

  9. UVA - 10118 Free Candies(免费糖果)(dp---记忆化搜索)

    题意:桌上有4堆糖果,每堆有N(N<=40)颗.佳佳有一个最多可以装5颗糖的小篮子.他每次选择一堆糖果,把最顶上的一颗拿到篮子里.如果篮子里有两颗颜色相同的糖果,佳佳就把它们从篮子里拿出来放到自 ...

  10. POJ 1416:Shredding Company

    Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4713   Accepted: 2714 ...