java_初始化器
1. 执行的顺序
package java20180129_1;
public class Demo {
// instance variable initializer 实例变量初始化器
String s = "abc";
// constructor 构造器
public Demo() {
System.out.println("constructor called");
}
// static initializer 静态初始化器
static {
System.out.println("static initializer called");
}
// instance initializer 实例初始化器
{
System.out.println("instance initializer called");
}
public static void main(String[] args) {
new Demo();
new Demo();
}
}
输出
static initializer called
instance initializer called
constructor called
instance initializer called
constructor called
2. Java的实例初始化器是如何工作的?
上面的例子中的实例初始化器包含一段打印字符的代码。要理解它是如何工作的,我们可以把它想象成变量赋值的过程,这样就不难理解了。
除了这么赋值:
int b = 0;
还可以这么写:
int b;
b = 0;
因此,实例初始化器和实例变量初始化器就大同小异了。
3. 什么时候会用到实例初始化器?
能用到实力初始化器的时候比较少。但有些时候还是一个实例变量初始化器的替代选择,比如:
初始化代码必须处理异常情况
执行一个实例变量没办法进行的计算
当然,这些需求还是可以在构造函数中实现的。但是一个类有多个构造函数的话,你就得在每个构造函数里面重复同样的代码了。
写在实例初始化器中的代码,无论你使用哪一个构造函数,实例初始化器中代码都会被执行(可能说的多,用的少吧)。
另一个实例初始化器的应用场景是匿名内部类,因为这种情况下根本就不能创建构造函数。(这可能是放置日志代码的好地方?)
=======================================
1、静态初始化器是由static修饰的一对花括号“{}”括起来的语句组。它的作用和构造方法有些相似,都是用来完成初始化工作的,但是静态初始化器与构造方法有以下几点根本不同。
a、构造方法是对每一个新创建的对象初始化,而静态方法是对类自身进行初始化。
b、构造方法是在new运算符创建新对象的时候由系统执行,而静态初始化器一般不能由程序调用,它是在所属类被加载入内存时由系统调用执行的。
c、用new运算符创建多少个新的对象,构造方法就被调用那个多少次,但是静态初始化器则是在被类加载入内存时只执行一次,与创建多少个对象无关。
2、如果有多个静态初始化器,则它们在类的初始化时会依次执行。
3、类是在第一次被使用的时候才被装载,而不是在程序启动时就装载程序中的所有可能用到的类。
4、静态初始化器的作用是对整个类完成初始化操作,包括给static成员变量赋初值,它在系统向内存加载时自动完成。
package java20180129_1;
public class Demo extends HelloA {
/**
* 构造方法
*/
public Demo() {
}
/**
* 实例初始化器
*/
{
System.out.println("I'm B class");
}
/**
* 静态初始化器
*/
static {
System.out.println("Static B");
}
public static void main(String[] args) {
new Demo();
}
}
class HelloA {
/**
*
* 构造方法,可以用来初始化该类的实例属性,也可以初始化类对象
*
*/
public HelloA() {
}
/**
*
* 初始化块,只能用于初始化该类的属性
*
*/
{
System.out.println("I'm A class");
}
/**
*
* 静态初始化器,对整个类就完成初始化操作,包括给成员变量赋值
*
*/
static {
System.out.println("Static A");
}
}
java_初始化器的更多相关文章
- C#_基础,初始化器
对象初始化器 在没有对象初始化器之前,我们创建一个对象大概需要经过这么两个步骤,首先new一个对象,然后给每个字段赋值.而有了对象初始化器之后,原本需要几行代码才能完成的任务变成一行代码就可以完成,简 ...
- .NET中那些所谓的新语法之一:自动属性、隐式类型、命名参数与自动初始化器
开篇:在日常的.NET开发学习中,我们往往会接触到一些较新的语法,它们相对以前的老语法相比,做了很多的改进,简化了很多繁杂的代码格式,也大大减少了我们这些菜鸟码农的代码量.但是,在开心欢乐之余,我们也 ...
- [C#6] 7-索引初始化器
0. 目录 C#6 新增特性目录 1. 老版本的代码 private static void Main() { var dictionary = new Dictionary<int, stri ...
- 6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器
1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明 ...
- swift_初始化器的使用
//: Playground - noun: a place where people can play import Cocoa ***************************结构体与Cla ...
- Linq专题之集合初始化器
集合初始化器用来初始化一个集合,和对象初始化器有点类似,都是用一对{}来初始化. using System; using System.Collections.Generic; using Syste ...
- Linq专题之对象初始化器
在C#3.0之前,如果创建一个新的对象,往往需要调用类的构造函数来初始化该对象的值,在c#3.0提供了一个"对象初始化器"的机制,使得开发人员在创建新的对象时不通过调用类的构造函数 ...
- C# lambda表达式及初始化器
using System;using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1d { c ...
- [C#详解] (1) 自动属性、初始化器、扩展方法
文章来源:Slark.NET-博客园 http://www.cnblogs.com/slark/p/CSharp-focus-1.html 代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属 ...
随机推荐
- 查找IDEA 项目中的依赖包存放在.m2位置
原因:在maven项目pom.xml中添加依赖,可能由于网络不好,下载不完全,导致再次下载一直报错. 就会导致出现依赖一直报错.
- 【Core】.NET Core 部署( Docker + CentOS)
CentOS 下 Docker安装 使用脚本安装 Docker (1)安装docker sudo yum install docker (2)启动docker systemctl start do ...
- C# 视频多人脸识别的实现过程
整个项目是用虹软技术完成开发 上一篇内容的调整,提交到git了,https://github.com/catzhou2002/ArcFaceDemo 基本思路如下: 一.识别线程 1.获取当前图片 2 ...
- iis7.0 win7如何修改默认iis端口号
iis7与iis6的设置方法要详细很多.所以,在更改设置上,iis7反而显得更复杂.iis作为本地网页编辑环境,占用80端口都是理所当然的.但是,作为网页调试的技术人员,通常本地都会安装iis.Apa ...
- [LeetCode]题100:Same Tree
Given two binary trees, write a function to check if they are the same or not. Two binary trees are ...
- 加密、签名和SSL握手机制细节
openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 背景知识 对称加密 :加密解密使用同一密钥,加解密速度快.随 ...
- QChartView绘制饼状图
效果图: #include "mainwindow.h" #include "form.h" #include <QApplication> #in ...
- 精选!15 个必备的 VSCode 插件(前端类)
精选!15 个必备的 VSCode 插件(前端类) 就像大多数 IDE 一样,VSCode 也有一个扩展和主题市场,包含了数以千计质量不同的插件.为了帮助大家挑选出值得下载的插件,我们针对性的 ...
- Spring Security Oauth2 单点登录案例实现和执行流程剖析
Spring Security Oauth2 OAuth是一个关于授权的开放网络标准,在全世界得到的广泛的应用,目前是2.0的版本.OAuth2在“客户端”与“服务提供商”之间,设置了一个授权层(au ...
- PC/FORTH 变量|常数|数组
body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...