Static块详解
首先,我们先看一段程序,代码如下:
public class Father
{
public Father() //构造方法
{
System.out.println(" 父类构造方法");
}
static //静态块
{
System.out.println(" 父类静态块");
}
//非静态块
{
System.out.println(" 父类非静态块");
}
public static void main(String[] args)
{
System.out.println(" main方法开始");
Father father = new Father();
}
}
运行结果如下所示:

从运行结果可以看出,程序首先执行静态块的内容,然后才开始main()方法,其次执行非静态块,最后加载构造方法。
如果这个类有个子类Son.java继承Father.java,那么运行结果又该如何呢?
public class Son extends Father
{
public Son() //子类构造方法
{
System.out.println(" 子类构造方法");
}
static //子类静态块
{
System.out.println(" 子类静态块");
}
{ //子类非静态块
System.out.println(" 子类非静态块");
} public static void main(String[] args)
{
System.out.println(" main方法开始");
Son son = new Son();
}
}
运行结果如下所示:

从这两个程序的运行结果,我们可以看出,
1、上述程序并非首先从main()方法开始执行的,而是首先加载执行静态块,然后找到main方法的入口,执行main方法,紧接着执行非静态块,最后执行构造方法。
2、如果有子类,那么首先执行父类的方法后,然后才执行子类的方法。
这到底是为什么呢?
我们先分析静态块和非静态块的区别:
Java中静态块和非静态块中的区别是生命周期不一样。
静态代码块,在虚拟机加载类的时候就会加载执行,先于主方法的执行,并只执行一次;
非静态代码块,在创建对象的时候(即new一个对象的时候)执行,每次创建对象都会执行一次,非静态块是在每次实例化类的对象时执行的,而且执行在构造方法之前。
顺便说一下,静态方法与静态块的区别:
(1)一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:
static
{
//静态块内容
}
(2)静态变量是整个类的变量,不能再任何方法体内声明静态变量,例如:
function()
{
static int x = 0; //错误
}
(3)在静态方法里只能调用类中的其它静态成员,而不能直接访问类中的非静态成员。因为对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
那么下面的程序的运行结果是什么呢?如下所示:
class Test{
public static int X=300;
static
{
System.out.println("1、X的结果: " +X);
X=200;
System.out.println("2、X的结果: " +X);
}
{
System.out.println("3、非静态块X的结果: "+X);
}
}
public class StaticBlockTest{
public static void main(String args[]){
System.out.println("主方法执行,X的值为:"+Test.X);
}
}
自己运行一下,想一下为什么?!
出处:http://www.cnblogs.com/bester/p/3297655.html
Static块详解的更多相关文章
- java 关键字final static native详解
java 关键字native static final详解 一.final 根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义, ...
- 李洪强iOS经典面试题155 - const,static,extern详解(面试必备)
李洪强iOS经典面试题155 - const,static,extern详解(面试必备) 一.const与宏的区别(面试题): const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽 ...
- static{ }语句块详解
static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法.举ge例子: public class Test { public static i ...
- 转 java中static{}语句块详解
原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430 感谢原作者! static{}(即static块),会在类被加载的时候执 ...
- java中static{}语句块详解
static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一般用来初始化静态变量和调用静态方法,下面我们详细的讨论一下该语句块的特性及应用. 一.在程序的一次执行过程中,stati ...
- Java static{}语句块详解
[转自] http://blog.csdn.net/lubiaopan/article/details/4802430 static{}(即static块),会在类被加载的时候执行且仅会被执行一次,一 ...
- java中static作用详解
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...
- static用法详解
一. 面向过程程序设计 1.静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变量的例子,如下: //Example 1 #include & ...
- java中的static关键字详解
static对于我们这些初学者在编写代码和阅读代码是一个难以理解的关键字,也是大量公司面试题最喜欢考的之一.下面我就来就先讲述一下static关键字的用法和我们初学者容易误解的地方. static关键 ...
随机推荐
- dubbo-admin管理平台搭建
参考:http://blog.csdn.net/u013142781/article/details/50396621 一.前言 dubbo的使用,其实只需要有注册中心,消费者,提供者这三个就可以使用 ...
- Intellij Idea 创建EJB项目入门(一)
相关软件: 1.JBoss(jboss-as-7.1.1.Final):http://jbossas.jboss.org/downloads 2.Intellij IDEA 13.02 3.JDK 1 ...
- 24个有用的PHP类库分享
目前,PHP是用于Web开发的最流行的脚本语言.你可以在互联网上随手找到关于PHP大量资料,包括文档.教程.工具等等.PHP不仅是一种功能丰富的语言,它还能帮助开发人员轻松地创建更好的网络环境.为了进 ...
- Windows Tomcat 安装
JDK的安装可以参考 http://www.cnblogs.com/emanlee/p/3702535.html ,然后安装apache-tomcat step1:http://tomcat.apac ...
- [Codeforces137A]Postcards and photos(模拟)
题目链接:http://codeforces.com/contest/137/problem/A 题意:一个人搬东西,每次只能搬相同的东西,最多只能搬相同的东西不超过5个.问最少搬多少次. 模拟就行了 ...
- Web内容管理系统 Magnolia 启程-挖掘优良的架构(3)
Author and Public instances 第一个关键观念:instance-实例.每一个项目都必须至少有一个Author实例和至少一个Public实例.下面将告诉你为什么: 基本概念:J ...
- linux/unix网络编程之 poll
转自http://www.cnblogs.com/zhuwbox/p/4222382.html poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述 ...
- RTP封装h264
网络抽象层单元类型 (NALU): NALU头由一个字节组成,它的语法如下: +---------------+ |0|1|2|3|4|5|6|7| +-+-+-+-+-+-+-+ ...
- 分享一段H264视频和AAC音频的RTP封包代码
1. H264视频的RTP封包 static int h264_parse(Track *tr, uint8_t *data, size_t len) { h264_priv *priv = tr-& ...
- MySQL基础之第8章 视图
8.1.视图简介 视图由数据库中的一个表,视图或多个表,视图导出的虚拟表.其作用是方便用户对数据的操作. 8.2.创建视图必须要有CREATE VIEW 和 SELECT 权限SELECT selec ...