Java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下: 
static { 
静态语句代码块 
}


非静态语句代码块 

异同点 
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋值。 
不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造函数)。 
静态代码块只在第一次new(或者只要访问了就)执行一次,之后不在执行,而非静态代码块在每new一次都会执行一次,跟构造函数一样。非静态代码块可以在普通方法中定义(个人感觉作用不大);而静态代码块不行。

Java代码

public class TestStatic {
    static {
        System.out.println("基类 Static 静态语句块");
    }

    public TestStatic() {
        System.out.println("基类  默认无参构造器");
    }

    {
        System.out.println("基类 非静态语句块");
    }

    public static void Iint() {
        System.out.println("基类 Static Iint");
    }
}
public class User extends TestStatic {

    private static final long serialVersionUID = 1L;
    public final double i = Math.random();// 每次得到的结果不一样
    private final static int finalID;
    private static int finalID2;
    private int finalID3;

    static  {
         System.out.println("派生类 Static 静态语句块");
        finalID=1000;
    }

    {
        System.out.println("派生类  非静态语句块");
        finalID2+=1;
        finalID3+=1;
    }

    /** full constructor */
    public User() {
        System.out.println("派生类  默认无参构造器");  

    }
    public static void IintTest() {
        System.out.println("派生类 Static Iint");
    }
}

测试语句1 

public static void main(String[] args) {  
        TestStatic.Iint();//User.Iint();
    }  
}

输出结果如下:

基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint

测试说明了静态代码块不管怎么样都会被执行,调用基类的静态方法,派生类的静态语句块也都执行了,调用这个User.Iint(); 也是一样的结果 。

测试语句2 

public static void main(String[] args) {  
        TestStatic.Iint();//User.Iint();
         User.IintTest();
    }  
}

输出结果如下:

基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iint

测试说明了 静态语句块执行一次,只是调用了派生类的静态方法被执行了

测试语句3

public static void main(String[] args) {

TestStatic.Iint();//User.Iint();
User.IintTest();
System.out.println(User.finalID);
TestStatic user = new User();

}  
}

执行结果如下:

基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iint
1000
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器

测试说明了 非静态代码块在每new一次都会执行一次,跟构造函数一样的次数

测试语句4

public static void main(String[] args) {

TestStatic.Iint();//User.Iint();
User.IintTest();
System.out.println(User.finalID);
TestStatic user = new User();

System.out.println();
System.out.println("第二次初始化派生类");
User user2 = new User();

System.out.println();
System.out.println("第三次次初始化基类");
TestStatic user3 = new TestStatic ();

}

执行结果如下:

基类 Static 静态语句块
派生类 Static 静态语句块
基类 Static Iint
派生类 Static Iint
1000
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器

第二次初始化派生类
基类 非静态语句块
基类 默认无参构造器
派生类 非静态语句块
派生类 默认无参构造器

第三次次初始化基类
基类 非静态语句块
基类 默认无参构造器

测试说明了静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造函数)。 
静态代码块只在第一次new(或者只要访问了就)执行一次,之后不在执行,而非静态代码块在每new一次都会执行一次,跟构造函数一样.

小结: 
1、静态代码块是在类加载时自动执行的,非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块。 顺序: 静态代码块--》非静态代码块--》类构造函数。 
2、在静态方法里面只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。因为对于非静态的方法和变量,需要先创建类的实例对象后方可使用,而静态方法在使用前不用创建任何对象。 
3、如果某些代码必须要在项目启动时候就执行的时候,我们可以采用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,

在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,此时代码是被动执行的。 
区别:静态代码块是自动执行的; 
静态方法是被调用的时候才执行的; 
作用:静态代码块可以用来初始化一些项目最常用的变量和对象;静态方法可以用作不创建对象也可以能需要执行的代码。

