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 代码下载:点我下载 目录 前言 属性与自动属性 属性 自动属 ...
随机推荐
- ASP.NET Core Swagger 显示接口注释
在Startup中 services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new Info { Title ...
- 力扣(LeetCode) 263. 丑数
编写一个程序判断给定的数是否为丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例 1: 输入: 6 输出: true 解释: 6 = 2 × 3 示例 2: 输入: 8 输出: true ...
- [Hibernate] One-To-Many 配置文件和注解的方式以及HQL语句
一对多需要在一的类配置多的类的set泛型集合. 多的一端需要添加一的类作为属性,其和数据库对应的是对应表的主键. 一个购物车有多个商品,购物车有个cart_id作为主键,商品除了自己的items_id ...
- String.format(String format, Object... args)方法详解
很多次见到同事使用这个方法,同时看到https://blog.csdn.net/qq_27298687/article/details/68921934这位仁兄写的非常仔细,我也记录一下,好加深印象. ...
- Linux常用命令汇总集
cd ./ 当前目录 ../ 上级目录 / 代表根目录 or 代表目录和文件之间的分隔符 .. pwd 查看当前路径 LS 查看当前目录下的文件 ls ./a/ 查看目标路径下的文件 tab 自动补全 ...
- sass compass config.rb
require 'compass/import-once/activate' # Require any additional compass plugins here. # Set this to ...
- ERROR in Node Sass does not yet support your current environment: Windows 64-bit with Unsupported runtime (64)
该问题说的是当前环境不支持node-sass,网上说了一下是要安装node 7一下版本才支持. 这里改使用less-loader,及less
- 阶段01Java基础day24多线程+GUI
25.01_多线程(多线程方法) 1.yield让出cpu 2.setPriority()设置线程的优先级 25.02_多线程(单例设计模式)(掌握) 单例设计模式:保证类在内存中只有一个对象. 如何 ...
- More is better
题目描述: Mr Wang wants some boys to help him with a project. Because the project is rather complex, the ...
- 利用Java获取ip地址
方法1 public static String getIp2(HttpServletRequest request) { String ip = request.getHeader("X- ...