Java 静态变量、静态方法、代码块总结

静态变量

一、概述

  1. 静态变量和静态方法能够通过类名来访问,不需要创建一个类的对象来访问该类的静态成员,所以static修饰的成员又称作类变量和类方法。
  2. 静态变量与成员变量不同,成员变量总是通过对象来访问,因为它们的值在对象之间有所不同。
  3. 当你的某一个变量会经常被外部代码访问的时候,可以考虑设计为静态的。

二、内存分配及初始化

  1. 静态变量属于类,不属于任何独立的对象。因为编译器只为整个类创建了一个静态变量的副本,也就是只分配一个内存空间。
  2. 静态变量在代码运行前就已经存在于内存之中,静态变量存在的意义就是不需要实例化就可以直接用类名调用。
  3. 成员变量则不同,每创建一个对象,都会分配一次内存空间,不同变量的内存相互独立。
  4. 类会在首次被“主动使用”时执行初始化,为静态变量赋予正确的初始值。在Java代码中,一个正确的初始值是通过静态变量初始化语句或者静态代码块给出的。而我们这里所说的主动使用包括:
    ①创建类的实例
    ②调用类的静态方法
    ③使用类的非常量静态字段
    ④调用Java API中的某些反射方法
    ⑤初始化某个类的子类
    ⑥含有main()方法的类启动时
    PS:初始化一个类包括两个步骤:
    1、 如果类存在直接父类的话,且父类还没有被初始化,则先初始化其父类。
    2、 如果类存在一个初始化方法,就执行此方法。
    代码示例:
public class Demo {
    static int i;
    int j;

    public static void main(String[] args) {
        Demo demo1 = new Demo();
        demo1.i = 7;
        demo1.j = 8;
       
        Demo demo2 = new Demo();
       
        System.out.println("demo1.i=" + demo1.i + ", demo1.j=" + demo1.j);
        System.out.println("demo2.i=" + demo2.i + ", demo2.j=" + demo2.j);
    }
}
//demo1.i=7, demo1.j=8
//demo2.i=7, demo2.j=0

可以看到demo2.i=7,这是因为demo1.i和demo2.i指的是同一块内存空间。

静态方法

一、概述及注意事项

  1. static方法是类的方法,不需要创建对象就可以使用。非static方法是对象的方法,只有对象被创建出来以后才可以被使用。
  2. static方法中不能使用this和super关键字。
  3. 不能调用非static方法。
  4. 只能访问所属类的静态变量和静态方法。因为当static方法被调用的时候,这个类的对象可能还没有创建,即使已经被创建了,也无法确认调用那个对象的方法。不能访问非静态方法同理。

二、用途
单例是运用static的一个很好的例子。

public class Singleton {
    private static Singleton singleton;

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }

    private Singleton() {

    }
}

一般工具方法都会设计成静态方法。

三、静态代码块、构造代码块

一、概述

  1. 构造代码块,为所有的构造器做准备工作,构造器调用之前调用。
  2. 静态代码块,对静态成员做准备工作(比如初始化)。 随着类的加载而加载,无论创建多少个对象,只调用一次。很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
    构造代码块:
{
        System.out.println("haha");
}

静态代码块就是前面加了static修饰。

二、构造代码块应用

  1. 初始化实例变量
    如果一个类中存在若干个构造函数,这些构造函数都需要对实例变量进行初始化,如果我们直接在构造函数中实例化,必定会产生很多重复代码,繁琐和可读性差。这里我们可以充分利用构造代码块来实现。这是利用编译器会将构造代码块添加到每个构造函数中的特性。

  2. 初始化实例环境
    一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景。我们可以利用构造代码块来创建此场景,尤其是该场景的创建过程较为复杂。构造代码会在构造函数之前执行。

三、注意

  1. 静态代码块可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
  2. 构造代码块每次创建新对象时都会执行。有多个时依次执行。
  3. 执行顺序:静态代码块 > 构造代码块 > 构造函数。
  4. 构造代码块和静态代码块有自己的作用域,作用域内部的变量不影响作用域外部。
public class Parent {
    static {
        System.out.println("父类静态代码块");
    }

    {
        System.out.println("父类构造代码块");
    }

    public Parent(){
        System.out.println("父类构造函数");
    }
}

class Children extends Parent {
    static {
        System.out.println("子类静态代码块");
    }
    {
        System.out.println("子类构造代码块");
    }
    public Children(){
        System.out.println("子类构造函数");
    }

    public static void main(String[] args) {
        new Children();
    }
}

//结果:
//父类静态代码块
//子类静态代码块
//父类构造代码块
//父类构造函数
//子类构造代码块
//子类构造函数

四、扩展
创建对象的流程
-> 开辟内存
-> 静态变量显式初始化
-> 静态代码块(如果有多个的轻况,按代码的书写顺序执行)
-> 成员变量的显示初始化
-> 代码块
-> 构造函数

四、补充

  1. static final用来修饰成员变量和成员方法,可简单理解为“全局常量”。对于变量,表示一旦给值就不可修改;对于方法,表示不可覆盖。
  2. 对象也能调静态变量和静态方法,但不建议这种写法。
  3. Java中static只能修饰类的成员变量和方法,不能修饰方法内的局部变量。另外不能被继承,因为它仅仅属于某个类,但不是其对象。

写完喽!ㄟ(▔,▔)ㄏㄟ(▔,▔)ㄏㄟ(▔,▔)ㄏ


知识重在总结和梳理,只有不断地去学习并运用,才能化为自己的东西。当你能为别人讲明白的时候,说明自己已经掌握了。

欢迎转载,转载请注明出处!

如果有错误的地方,或者有您的见解,还请不啬赐教!

喜欢的话,麻烦点个赞!
参考:http://www.jianshu.com/p/3eb769986bd3

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

推荐阅读更多精彩内容