java静态代码块、普通代码
参考文章:http://www.cnblogs.com/qinpengming/p/5227227.html
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、如果某些代码必须要在项目启动时候就执行的时候,我们可以采用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,
在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,此时代码是被动执行的。
区别:静态代码块是自动执行的;
静态方法是被调用的时候才执行的;
作用:静态代码块可以用来初始化一些项目最常用的变量和对象;静态方法可以用作不创建对象也可以能需要执行的代码。
1.普通变量的初始化
普通变量在类中的任何方法(包括构造函数)之前初始化(规则一)。
2.静态变量的初始化
使用static命名的变量或者使用static{}包括起来的区域,都在类被加载时进行初始化(规则二)
3.总结
1.所有初始化都在构造器被调用之前发生
2.静态初始化只有在必要时才会进行(如第一次创建类对象,第一次访问类的静态数据等)
3.初始化顺序一般是先静态,后非静态
java静态代码块、普通代码的更多相关文章
- java学习(一)静态代码块 构造代码块 构造方法的执行顺序及注意问题
今天我总结了一下java中静态代码块 构造代码块 构造方法的执行顺序及其注意问题 首先要知道静态代码块是随着类的加载而加载,而构造代码块和构造方法都是随着对象的创建而加载 当时做了这么一个小案例(想必 ...
- Java面试题 静态代码块 构造代码块 构造方法 的执行顺序
JAVA中的静态代码块 构造代码块 构造方法执行顺序: 静态代码块(类加载时执行)>>构造代码块>>构造方法 下面展示一个简单的例子,推荐大家动手运行一遍: public cl ...
- Java类中代码的执行顺序 静态代码块>构造代码块>构造方法
一:静态代码块 注意是代码块,不是静态函数.函数要调用才执行,代码块加载就执行,一般是静态变量的声明与初始化.被static修饰的代码块(赋值.输出操作等).类中静态语句块仅在类加载时被执行一次 如 ...
- Java中静态代码块,代码块,构造方法优先级、区别及代码示例
在项目中遇到了代码块的知识点,跑了下测试,写下结论 代码优先级:静态代码块 -> 构造代码块 -> 构造方法 多个代码块优先级,按照“先定义的代码先执行,后定义的代码后执行”原则执行 静态 ...
- Java基础6:代码块与代码加载顺序
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...
- 08-02 Java 代码块,代码块执行的先后顺序问题
代码块 /* 代码块:在Java中,使用{}括起来的代码被称为代码块. 根据其位置和声明的不同,可以分为 局部代码块:局部位置,用于限定变量的生命周期. 构造代码块:在类中的成员位置,用{}括起来的代 ...
- java静态初始化块的执行顺序
先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...
- static代码块与{}代码块的比较
第一个例子: public class StaticDemo { { System.out.println("{} 代码块"); } static{ System.out.prin ...
- Java中普通代码块,构造代码块,静态代码块的代码演示样例及区分
//运行顺序:(优先级从高到低.)静态代码块>mian方法>构造代码块>构造方法. 当中静态代码块仅仅运行一次.构造代码块在每次创建对象是都会运行. 1 普通代码块 <span ...
- java面试基础题------》Java 中的父子类静态代码块,代码块,构造方法执行顺序
4.指出下面程序的运行结果. class A { static { System.out.print("1"); } public A() { System.out.print(& ...
随机推荐
- dev NavBarControl控件
一.新建一个导航栏 拖入一个panel到窗口上做为导航栏的容器,然后再拖入一个NavBarControl到其上,点击NavBarControl控件的右上角三角箭头展开任务列表,选择PaintStyle ...
- DevExpress中RibbonControl的简单应用
现在介绍一下DevExpress中的RibbonControl的简单应用,搭建一个拥有Office2010风格的窗体程序. 第一步:打开VS2015,新建一个windows窗体应用程序: 第二步:把需 ...
- PAT 1050 螺旋矩阵(25)(代码)
1050 螺旋矩阵(25)(25 分) 本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方 ...
- VirtualBox安装android-x86-4.4-r2
https://jingyan.baidu.com/album/a681b0de1373133b184346cf.html?picindex=10
- Luogu 2575 高手过招-SG函数
Solution SG函数跑一遍就过了ouo Code #include<cstring> #include<cstdio> #include<algorithm> ...
- How to ignore files and directories in subversion?
Step 1 Copy the files and directories to other place. Step 2 Delete the files and directories. Step ...
- 我的MVP呢?
Ladies and gentelmen, welcome the MVP of NBA 16-2017 Season:... 呃,等下,好像哪里不对.那是因为,我要说的MVP根本就不是Most Va ...
- 把dataset对象转换成list集合方法
public static List<T> GetList<T>(DataTable table) where T:new() { List<T> list = n ...
- python 函数调用顺序
def foo(): print ('in the foo') bar() def bar(): print ('in the bar') foo() 1.foo函数进入内存 2.bar函数进入内存 ...
- boost的accumulator rolling_mean的使用
Boost.Accumulators is both a library for incremental statistical computation as well as an extensibl ...