Java基础 静态块、非静态块、构造函数的执行顺序的更多相关文章

  1. 【Java基础】构造方法 static 块 {}块 执行顺序

    package com.test.innerclass; public class HelloB extends HelloA { public HelloB() { System.out.print ...

  2. C# 父子类_实例_静态成员变量_构造函数的执行顺序

    今天去面试的时候被一道题问得一点脾气都没有,今天特地来研究下. 子类成员变量,子类静态成员变量,子类构造函数,父类成员变量,父类静态成员变量,父类构造函数的执行顺序. 现在贴上从另外一个.net程序员 ...

  3. java子类和父类中静态块、非静态块、构造函数的执行顺序

    public class qqqq extends Parent{ public static void main(String[] args) { new Child(); } } class Pa ...

  4. Java中继承时静态块,构造块,构造函数的执行顺序

    public class Father { static { System.out.println("Father静态块"); } { System.out.println(&qu ...

  5. 三、Java基础---------关于继承、构造函数、静态代码块执行顺序示例讲解

    在上节博客中曾提到过类的继承,这篇文章主要是介绍类的继承.构造函数以及静态代码块的执行顺序. 首先接着分析在黑马基础测试中的一个关于继承的题目,题目描述如下: 声明类Person,包含2个成员变量:n ...

  6. Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

    Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...

  7. Java问题解读系列之基础相关---含继承时的执行顺序

    今天来研究一下含继承.静态成员.非静态成员时Java程序的执行顺序: 一.不含继承,含有静态变量.静态代码块 创建一个子类,该类包含静态变量.静态代码块.静态方法.构造方法 /** * @create ...

  8. Java组合与继承生成的类中构造函数的执行顺序

    [程序实例] import java.util.*; class Meal{ Meal() { System.out.println("Meal Constructor"); } ...

  9. Java学习笔记__异常机制_try_catch_finally_return执行顺序

    package cn.xiaocangtian.Exception; import java.io.FileInputStream; import java.io.FileNotFoundExcept ...

随机推荐

  1. make:cc 命令未找到的解决方法

    安装redis时遇到的问题 make:cc 命令未找到的解决方法 没安装gcc,然后安装 yum install gcc yum install gcc-c++

  2. spring security LDAP获取用户信息

    很多企业内部使用LDAP保存用户信息,这章我们来看一下如何从LDAP中获取Spring Security所需的用户信息. 首先在pom.xml中添加ldap所需的依赖. <dependency& ...

  3. javascript保留关键字

    1.通用保留关键字 break delete function return typeof case do if switch var catch else in this void continue ...

  4. Exception在方法继承中的限制

    问题: 父类或接口中定义了方法应该抛出的异常,那么当子类重写方法时应该怎样定义将要抛出的异常: 首先定义异常和父类: class Exception1 extends Exception {} cla ...

  5. 利用box-flex实现 dom元素位置页面底部

    问题: 总是有这样的需求,就是页面上某部分要位于页面的最底部,此“最底部”要求:(1)当页面上内容不足一屏的时候,在最底部显示(2)当页面上内容不止一屏的时候,也就是有垂直滚动条的时候,要在内容的最后 ...

  6. the major advances since the birth of the computer

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION • The family concept: ...

  7. 在winform中添加普通右键菜单

    显示水平滚动条:点击GridControl的Run Designer在弹出的对话框中选择Views,将右侧属性窗口中OptionsView下的ColumnAutoWidth设置成false: 可以选择 ...

  8. UIAlertController 的使用

    IAlertController 同时替代了 UIAlertView 和 UIActionSheet,从系统层级上统一了 alert 的概念 —— 即以 modal 方式或 popover 方式展示. ...

  9. git pull时出现unable to unlink old 一个不该犯下的错误

    在日常开发中,当团队内有人将新的代码打成jar文件提交,并且未改名的时候,可能会出现这样的错误"error: unable to unlink old 'Test/lib/xxx-1.0.0 ...

  10. SharedPreferences第一次使用后HashMap将常驻内存

    今天使用SharedPreferences的时候突然想到了这个问题,因为我们要存储应用级别的上下文信息,包括用户信息等一系列信息:这个时候使用getSharedPreferences是否合适呢! 其实 ...