`
uule
  • 浏览: 6297613 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

static静态代码块与非静态代码块 + 构造函数

 
阅读更多

先执行块,后执行构造函数

块和声明变量的时候赋值,执行顺序是根据代码的顺序决定的

 

参考:Java中程序执行顺序(注意评论)

 

总结:静态代码块总是最先执行。

          非静态代码块跟非静态方法一样,跟对象有关。只不过非静态代码块在构造函数之前执行。

          父类非静态代码块、构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态代码块和构造函数。

 

================================================================================

相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,

    一般在代码块中对一些static变量进行赋值。

不同点:静态代码块在非静态代码块之前执行

(静态代码块—>非静态代码块—>构造方法)。

    静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。

 

JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

 

Example1:

public class PuTong {
    public PuTong(){
        System.out.print("默认构造方法!-->");
    }
    
    //非静态代码块
    {
        System.out.print("非静态代码块!-->");
    }
    
    //静态代码块
    static{
        System.out.print("静态代码块!-->");
    }
    
    public static void test(){
        {
            System.out.println("普通方法中的代码块!");
        }
    }
}

//测试类
public class TestClass {
    
    /**
     * 区别两次new静态与非静态代码块执行情况
     */
    public static void main(String[] args) {
        PuTong c1 = new PuTong();
        c1.test();
        
        PuTong c2 = new PuTong();
        c2.test();
    }
}

/*
运行输出结果是:
静态代码块!-->非静态代码块!-->默认构造方法!-->普通方法中的代码块!
非静态代码块!-->默认构造方法!-->普通方法中的代码块!
*/

 

Example2:

 

package tags;

public class Child extends Father{
	
	static {
		System.out.println("child-->static");
	}
	
	private int n = 20;
	
	{
		System.out.println("Child Non-Static");
		n = 30;
	}
	
	public int x = 200;
	
	public Child() {
		this("The other constructor");
		System.out.println("child constructor body: " + n);
	}
	
	public Child(String s) {
		System.out.println(s);
	}
	
	public void age() {
		System.out.println("age=" + n);
	}
	
	public void printX() {
		System.out.println("x=" + x);
	}
	
	public static void main(String[] args) {
		new Child().printX();
	}
}

class Father {
	
	static {
		//System.out.println("n+"+n);
			//当n定义在下面时,会提示Cannot reference a field before it is defined,
			//所以必须把n定义移到上面才可以输出
		System.out.println("super-->static");
	}
	
	public static int n = 10;
	public int x = 100;
	
	public Father() {
		System.out.println("super's x=" + x);
		age();
	}
	
	{
		System.out.println("Father Non-Static");
	}
	
	public void age(){
		System.out.println("nothing");
	}
}

实例参考:http://yanxuxin.iteye.com/blog/578060

 

有两个要点:

1、父类、子类非静态代码块何时初始化?

2、父类调用重写方法时,到底执行的是哪个方法?

 

 

 结果:

 

super-->static

child-->static

Father Non-Static

super's x=100

age=0

Child Non-Static

The other constructor

child constructor body: 30

x=200

 

 

父类静态代码块 -> 子类静态代码块

-> 父类非静态代码块 -> 父类构造函数

-> 子类非静态代码块 -> 子类构造函数

 

 

 

java中,在使用new操作符创建一个类的实例对象的时候,开始分配空间并将成员变量初始化为默认的数值,注意这里并不是指将变量初始化为在变量定义处的初始值,而是给整形赋值0,给字符串赋值null 这一点于C++不同,(student.name = null , student.age = 0 )

 

然后在进入类的构造函数。

在构造函数里面,首先要检查是否有this或者super调用,this调用是完成本类本身的构造函数之间的调用,super调用是完成对父类的调用。二者只能出现一个,并且只能作为构造函数的第一句出现。在调用this和super的时候实现程序的跳转,转而执行被调用的this构造函数或者super构造函数。

在this和super执行完毕,程序转而执行在类定义的时候进行的变量初始化工作。

这个执行完毕,才是构造函数中剩下的代码的执行。

 

 

分享到:
评论

相关推荐

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    C++编程思想习题

    目 录 译者序 前言 第1章 对象的演化 1.1基本概念 1.1.1对象:特性十行为 1.1.2继承:类型关系 1.1.3多态性 1.1.4操作概念:OOP程序像什么 1.2为什么C++会成功 1.2.1较好的C ...附录C 模拟虚构造函数

    Java中this与super的区别

    要注意的是this只能在类中的非静态方法中使用, 静态方法和静态的代码块中绝对不能出现this。this也可作为构造函数来使用。在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针, 而...

    C++ Primer第四版【中文高清扫描版】.pdf

    17.1.6 函数测试块与构造函数 586 17.1.7 异常类层次 587 17.1.8 自动资源释放 589 17.1.9 auto_ptr类 591 17.1.10 异常说明 595 17.1.11 函数指针的异常说明 598 17.2 命名空间 599 17.2.1 命名空间的定义 599 ...

    新手学习C++入门资料

    下面给出使用了无名参数的C++函数代码: int fun(int x,int) //注意不同点 { return x*2; } (二) 函数的默认参数 C++函数的原型中可以声明一个或多个带有默认值的参数。如果调用函数时,省略了相应的实际参数...

    C++ Primer中文版(第5版)李普曼 等著 pdf 1/3

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典... 18.1.3 函数try语句块与构造函数 689  18.1.4 noexcept异常说明 690  18.1.5 异常类层次 693  18.2 命名空间 695  18.2.1 命名空间定义...

    C++Primer(第5版 )中文版(美)李普曼等著.part2.rar

    C++ Primer中文版(第5版)[203M]分3个压缩包 本书是久负盛名的C++经典... 18.1.3 函数try语句块与构造函数 689  18.1.4 noexcept异常说明 690  18.1.5 异常类层次 693  18.2 命名空间 695  18.2.1 命名空间定义...

    【05-面向对象(下)】

    如果代码块只有包含一条语句,Lambda表达式允许省略代码块的花括号,如果省略了代码块的花括 号,这条语句不要用花括号表示语句结束。Lambda代码块只有一条return语句,甚至可以省略return关键字。 Lambda表达式...

    javaSE代码实例

    15.3.3 静态/非静态内部类的区别 333 15.4 匿名内部类 334 15.4.1 基于继承的匿名内部类 334 15.4.2 基于接口实现的匿名内部类 335 15.4.3 匿名内部类的初始化 337 15.4.4 匿名内部类作用的体现 337 ...

    net学习笔记及其他代码应用

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)...

    传智播客扫地僧视频讲义源码

    11_copy构造函数调用时机4_函数返回值是匿名对象的去和留的剖析_传智扫地僧 12_构造和析构的重点整理 13_构造和析构总结 14_中午课程复习 15_构造函数的调用规则研究 16_浅拷贝问题抛出 17_浅拷贝问题分析_传智扫地...

    java实现源码转补码-Java-Cheatsheet:Java笔记备忘单,侧重于基础知识和有用的面试技巧

    在方法、构造函数或块中声明 在类中声明,但在方法/块之外 与实例相同,但使用static关键字 进入区块时创建,退出区块时销毁 在创建对象时创建 ( new )。 当为堆上的块分配空间时,将为每个实例变量创建一个槽。 ...

    Java开发技术大全(500个源代码).

    staticBlock.java 演示静态块的使用 staticVar.java 定义静态变量 supplyTest.java 对象作为静态成员使用示例 trySwap.java 试图交换两个形参的值 useOnlyTest.java 创建多个对象,演示this的作用 ...

    在一小时内学会 C#(txt版本)

    正如其名字说的,一旦它们已经进行了写操作、直接初始化或在构造函数中对其进行了赋值,readonly 数据成员就只能对其进行读取。readonly 和 const 数据成员不同之处在于 const 要求你在声明时进行直接初始化。看下面...

    语言程序设计课后习题答案

    通过类的继承与多态可以很方便地实现代码重用,大大缩短了软件开发周期,并使得软件风格统一。因此,面向对象的编程语言使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维...

    java编程基础,应用与实例

    5.11 构造函数 79 5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固练习 85 第6章 数组 86 6.1 基本数据类型数组 86 6.2 一维数组的初始化 88 6.3 对象数组 88 6.4 二维数组 ...

    java经典面试2010集锦100题(不看你后悔)

    System.out.println("我是构造函数"); count++; number++; } } class test { public static void main(String[] args) { A t1= new A(); A t2 = new A(); A t3 = new A(); System.out.println(t3....

    LuaBind 源码 (Lua增强库)

    你可以给构造函数设定一个名字,例如: module(L, "my_library") [ // declarations ]; 这里所有的申明都将被放置在 my_libary 表. 如果你想要嵌套名空间,你可以用 luabind::namespace_ 类. 它和 luabind::module ...

    java 面试题 总结

    不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)...

    c# 加密和解密相关代码

    向散列函数得到一个固定长度的散列值,数据块的签名就是计算数据块的散 列值,MD5 算法的散列值为128 位。本实例演示如何使用MD5 算法对用户 输入的密码进行加密,实例运行效果如图19.2 所示。 关 键技术 本实例在...

Global site tag (gtag.js) - Google Analytics