Java读书笔记十二(Java中的代码块)

前言

我们知道在java中通过构造器来为对象进行初始化操作,但是在java中与构造器类似的还有初始化块的操作,下面小编来为大家分享一下。

初始化块使用

在Java中初始化块是java中出现的第4中成员,前三种分别是成员变量、方法和构造器。一个类中可以有多个初始化块,并且相同类型的初始化块是按照顺序依次执行的。初始化块的修饰符只能是static,初始化块可以包含任何可执行语句,包括定义局部变量、调用其他对象方法,以及使用分支、循环语句等

/**
 * @FileName: test.java
 * @Package:com.number
 * @Description: TODO
 * @author: LUCKY
 * @date:2015年11月29日 下午12:55:00
 * @version V1.0
 */
package com.number;

/**
 * @ClassName: test
 * @Description: TODO
 * @author: LUCKY
 * @date:2015年11月29日 下午12:55:00
 */
public class test {

	int cd;
	int d=9;
	 {
		// 下面定义一个初始化块
		int a = 6;
		System.out.println(a > 4 ? "局部变量a大于4" : "局部变量a小于4");
	}

	 int c=0;

    public  test(){
    	cd=10;
    	System.out.println("初始化构造器");
    }
	public static void main(String[] args) {
		test test = new test();
		System.out.println(Integer.compare(2, 3));
	}
}

初始化块和构造器

可以从某种程度上来看,初始化块是构造器的补充,初始化块总是在构造器之前执行,可以使用初始化器来进行对象的初始化操作。

但是初始化块与构造器又有区别,它只是一段固定的执行的代码,不能接受任何的参数。因此初始化器的应用场景我们可以理解为,当两个或者多个构造器中有相同的初始化代码,并且这些初始化代码无须接受参数的时候,就可以把他们放在初始化块中定义。通过把多个构造器中相同的代码提取到初始化中定义,能更好的提高初始化代码的复用,提高整个应用的可维护性。

静态初始化块

如果定义初始化块时使用了static修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块(普通初始化块负责对对象进行初始化操作,类初始化块负责对类进行初始化)。静态初始化块是与类相关的,系统将在类初始化块阶段进行静态初始化块,而不是在创建对象的时候才执行。因此静态初始化块总是比普通初始化块先执行。

废话不多说了,来看一下下面的Demo,解解闷吧!一定要认真的跑一遍。

package com.test;
class Root
{
	static{
		System.out.println("Root的静态初始化块");
	}
	{
		System.out.println("Root的普通初始化块");
	}
	public Root()
	{
		System.out.println("Root的无参数的构造器");
	}
}
class Mid extends Root
{
	static{
		System.out.println("Mid的静态初始化块");
	}
	{
		System.out.println("Mid的普通初始化块");
	}
	public Mid()
	{
		System.out.println("Mid的无参数的构造器");
	}
	public Mid(String msg)
	{
		// 通过this调用同一类中重载的构造器
		this();
		System.out.println("Mid的带参数构造器,其参数值:"
			+ msg);
	}
}
class Leaf extends Mid
{
	static{
		System.out.println("Leaf的静态初始化块");
	}
	{
		System.out.println("Leaf的普通初始化块");
	}
	public Leaf()
	{
		// 通过super调用父类中有一个字符串参数的构造器
		super("疯狂Java讲义");
		System.out.println("执行Leaf的构造器");
	}
}
public class Test
{
	public static void main(String[] args)
	{
		new Leaf();

	}
}
时间: 2024-10-05 16:18:01

Java读书笔记十二(Java中的代码块)的相关文章

黑马程序员——JAVA学习笔记十二(高新技术一)

 1,    静态导入: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 package com.solaire.enhance; import static java.lang.Math.max;  //import   语句可以导入一个类或某个包中的所有类 //import static  静态导入 JDK5以后才有.语句导入一个类中的某个静态方法或所有静态方法 //无名包和有包名中的类在一起,没有package,则为无名包. //一个类

