通常,当创建类时,就是在描述那个类的外观和行为。只有用new创建类的对象时,才分配数据存储空间,方法才能被调用。但往往我们会有下面两种需求:

1、我想要这样一个存储空间:不管创建多少对象,无论是不创建还是创建无数个,我只在特定区域分配这一个存储空间,大家一起调用,共用资源;

2、我创建一个方法,不与任何对象有关联,只要需要,其他任何对象都可以调用这个方法,这个方法与它所在的类是否创建没有关系。

通过static关键字,就可以达到这样的目的。

java中用static修饰变量或方法,则该变量或方法独立于该类的任何对象。也就是说,被static修饰的变量或方法,不依赖特定的实例,被所有的实例共享。只要类被加载,Java虚拟机就能根据类名在运行时数据区找到他们。static对象可以在它的任何对象创建之前访问,无需引用任何对象。

static修饰的成员变量或成员方法(静态变量或静态方法),可以直接通过类名来访问:类名.静态方法名(参数)   、类名.静态变量名

1、static变量

被static关键字修饰的变量,叫做静态变量;没有被static修饰的变量,叫做实例变量。

静态变量:在内存中只有一个拷贝,JVM只分配一次内存,在类加载过程中完成静态变量的内存分配。

可以用类名直接访问(推荐),也可以通过对象访问(不推荐)。

实例变量:每创建一个实例,分配一次内存。实例变量可以在内存中有多个拷贝,互不影响。

注意:

1、static final :  通常使用static 和final 关键字共同定义一个常量。静态常量在实际生产中使用比较多,比如java.lang.Math中:

public final class Math {
/**
* The {@code double} value that is closer than any other to
* <i>e</i>, the base of the natural logarithms.
*/
public static final double E = 2.7182818284590452354; /**
* The {@code double} value that is closer than any other to
* <i>pi</i>, the ratio of the circumference of a circle to its
* diameter.
*/
public static final double PI = 3.14159265358979323846;
}

2、static定义的变量的值是可变的

2、静态方法

静态方法可以通过类名直接调用,任何的实例也都可以调用。因此,静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法,只能访问所属类的静态成员变量和静态成员方法。这是因为实例成员和特定的对象关联,而static的方法独立于任何实例,也正是因为这样,static方法必须被实现,而不能是抽象的(abstract)。

静态方法的声明:

1、只能调用其他的static方法

2、只能访问static数据

3、不能以任何方式引用this或super关键字

在下面两种情况下使用静态方法:

1、一个方法不需要访问对象状态,其所需参数都是通过显式参数提供(例如:Math.pow)

2、一个方法只需要访问类的静态域

说明:

1、静态方法是类内部的一类特殊方法,只有在需要的时候才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的

2、静态方法的声明一般是为了方便其他类对该方法的调用

3、静态方法最常见的实例是:main方法

public static void main(String[] args) {

}

3、static代码块

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

静态代码块实例:

public class HelloB extends HelloA {
static {
System.out.println("static B1");
}
static {
System.out.println("static B3");
} public static void main(String[] args) {
new HelloB();
} static {
System.out.println("static B2");
}
} class HelloA {
static {
System.out.println("static A1");
}
static {
System.out.println("static A2");
}
}

执行结果:

static A1
static A2
static B1
static B3
static B2

执行结果说明:

1、继承关系中,实例化子类,会首先实例化父类;

2、静态代码块会在类加载过程中初始化。

4、static import   静态导入

可以在类中 静态导入一个类的静态方法和静态域,语法如下:

import static java.lang.System.*;

静态导入之后,就可以直接使用导入类的静态方法和静态域,而不必加类名前缀。

示例:

import static java.lang.System.*;
import static java.lang.Math.*; public class StaticTest {
public static void main(String[] args) {
/**
*静态导入后可以直接使用类中的静态方法和静态域,而不必加前缀
*静态导入示例1:System
*/
System.out.println("Hello World!");//不使用静态导入
out.println("Hello World!");//使用静态导入
/**
*静态导入示例2:Math
*/
int x = 3;
Math.sqrt(Math.pow(x, 2)+Math.pow(x, 2));//不使用静态导入,需要:类名.方法
sqrt(pow(x, 2)+pow(x, 2));//使用静态导入,直接使用类中的静态方法
}
}

参考资料:

1.  《Java核心技术 卷1》  4.4 静态域与静态方法 、 4.7.2静态导入

