Java static

在总结完 想知道Java代码执行顺序么,Let's go 一文后,对 Java 中的static关键字有了更深的理解,所以有兴趣的可以先看看这篇文章。

前言

Java中没有c、c++这类语言中的全局变量的概念,但是可以通过使用static关键字修饰变量,获得一个类似于全局变量的静态变量。在 Java中,static意为“静态”。可以用来修饰变量、代码块和方法。

static 变量

Java中有两类变量:类变量和实例变量。
*** 类变量: ***被static关键字修饰的变量为类变量、静态变量,JVM 在类的连接阶段,会为类变量赋予默认的初始值,在类初始化阶段,赋予类变量程序中指定的初始化值。类变量伴随着类的产生而产生,类的卸载而消失。所以,在整个类的生命周期中,类变量都只会被初始化一次,并且类变量独立于类的实例而存在,为类的所有实例所共享。
类变量可以直接通过类名来使用,而无需创建该类对象。
*** 实例变量: ***未被static修饰的变量即为实例变量,实例变量与具体的类对象有关,随着对象的实例化而产生,对象的终结而消失。

** 类变量 VS 实例变量 **

  • JVM 只会为类变量分配一次内存,而每创建一个实例,JVM 就会为实例变量分配一次内存;
  • 类变量的生命周期一般比实例变量长;
  • 类变量为类的所有实例所共享,而实例变量只与特定的实例有关;
  • 既可以直接使用类名.类变量的方式使用类变量,也可以使用对象.类变量的方式使用类变量,但实例变量只能通过实例访问;

一般会在如下两种情况下使用类变量:在对象之间共享值时和为了方便访问变量时

static块

被static关键字修饰的代码块为静态块,静态块一般用于初始化静态变量,静态块不存在于任何方法体内,可以放在类的任何地方,也可以有多个。当 Java类初始化时,会执行静态块中的代码,静态块和静态域的初始化顺序依程序中定义的顺序而定--** 先定义则先执行 **

static 方法

被static修饰的方法为静态方法。

  • 静态方法独立于任何实例,可以直接通过类名引用;
  • 静态方法内部不能够引用非静态域和非静态方法,因为静态方法独立于类的实例而存在,而非静态方法/非静态域依赖于类的特定实例,与某一个实例密切相关,当一个类实例对象终结时,与之相关的非静态域和方法也都随之消失,所以如果一个静态方法内部引用了一个非静态域/方法的话,此时就会出错;
  • 静态方法内部不能使用 this 和 super 关键字,因为这两个关键字均是与类的实例相关的;

Q & A:

*** Q: ***main 方法为什么设计成static方法?
*** A: ***这是出于效率考虑,将 main 方法设计为 static 的,便可以在类初始化工作完成后就使用该方法,而无需等到创建一个对象后;其次,可以节省内存,因为 static 方法只会占据一份内存,而非 static 的方法则会在每次实例化时均分配内存
*** Q: ***static和final一起使用,会产生什么效果?
*** A: ***static final一般用于表示常量,如果用static final修饰变量,则表示该变量一旦赋值,则不能够再修改它的值(或它指向的对象引用),并且该变量独立于任何实例,可以直接通过类访问;static final 修饰的方法是一个静态的、不能被修改的方法。

示例

public class staticTest {
    private static A statica = new A("private static");
    public static A staticb = new A("public static");
    private static final A STATIC_C = new A("private static final");
    public static final A STATIC_D = new A("public static final");

    public int a = 8;

    static {
        print("static block in staticTest");
        // a++; 提示 non-static field 'a' cannot be referenced from a static context
    }

    static void staticMethod(){
        print("static method in staticTest");
        // a++; 提示 non-static field 'a' cannot be referenced from a static context
    }
}
public class staticMain {

    public static void main(String[] args) {
        staticTest.staticMethod();      // 直接通过类名访问静态方法
        print(staticTest.staticb);      // 直接通过类名访问静态变量
        print(staticTest.STATIC_D);

        // staticTest.a; 提示 non-static field 'a' cannot be referenced from a static context
        // 非静态方法必须通过实例访问
        staticTest test = new staticTest();
        print(test.a);
    }
}
// Output:
private static
public static
private static final
public static final
static block in staticTest
static method in staticTest
class A & the str is public static
class A & the str is public static final
8
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350

推荐阅读更多精彩内容

  • 文章大纲:1.为什么static会有这样的效果?2.static的使用3.static误区4.static面试题 ...
    柠檬乌冬面阅读 5,850评论 3 43
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,602评论 18 399
  • 这篇文章是关于Java static关键字的使用,主要会介绍以下的内容: static 的概念 static的各种...
    byhieg阅读 1,113评论 1 49
  • static 在《Java编程思想》P86页有这样一段话:“static方法就是没有this的方法。在static...
    望月成三人阅读 306评论 0 4
  • 1、菊花茶,取5~8朵干菊花加入沸水泡成菊花茶,凉却后把茶水放在冰箱里冷藏,用的时候再取出用化妆棉充分吸收菊花茶水...
    飞翔的优化人阅读 306评论 1 1