Think in java读书笔记之:java匿名内部类的继承和覆盖

内部类的继承 Java中继承匿名内部类一个要结局的问题就是,内部类的构造器必须要指向其外围对象的引用,所以要采取特殊的语法.书上给的示例代码的可有编译版本,必须在继承的内部类的构造器内添加enclosingClassReference.super(). 1 class WithInner{ 2 class Inner{} 3 } 4 public class InheritInner extends WithInner.Inner{ 5 InheritInner(){ 6 enclosingCl

Java读书笔记十五(Java中的内部类)

前言 Java从JDK1.1的时候,就开始引入内部类的概念了,那么小编也通过这篇博客来分享一下Java中有关内部类的一些特性. 什么是内部类? 在很多情况下,类被定义成一个独立的程序单元,但是有时候也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就称为内部类. 从语法上来看的话,定义内部类和定义外部类的语法大致相同,内部类除了需要定义在其他类里面之外,还存在如下两点区别. 1.内部类比外部类多使用三个修饰符:private--protected.static--外部类不可以使用这三个

Java读书笔记十四(java中的抽象类)

前言 在java中,有时候需要对类的行为进行提取,因此也就有了抽象类和接口的概念,这篇博客,小编来剖一下java中的抽象类和接口.  抽象方法和抽象类 抽象方法和抽象类的规则如下: 1.抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽线方法不能有方法体 2.抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例.即使抽象类里不可包含抽象方法,这个抽象类也不能被创建实例. 3.抽象类可以包含成员变量.方法(普通方法和抽象方法都可以

Java读书笔记十一(Java中的内省机制)

1.前言 最近在学习Java的时候,突然发现了这个概念,鉴于好奇心的压迫,于是打算写一篇博客来总结一下. 2.什么是内省机制 为了让程序员们更好的从左Java对象的属性,SUN公司开发了一套API,就被我们称为"内省",有利于我们对类对象的属性的操作,减少了代码的数量. 3.内省和反射有什么区别 反射式在运行状态把Java类中的各种成分映射成相应的Java类,可以动态的获取所有的属性以及动态调用任意一个方法,强调的是运行状态. 内省机制是通过反射来实现的,BeanInfo用来暴露一个b

Effective Java 读书笔记之二 对于所有对象都通用的方法

尽管Object是一个具体的类,但设计它主要是为了扩展.它的所有非final方法都有明确的通用约定.任何一个类在override时,必须遵守这些通用约定. 一.覆盖equals时请遵守通用的约定 1.Object中默认的equals方法约定是:类的每个实例都只与它自身相等.当类有自己特有的“逻辑相等”的概念时,就应该覆盖equals方法. 2.Timestamp对Date进行了扩展,Timestamp的equals实现确实违反了对称性.如果Timestamp和Date混合一起使用,可能导致不正确

How tomcat works 读书笔记十二 StandardContext 上

在tomcat4中,StandardContext.java是最大的一个类,有117k.废话不说,开始分析吧. 其实要分析StandardContext,也就主要分析两个方法,一个start,一个invoke. 两个变量 这里首先咱们得说两个boolean型的变量available,configured. 先说available,它表示了StandardContext是否可用,初始值为false.若StandardContext启动成功,其值就变为true;另外各种原因都会导致StandardC

How tomcat works 读书笔记十二 StandardContext 下

对重载的支持 tomcat里容器对重载功能的支持是依靠Load的(在目前就是WebLoader).当在绑定载入器的容器时 public void setContainer(Container container) { ... // Register with the new Container (if any) if ((this.container != null) && (this.container instanceof Context)) { setReloadable( ((Co

Machine Learning for hackers读书笔记(十二)模型比较

library('ggplot2')df <- read.csv('G:\\dataguru\\ML_for_Hackers\\ML_for_Hackers-master\\12-Model_Comparison\\data\\df.csv') #用glm logit.fit <- glm(Label ~ X + Y,family = binomial(link = 'logit'),data = df) logit.predictions <- ifelse(predict(logit