Inicialização de objetos

Ola pessoal, estou começando a programar em java esse Mês e deparei com uma dúvida. Um programa exemplo que estava estudando tinha o seguinte código:

//Classe de numeros complexos
class Complexo{
	int x,y;   //parte real e complexo
	
	public int Re(){ //retorna parte real
		return x;
	}
		
	public int Im(){ //retorna parte imaginaria
		return y;
	}	
		
	public Complexo Vezes(Complexo c){
			
			Complexo resultado;

			resultado.x = x*c.x - y*c.y;
			resultado.y = x*c.y + y*c.x;
			return resultado;
	}
	public void print(){
		System.out.println("(" + x + " + " + y + "i)");                  
	}
}

public class ComplexNum{

	public static void main(String args[]){
		Complexo z,w; 
		z.x = 1; 
		z.y = 2;
		
		System.out.print( "O valor de z eh ");
		z.print();
		System.out.println(" A parte real de z eh "+z.Re() );
		System.out.println(" A parte imaginaria de z eh "+z.Im() );
		System.out.print(" z ao Quadrado eh ");
		w = z.Vezes(z);
		w.print();
	}
}

Ao compilar o programa, aparece uma mensagem que as variaveis resultado e z não foram inicializadas.
Ao instanciar um objeto, eu tenho que obrigatoriamente inicializar com algum valor?
Tentei com null, o compilador aceitou, mas ao rodar o .class aparece a mensagem:

“Exception in thread “main” java.lang.NullPointerException
at ComplexNum.main(ComplexNum.java:30)”

a versão do javac que estou usando é 1.6.0_11

Alguem pode me explicar o que está errado.

Gracias
Cau

Toda variável local (dentro dos metódos) tem que ser inicializada antes de ser usada.

Já as variáveis de instância (atributos) são inicializadas com valores padrão (int incia com 0, boolean incia true etc), assim que qqer objeto da classe for instanciado.

:wink:

Antes de atribuir valores aos metodos do objetos, vc tem que criar o objeto com o new.

tipo: Cliente cliente = new Cliente("");
cliente.setNome("");

De modo mais detalhado, quando vc faz… Cliente cliente; cliente.setNome("")… vc ainda n tem referência para um objeto no heap, o que causa a exception…

:wink:

Como você quer usar os métodos da sua classe, você precisa inizializar os objetos.
Você tentou inicializar, mas da maneira errada.
a maneira certa é dando um new.

Complexo z = new Complexo(); //Inicializa a variável de referência ao objeto. *
z.metodoEscolhido(); //Chama o método da classe.
  • As vezes, dependendo do construtor, você passa alguns parâmetros.
    Abraços

Você por acaso já programou em C++ ou Pascal (Delphi)? É que o erro que você teve é típico de quem já viu alguma dessas linguagens antes.

Em C++, pode-se definir um objeto simplesmente declarando uma variável com seu tipo:

complex c;

Isso faz duas coisas: define uma variável (do tipo “complex”), e cria um objeto chamando o construtor padrão. (No caso do C++, acho que std::complex define o construtor padrão como inicializando a parte real e a imaginária com zeros).

Em Java, essas coisas não são automáticas. Se você definir uma variável, ela sequer é preenchida; você precisa escrever explicitamente que quer que essa variável seja preenchida com um novo objeto.

Complex c = new Complex(1.0, 2.0); // preenche com um novo objeto

Uma pequena correção: variáveis de instância do tipo boolean tem valor padrão false. Variáveis de instância do tipo Boolean tem valor padrão null. Abraço!

really, I’m sorry…

abraços…

Realmente eu já progamei muito em Delphi e C.

Valeu galera pela ajuda!! :smiley: