diferenças na inicialização

Pessoal,

Existe alguma diferença entre os três trechos de código abaixo??

[code]class Classe{

int dado = 50;
}[/code]

class Classe{ int dado; Classe (){dado = 50}; }

[code]class Classe{
int dado;
{dado = 50;}

}[/code]

Alguém?

??

Se as classes forem só isso, não há nenhuma diferença. Se a classe tiver mais construtores (fora o default, sem parâmetros) pode dar um pouco de diferença porque você pode acabar se esquecendo de inicializar a variável “dado” nos outros construtores.

No terceiro exemplo (com o bloco de inicialização), digamos que eu serialize e depois deserialize um objeto desta classe…

O que vai acontecer com a variável dado?

E se esse bloco de inicialização não estivesse nesta classe, mas sim numa superclasse desta classe…o que aconteceria qdo o objeto fosse
deserializado? O bloco de inicialização da super classe roda tbm?

Sanei a dúvida com o seguinte código:

[code]import java.io.*;
class TesteJava{
public static void main (String args[]){
Classe1 objClasse1 = new Classe1();
Classe2 objClasse2 = new Classe2();
Classe3 objClasse3 = new Classe3();

	System.out.println ("Antes de serializar: ");
	objClasse1.dado = 1;
	System.out.println ("Classe 1 dado " + objClasse1.dado);
	System.out.println ("Classe 2 dado " + objClasse2.dado);
	System.out.println ("Classe 3 dado " + objClasse3.dado);
	try{
		ObjectOutputStream oos1= new ObjectOutputStream ( new FileOutputStream ("obj1.ser"));
		oos1.writeObject (objClasse1);
		ObjectOutputStream oos2= new ObjectOutputStream ( new FileOutputStream ("obj2.ser"));
		oos2.writeObject (objClasse2);
		ObjectOutputStream oos3= new ObjectOutputStream ( new FileOutputStream ("obj3.ser"));
		oos3.writeObject (objClasse3);

		ObjectInputStream ois1 = new ObjectInputStream (new FileInputStream ("obj1.ser"));
		Classe1 obj1 = (Classe1)ois1.readObject();
		ObjectInputStream ois2 = new ObjectInputStream (new FileInputStream ("obj2.ser"));
		Classe2 obj2 = (Classe2)ois2.readObject();
		ObjectInputStream ois3 = new ObjectInputStream (new FileInputStream ("obj3.ser"));
		Classe3 obj3 =(Classe3) ois3.readObject();

		System.out.println ("Depois: ");
		System.out.println ("Classe 1 dado : " + obj1.dado);
		System.out.println ("Classe 2 dado : " + obj2.dado);
		System.out.println ("Classe 3 dado : " + obj3.dado);
	}
	catch (Exception e){
		e.printStackTrace();
		System.out.println (e.getCause());
	}
	
}

}

class Super{public int dado = 2;}

class Classe1 extends Super implements Serializable{

}
class Classe2 implements Serializable{
public int dado;
{
dado = 1;
}
}
class Classe3 implements Serializable{
public int dado;
public Classe3(){
dado = 1;
}
}
[/code]

ou seja, o seguinte trecho da classe Super : public int dado = 2; roda como se estivesse dentro do contrutor mesmo não estando. :slight_smile: