Java中初始化块的真实作用

声明:本博客为原创博客,未经允许,不得转载!原文链接为 http://blog.csdn.net/bettarwang/article/details/27128323

对于普通的类而言,可以放在初始化块中的初始化工作其实完全可以放到构造函数中进行,只不过有时会带来些许不便,如有多个构造器,就要在多个地方加上初始化函数完成初始化工作,而如果放到初始化块中的话则只要写一次即可。如下例所示:

import java.util.*;

public class Car
{
   private void init()
   {
      System.out.println("Start engine before run()");
   }

   public Car()
   {
      init();
      System.out.println("Run normally");
   }

   public Car(float velocity)
   {
      init();
      System.out.println("Run with "+velocity+" miles/h");
    }

   public static void main(String[]args)
   {
      new Car();
      new Car(210f);
   }
}

输出结果如下:

如果使用初始化块,则代码如下:

import java.util.*;

public class Car
{
   private void init()
   {
      System.out.println("Start engine before run()");
   }

   //使用初始化块
   {
     init();
    }

   public Car()
   {
      //init();
      System.out.println("Run normally");
   }

   public Car(float velocity)
   {
      //init();
      System.out.println("Run with "+velocity+" miles/h");
    }

   public static void main(String[]args)
   {
      new Car();
      new Car(210f);
   }
}

显然,使用初始化块的代码比不使用初始化块的代码要更简洁。

但是,如果只是这一点便利的话,还不足以使用初始化块,其实初始化块真正体现其独一无二的作用是在匿名内部类中,由于是匿名内部类,因而无法写构造方法,但是很多时候还是要完成相应的初始化工作,这时就需要用到初始化块了,特别是Android中大量地使用匿名内部类,初始化块的作用就十分突出,如下例所示:

import java.util.*;

interface Vehicle
{
  public void run();
  public void carry();
 }

class Person
{
  public void drive(Vehicle vehicle)
  {
    vehicle.run();
   }
}

public class AnonymousSample
{
   public static void main(String[]args)
   {
      Person person=new Person();
      person.drive(new Vehicle()
      {
        private void init()
        {
           System.out.println("Start engine befor run()");
        }

        //匿名类中只能使用普通初始化块来完成初始化工作
        {
          init();
         }

        @Override
        public void run()
        {
           System.out.println("Car can run with high velocity on freeway.");
        }
        @Override
        public void carry()
        {
           System.out.println("Car can carry 3 persons at least.");
         }
      });
   }
}

输出结果如下:

显然,在本例中,由于实现Vehicle的匿名内部类没有名字,自然也不能有显式的构造方法,从而无法在构造方法中完成初始化工作,但是如果不完成初始化就无法正常启动,所以此时就要借助初始化块。

Java中初始化块的真实作用

时间: 2024-10-09 23:40:40

Java中初始化块的真实作用的相关文章

java中初始化块、静态初始化块和构造方法

(所谓的初始化方法init()是另一回事, 在构造方法之后执行, 注意不要混淆) 在Java中,有两种初始化块:静态初始化块和非静态初始化块.它们都是定义在类中,用大括号{}括起来,静态代码块在大括号外还要加上static关键字. 非静态初始化块(构造代码块):作用:给对象进行初始化.对象一建立就运行,且优先于构造函数的运行.与构造函数的区别:非静态初始化块给所有对象进行统一初始化,构造函数只给对应对象初始化.应用:将所有构造函数共性的东西定义在构造代码块中. 静态初始化块:作用:给类进行初始化

Java的初始化块及执行过程详解

问题:Java对象初始化方式主要有哪几种?分别是什么?针对上面的问题,想必大家脑海中首先浮现出的答案是构造器,没错,构造器是Java中常用的对象初始化方式. 还有一种与构造器作用非常相似的是初始化块,它可以对Java对象进行初始化操作.下面主要阐述Java的初始化块及执行过程. Java初始化块其实是Java类的成员之一,其语法格式如下: [修饰符]{ //初始化块的可执行代码 ... } 初始化块的修饰符只能是static,使用static修饰符的初始化块称为静态初始化块,后面会介绍到. 下面

Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究

随笔- 40  文章- 0  评论- 1 Java的初始化块.静态初始化块.构造函数的执行顺序及用途探究 Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, C三个类用作测试,其中B继承了A,C又继承了B,并分别给它们加上静态初始化块.非静态初始化块和构造函数,里面都是一句简单的输出. 主类Main里面也如法炮制. 1 class A { 2 st

详解Java中代码块和继承

本文发表于个人GitHub主页,原文请移步详解Java中代码块和继承 阅读. 概念 1.代码块 局部代码块 用于限定变量生命周期,及早释放,提高内存利用率 静态代码块 对类的数据进行初始化,仅仅只执行一次. 构造代码块 把多个构造方法中相同的代码可以放到这里,每个构造方法执行前,首先执行构造代码块. 2.继承 继承是已有的类中派生出新的类,新的类能够吸收已有类的数据属性和行为,并能扩展新的功能. 代码块的执行顺序 public class Test {    public String name

Java的初始化块

Java的初始化块分为静态初始化块和非静态初始化块 静态初始化块 static{ //初始化内容 } 非静态初始化块 { //初始化内容 } 静态初始化块仅能初始化类变量,即static修饰的数据成员.非静态初始化块在对象每次生成时都会被执行一次,可以初始化类的实例变量.两种初始化块不可以传参数. 非静态初始化块在构造函数执行时且构造函数主体代码没执行前执行 静态初始化块.非静态初始化块.构造函数 执行的顺序为:静态初始化块->非静态初始化块->构造函数 非静态初始化块在匿名内部类中使用较多,

Java中 初始化的先后顺序?

我们在java中 Java中初始化的顺寻? java代码: package sru.love.c; class Person { String name = "Person"; static { System.out.println("我是 Person 的 static 代码块"); } { System.out.println("我是 Person 构造代码块"); } Person() { System.out.println("

java中instanceof和getClass()的作用

初学者难免有点混淆java中instanceof和getClass()的作用,  下面就来一一讲解.    父类A: class A { }     子类B: class B extends A { }      构造对象 Object o1 = new A(); Object o2 = new B(); 一.instanceof     演示一: 1.o1 instanceof A => true  2.o1 instanceof B => false  3.o2 instanceof A

Java中String args[]起什么作用?

在百度知道上看到这样一个答案: 在命令提示符中运行该程序时 可以附加参数运行 输入的参数会存入到字符传数组 args[]中例如:在命令提示符中运行该程序的时候假设该程序在D的JAVA文件夹中D:JAVA\javac Example.javaD:JAVA\java Example 20则屏幕中输出This is a simple Java program.而args[]中所存储的是20 于是我试了一下: public class Hello { private int asd; public He

Java中初始化对象的顺序,静态代码块的用法以及Static的用法详解

(一)java 静态代码块 静态方法区别 一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用 比如main方法就必须是静态的 这是程序入口 两者的区别就是:静态代码块是自动执行的; 静态方法是被调用的时候才执行的. 静态方法 (1)在Java里,可以定义一个不需要创建对象的方法,