Java 静态块 Android 中的使用实例

静态块也被称为静态初始化块。静态初始化块是以 static 关键字开头并用大括号括起来的正常的代码块 。下面是一个例子:

static {
    // whatever code is needed for initialization goes here
}

静态块在 Java 中的使用实例:

public class StaticExample{
    static {
        System.out.println("This is first static block");
    }

    public StaticExample(){
        System.out.println("This is constructor");
    }

    public static String staticString = "Static Variable";

    static {
        System.out.println("This is second static block and "
                                                + staticString);
    }

    public static void main(String[] args){
        StaticExample statEx = new StaticExample();
        StaticExample.staticMethod2();
    }

    static {
        staticMethod();
        System.out.println("This is third static block");
    }

    public static void staticMethod() {
        System.out.println("This is static method");
    }

    public static void staticMethod2() {
        System.out.println("This is static method2");
    }
}

以上代码的输出结果:

This is first static block
This is second static block and Static Variable
This is static method
This is third static block
This is constructor
This is static method2

如果代码块前面不加 “static” 关键字,那么这个块被称为“构造块”,并且在类每次被实例化时都将被执行。构造函数块将被复制到类的每个构造函数中。例如,我们有四个参数化的构造函数,那么四个构造块的副本将被放置在构造函数中,每个构造函数一个。让我们执行下面的例子,看看输出:

public class ConstructorBlockExample{

    {
        System.out.println("This is first constructor block");
    }

    public ConstructorBlockExample(){
        System.out.println("This is no parameter constructor");
    }

    public ConstructorBlockExample(String param1){
        System.out.println("This is single parameter constructor");
    }

    public ConstructorBlockExample(String param1, String param2){
        System.out.println("This is two parameters constructor");
    }

    {
        System.out.println("This is second constructor block");
    }

    public static void main(String[] args){
        ConstructorBlockExample constrBlockEx = 
                     new ConstructorBlockExample();
        ConstructorBlockExample constrBlockEx1 = 
                     new ConstructorBlockExample("param1");
        ConstructorBlockExample constrBlockEx2 = 
                     new ConstructorBlockExample("param1", "param2");
    }
}

上面的代码的输出结果:

This is first constructor block
This is second constructor block
This is no parameter constructor
This is first constructor block
This is second constructor block
This is single parameter constructor
This is first constructor block
This is second constructor block
This is two parameters constructor

我们应该用私有静态方法去初始化公有的静态变量:

class Whatever {
    private varType myVar = initializeInstanceVariable();
        
    protected final varType initializeInstanceVariable() {

        // initialization code goes here
    }
}

私有静态方法的优点是,如果需要重新初始化公有的静态变量,可以更加灵活地重用私有静态方法。因此,与相应的静态初始化块相比,我们可以通过私有静态方法获得更大的灵活性。我们不是说公有的静态方法不能做到这一点。 只是,我们正在谈论一种初始化类变量的方法,几乎没有任何理由使这种初始化的方法“公开”。

那么静态块的优点是什么?
  • 如果我们正在加载驱动程序和其他项目到命名空间。例如,Class类有一个静态块,它注册了本机。
  • 如果我们需要执行计算来初始化您的静态变量,那么您可以声明一个静态块,该类在第一次加载时才会被执行一次。
  • 与安全相关的问题或与日志记录相关
当然静态块也有局限性
  • JVM 的一个限制是静态初始化块不应该超过 64K
  • 不能抛出检查异常
  • 不能使用 this 关键字,因为还没有其实例
  • 不应该尝试访问 super,因为对静态块来说没有这样 super
  • 不应该从这个块返回任何东西
  • 静态块可能会使测试成为一场噩梦
最后如何处理静态块中的异常?

在方法中,可以通过异常处理或处理异常来处理异常。但是在静态块代码中,你不能以这种方式处理异常。

通常一个干净利落的方式来处理它是使用 try-catch 块,但在静态块代码中,因为我们没有这个选项,因此让我们看看可用的三个选项:

首先在记录异常之后抛出一个 RuntimeException,它将结束当前线程(除非被代码初次实例化或者在类上第一次调用静态方法)。

其次是调用 System.exit(1),但是这在像 servlet 这样的托管环境中是不可取的。此选项仅适用于 Java 应用程序,并且只有在静态初始化块执行一些关键操作(没有这些关键操作,程序无法成功运行)的情况下,才能加载数据库驱动程序。

最后一个选项是设置一个标志指示失败。稍后,构造函数可以检查标志并在需要的情况下抛出异常或重试。

最后,如果操作对程序的功能不重要,那么可能只需要一个简单的日志。

静态块 在 Android 中的使用实例

代码如下:

package com.toby.test_application;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends Activity {

    private static final String TAG = "Test_MainActivity";

    private static IntentFilter s_intentFilter;
    private static List<String> s_stringList;

    static {
        s_intentFilter = new IntentFilter();
        s_intentFilter.addAction(Intent.ACTION_TIME_TICK);
        s_intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
        s_intentFilter.addAction(Intent.ACTION_TIME_CHANGED);

        s_stringList = new ArrayList<>();
        s_stringList.add("one");
        s_stringList.add("two");
        s_stringList.add("three");
        s_stringList.add("four");
    }

    private final BroadcastReceiver m_testReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();

            if (action.equals(Intent.ACTION_TIME_CHANGED) ||
                    action.equals(Intent.ACTION_TIMEZONE_CHANGED))
            {
                // TODO: 17-11-14 something
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        registerReceiver(m_testReceiver, s_intentFilter);

        Log.d(TAG, "s_intentFilter hasAction ACTION_TIME_TICK: "
                + s_intentFilter.hasAction(Intent.ACTION_TIME_TICK));
        Log.d(TAG, "s_intentFilter hasAction ACTION_TIMEZONE_CHANGED: "
                + s_intentFilter.hasAction(Intent.ACTION_TIMEZONE_CHANGED));
        Log.d(TAG, "s_intentFilter hasAction ACTION_TIME_CHANGED: "
                + s_intentFilter.hasAction(Intent.ACTION_TIME_CHANGED));

        Log.d(TAG, s_stringList.toString());
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(m_testReceiver);
    }
}

上面的代码的输出结果:

输出结果

本文参考链接:
http://java2novice.com/java-fundamentals/static/block/
http://jusfortechies.com/java/core-java/static-blocks.php
https://stackoverflow.com/questions/5481386/date-and-time-change-listener-in-android

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

推荐阅读更多精彩内容

  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,629评论 0 11
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 7,066评论 0 62
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,577评论 18 399
  • 这是一则关于西藏的臆想。 藏族。青稞。雪山。仓央嘉措。朝圣。 西藏,是很多人的梦想。 如果你相信星座的话,那我告诉...
    呓籽阅读 205评论 0 1
  • 你所见到的,只不过是自己的想象;你以为是自己的,只不过是种偶然。——梁文道 《我执》 我知道我们有种倾向,总是想神...
    重复和回忆阅读 255评论 0 0