Java Static 深入理解

static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。

只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

需要了解jvm classloader

1、static变量

按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。

两者的区别是:

对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。

对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

static成员变量的初始化顺序按照定义的顺序进行初始化。static不可以修饰局部变量;

所以一般在需要实现以下两个功能时使用静态变量:

  • 在对象之间共享值时
  • 方便访问变量时

2、静态方法

静态方法的好处就是不用生成类的实例就能直接调用,可以这样理解使用static修饰的成员不再归对象所以,而是属于类 可以理解为是共有的,也就说只要通过类名就可以访问,不需要耗费资源反复创建对象,因为在程序第一次加载的时候就已经在内存中了,直到程序结束该内存才会释放。如果不是static修饰的成员在使用完之后该内存就会被回收,所以说static要慎用,根据实际情况而定

如果这个方法是作为一个工具来使用,就声明为static,不用new一个对象出来就可以使用了,比如连接到数据库,我声明一个 getConnection()的方法,就定义为静态的,因为连接到数据库不是某一个对象所特有的。它只作为一个连接到数据库的工具。至于提高效率的也未 必,要看具体的方法的用处,去定义这个方法是不是静态的。

3、static代码块

static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次,所以说static块可以用来优化程序性能。

static方法块和static方法的区别:

静态代码块是自动执行的;

静态方法是被调用的时候才执行的.

静态方法:如果我们在程序编写的时候需要一个不实例化对象就可以调用的方法,我们就可以使用静态方法,具体实现是在方法前面加上static,如下:

public static void method(){}

在使用静态方法的时候需要注意一下几个方面:

在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。(备注:静态变量是属于整个类的变量而不是属于某个对象的)

静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。

静态程序块:当一个类需要在被载入时就执行一段程序,这样可以使用静态程序块。

public class DemoClass {

private DemoClass(){}

public static DemoClass _instance;

static{

if(null == _instance ){

_instance = new DemoClass();

}

}

public static DemoClass getInstance(){

return _instance;

}

}

这样的程序在类被加载的时候就执行了static中的代码。

时间: 2024-10-09 03:09:15

Java Static 深入理解的相关文章

Java static 关键字

本文介绍 Java static 关键字的用法和注意点: 1. 使用 static 声明属性--即 static 声明全局属性 2. 使用 static 声明方法--即通过类名直接调用 static 方法 注意点: 使用 static 方法的时候,只能访问 static 声明的属性和方法,而非 static 声明的方法和属性是不能访问的. 我们使用如下代码声明三个对象,并且相应的进行赋值: package hello; class People2{ String name; int age; p

JAVA static 作用

static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们.因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象. 用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的

【Java】深入理解ThreadLocal

一.前言 要理解ThreadLocal,首先必须理解线程安全.线程可以看做是一个具有一定独立功能的处理过程,它是比进程更细度的单位.当程序以单线程运行的时候,我们不需要考虑线程安全.然而当一个进程中包含多个线程的时候,就需要考虑线程安全问题,因为此时线程可能会同时操作同一个资源,当两个或者两个以上线程同时操作一个资源的时候,就会造成冲突.不一致等问题,即线程不安全. 解决线程安全问题,本质上就是解决资源共享问题,一般有以下手段: 1)可重入(不依赖环境):2)互斥(同一时间段只允许一个线程使用)

Java基础之理解Annotation(与@有关,即是注释)

Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类.方法.成员变量等)进行关联. 更通俗的意思是为程序的元素(类.方法.成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供指定的工具或框架使用的. Annontation像一种修饰符一样,应用于包.类型.构造方法.方法.成员变量.参数及本地变量的声明语句中.

Java的finally理解

1.为什么要用finally 先看一个没有finally的异常处理try-catch语句: 如果count为要使用到的资源,而且用完要求释放此资源.那么我们能够把释放资源的语句放到try-catch后运行,当前的程序无论是在运行完try语句块还是catch语句块,都会顺序运行到以下释放资源的语句. int count = 0;  //初始化资源 try{ count++; if(count == 1) throw new Exception("Exception in try"); }

对java面向对象的理解

前言: 在写博客前我们应该有个好的定位,可以是对知识的梳理和理解,可以是一种新技术,可以是对难点易错的解析和理解. 正文: java面向对象的理解.面向说的通俗点就是针对,对象就是有实际意义的事物(万物皆对象)其实也就是java中的一个参数,但这个参数实际代表了某个东西(比如你有个类Tourism,这个类对 属性姓名.年龄.当Tourism tou = new Tourism(),这个tou参数就实际代表了一个类Tourism的有意义对象,而某一个方法tourism(Tourism tou)那么

Java面向对象的理解和实现代码

理解Java面向对象的重要知识点: 一. 类,对象 类?首先举一个例子:小李设计了一张汽车设计图,然后交给生产车间来生产汽车,有黑色的.红色的.白色的... 这里,汽车设计图就是我们说的类(class),生产车间就是new构造器(大部分对象都是new出来的),生产出来的汽车就是我们要说的对象.可以说java编程实质就是构建类的过程. 对象?万物皆对象,宇宙中,如植物,动物,人类,每个个体都是各司其职.各尽所能的.这就要求对象高内聚.低耦合(简单理解就是人的大脑,它负责思考,想象,记忆,而不能呼吸

对面向对象的理解和this static的理解

对象理解 JAVA语言是直接面向对象的语言,与以往的 当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(比如,在函数A中调用函数B,在函数B中定义变量a,变量a的作用域只是函数B,在函数B运行完以后,变量a会自动被销毁.分配给它的内存会被回收),Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用本不同是:它的设计出发点更能直接的描述问题域中客观存在的事物. 对象用计算机语言来对问题域中事物的描叙,对象通过"属性"和&q

Java Class类理解

Java Class类理解: 首先,Class是一个java类,跟Java API中定义的诸如Thread.Integer类.我们自己定义的类是一样,也继承了Object(Class是Object的直接子类).总之,必须明确一点,它其实只是个类,只不过名字比较特殊.更进一步说,Class是一个java中的泛型类型. 对于我们自己定义的类,我们用类来抽象现实中的某些事物,比如我们定义一个名称为Car的类来抽象现实生活中的车,然后可以实例化这个类,用这些实例来表示我的车.你的车.黄的车.红的车等等.