Sem inicializar números inteiros no Java, o que acontece?

Olá pessoal. Estou estudando Java, e não entendi o que ocorre no código a seguir. Uma hora ele inicializa com zero uma variável nunca inicializada. Outra hora, dá erro de compilação.

Criei a seguinte classe:

package food;

public abstract class Fruit {
	private String sabor;
	private String cor;
	private int madura;
	
	public String getSabor()
	{
		return sabor; 
	}
	
	public String getCor()
	{
		return cor;
	}
	
	public int getMadura()
	{
		return madura;
	}
	
	public void setMadura(int valor)
	{
		madura = valor;
	}
	
	public abstract void amadurecer();
}

E em seguida, esta:

package food;

public class Apple extends Fruit {
	
	public void amadurecer()
	{
		this.setMadura(this.getMadura() + 1);
	}

}

No main, criei este código:

{
	Apple a = new Apple();
	System.out.println(a.getMadura());
	a.amadurecer();
	System.out.println(a.getMadura());
	//int b;
	//System.out.println(b);
}

E o retorno foi:

0
1

Como pode ter retornado 0 se o valor da variável não foi inicializado em nenhum momento?
Se eu tento descomentar as linhas do MAIN, dá erro. Se o Java inicializa as variáveis com zero, porque dá erro de compilação nas linhas do ‘int b’, dentro do void main?

Valeu pela ajuda :wink:

Vamos la…

Variaveis de classe são inicializadas automaticamente e variáveis locais (dentro dos métodos), não.
No primeiro exemplo, madura é uma variável da classe Fruit. No segundo exemplo, b é uma variável do método main.
Mas atenção, NUNCA é uma boa prática não inicializar uma variável explicitamente!!

Perguntinha de certificação isso :wink:

Se for uma variavel “membro”, valores int são inicializados com o valor 0, String com null, boolean com false e assim por diante.
Se forem variáveis locais, elas não são Inicializadas e assim você recebe uma Exception.

Olá

Como está escrito de forma bem clara em todos os textos básicos de Java desde que a linguagem foi lançada, o Java NÃO inicializa variáveis locais com zero nem com qualquer outro valor.

[]s
Luca

Beleza, valeu moçada, entendi o que estava acontecendo!!

Sim, é bem pergunta de certificação, estou estudando para isso, quando me deparei com esta dúvida não havia entendido o que estava ocorrendo, e resolvi consultar os mestres :smiley:

Obrigado a todos que responderam!

bom primeiro parceiro vc ta chamado a variavel de instancia q tem o valor padrao como 0, e depois vc chama getmadura atraves do metodo amadurecer e incrementa + 1 e imprime certo? entao vc tem 0 1 na tela… se vc tirar o // do b dar erro pq int b é uma variavel local do metodo main entao ela deve ser inicializada… e quando vc nao dar nenhum valor para as variaveis primiticas a JVM vai acusar o erro… coloque isso int b = 0 para vc ver se na tela vai ficar assim 0 1 0.
Pelo pouco conhecimento q tenho entendi isso… no seu codigo… :slight_smile:

O java automaticamente da valor default pra atributos de classe
int 0, double 0.0, boolean false . etc

no caso madura é um atributo da classe

se voce tira o comentario aqui

//int b; //System.out.println(b);

b é uma variavel local do metodo main e esse tipo de variavel precisa ser inicilizada.