Blocos iniciadores

Bem pelo que eu venho estudando blocos iniciadores são tipos métodos
construtores a diferença é que métodos construtores faz parte do objeto é blocos construtor faz parte da classe, mais estou com uma grande dúvida.
Tudo bem que construtor da classe é utilizado para dar valores a atributos de uma classe quando seu objeto é instanciado mais com blocos construtores
como isso funciona? Ele inicia os atributos da classe implícitamente assim que
eu o declaro…? vou colocar um código que eu fiz pra ficar mais fácil o entedimento da minha dúvida:

package com.br.funcionario;

public class Circle {
	
	// campos da classe
	public static final double PI=3.14159;
	public static double campo;
	public static double campo1;
	public static double campo2;
	public static double campo3;
	
	
	//campos de instancia
	public String id;
	
	static
	{
		campo=21;
		campo1=22;
		campo2=23;
		campo3=24;
		 
	}
	
	
	public Circle()
	{
		this("Anterior");
	}
	
	public Circle(String id)
	{
		this.id=id;
		
	}
	
	//um método da classe
	public static double radiansToDegrees(double rads)
	{
		return rads*180/PI;
	}
	
	//um campo de instância
	public double r;  //0 raio
	
	
	//campos de instância que operam sobre campos os campos de instância de um objeto
	public double area()
	{
		return PI*r*r;
	}
	
	public static double area(double r)
	{
		return PI*r*r;
	}
	
	public double circuference()
	{
		return 2*PI*r;
	}
	//Compara o círculo "this" implícito com o círculo that passado 
	
	public  Circle verificaCirculo(Circle outro)
	{
		if(this.r>outro.r)
		{
			return this;
		}
		else
			return outro;
	}
	
	public String toString()
	{
		return this.id;
	}

}

class Testess
{
	
	public static void main(String args[]){
		Circle x = new Circle();
		 
		
		System.out.print(x.campo);
		 
		
		 
		
	}
}

static
{
	campo=21;
	campo1=22;
	campo2=23;
	campo3=24;
	 
}

neste casso ele inicializa as váriaveis da classe com esses valores.
Mas se por ventura se eu quizer passar passar o valor de uma outra forma tem como…? se eu estiver errado em alguma parte por favor me corrijam.

blocos de inicializacao é interessante qd sempre terá um valor padrao…

mas se sempre for ter alteração no valor, e você quiser passar os valores na inicialização, entao use o contrutor…

[]'s
Geraldo

Os blocos static são executados apenas quando a JVM carrega a sua classe.

[code]public class TesteStatic {

static {
	System.out.println("Bloco static...");
}

public TesteStatic() {
	System.out.println("Construtor...");		
}

public static void main(String[] args) {
	new TesteStatic();
	new TesteStatic();
}

}[/code]

A saída desse código é:

Bloco static... Construtor... Construtor...

T+