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的匿名内部类没有名字,自然也不能有显式的构造方法,从而无法在构造方法中完成初始化工作,但是如果不完成初始化就无法正常启动,所以此时就要借助初始化块。


  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值