2.  《Java编程思想》 2.6.3 static关键字 、5.4.2static的含义

3.  Java static详解

Java关键字:static的更多相关文章

  1. java关键字static使用总结

    java关键字static使用总结 1.static修饰的方法被称之为静态方法也叫做类方法,加static的方法,可以通过类名直接访问,不加static的方法只能通过对象名访问. 静态方法可以直接通过 ...

  2. java笔记——Java关键字static、final使用小结

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

  3. Java关键字--static

    在Java中,将关键字static分为三部分进行讨论,分别为Java静态变量.Java静态方法.Java静态类 Java Static Variables Java instance variable ...

  4. Java关键字static、final

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

  5. Java关键字static、final使用小结

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

  6. [JAVA关键字] static & final

    JAVA十分常见的关键字static & final 总的来说final表示常量,即不可更改的:而static表示静态,即全局的 1. final 类:不能被继承 2. final 方法:能被 ...

  7. Java 关键字 static

    关键字static作用如下: 1. 为某个基本数据类型或对象分配单一的存储空间. 2. 实现某个属性或方法与类关联.在类被加载后类名可以直接调用静态成员方法(下面简称静态方法)或者访问静态成员变量(下 ...

  8. java 关键字static

    在Java中static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰代码块. Java把内存分为栈内存和堆内存, 栈内存用来存放一些基本类型的变量.数组和对象的引用, 堆 ...

  9. java关键字“static”

    Java中static使用方法 1.static静态变量 静态变量:每个类只有一个,所有实例共享: 实例变量:每个实例只有一个: package test2; import java.lang.Str ...

  10. Java关键字——static

    static申明属性 如果有属性希望被所有对象共享,则必须将其申明为static属性. 使用static声明属性,则此属性称为全局属性,有时候也称为静态属性. 当一个类的属性申明位static的时候, ...

随机推荐

  1. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  2. [C#] 剖析 AssemblyInfo.cs - 了解常用的特性 Attribute

    剖析 AssemblyInfo.cs - 了解常用的特性 Attribute [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/5944391.html 序 ...

  3. 安装eclipse的maven插件

    我们团队用maven来管理项目需要的库文件,其实以前都没听过maven,第一次接触这个,师兄要我直接去装下这个,开始以为还挺简单的,没想到中间遇到了一些小麻烦,现在把我成功安装maven的过程分享下, ...

  4. 如何利用tcpdump对mysql进行抓包操作

    命令如下: tcpdump -s -l -w - dst -i eno16777736 |strings 其中-i指定监听的网络接口,在RHEL 7下,网络接口名不再是之前的eth0,而是 eno16 ...

  5. 火星坐标、百度坐标、WGS-84坐标相互转换及墨卡托投影坐标转经纬度JavaScript版

    火星坐标 火星坐标是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图.导航设备都是采用的这一坐标系或在这一坐标的基础上进行二次加密得到的.火星坐标的真实名称应该是GCJ- ...

  6. springmvc+bootstrap+jquerymobile完整搭建案例(提供下载地址)

    用一张简单的截图说明下,然后提供一个下载地址. bootstrap的大部分样式官方都是写好的,所以只需要class="官方样式即可",具体可以看官方的案例,下面来个地址 http: ...

  7. XAMARIN.ANDROID SIGNALR 实时消息接收发送示例

    SignalR 是一个开发实时 Web 应用的 .NET 类库,使用 SignalR 可以很容易的构建基于 ASP.NET 的实时 Web 应用.SignalR 支持多种服务器和客户端,可以 Host ...

  8. DB2重启数据库实例

    DB2重启数据库实例时,有时停止实例会失败,此时需要先确认没有应用链接数据库,然后再关闭数据库实例,并重新启动. 1.查看是否有活动的链接 命令:db2 list applications for d ...

  9. Linux基础介绍【第五篇】

    linux权限位 Linux文件或目录的权限位是由9个权限位来控制,每三位为一组,它们分别是文件属主权限.属组权限.其他用户权限. r:read可读权限,对应数字4: w:write可写权限,对应数字 ...

  10. EChart系列:在echart3中使用百度地图扩展之后,如何获取到百度地图对象

    最近做项目想要在百度地图上叠加显示echart的散点图,然后根据地图的缩放等级和区域范围要显示不同的散点图,这中间折腾了好久.功能要求包括: (1)底图使用百度地图: (2)可以在地图上叠加显示ech ...