Porque não posso fazer isso?

[code]public class DogD
{

void bark(int numofBarks) —> Sei que assim esta certo, mas olha o segunda, Só quero saber o porque de não poder usar como o segundo
{
while (numofBarks > 0)
{
System.out.println(“Ruff”);
numofBarks = numofBarks - 1;
}
}
}
class DogTestDrive
{
public static void main (String args[])
{
DogD dog = new DogD();
dog.bark(3);
}
}[/code]

[code]public class DogD
{

void bark()
{
int numofBarks; ------------------> Porque não posso fazer isso???
while (numofBarks > 0)
{
System.out.println(“Ruff”);
numofBarks = numofBarks - 1;
}
}
}
class DogTestDrive
{
public static void main (String args[])
{
DogD dog = new DogD();
dog.bark(3);
}
}[/code]

Por que eu não posso fazer o segundo codigo do jeito que ta aí em cima, o primeiro sei que ta certo, mas porque não posso fazer o segundo desse modo?

tenta atribuir um valor para esse int

int numero = 0 ;

Oi,

Cadê o parametro no método no segundo exemplo? Você tá passando um parâmetro para um método que não tem parâmetro e isso definitivamente não pode.

pq vc não está recebendo nenhum parametro no método bark().

O compilador não tem como saber o que vc passou pro método no main é a variável numofBarks.

e vc é opbrigado a inicializar as variáveis de um método antes de utilizar elas…


void bark()  
{  
    int numofBarks = 3; // vc tem que inicializar a variável.

    //use um for quando vc souber o número de iterações.
    for (int i = 0; i < numofBarks; i++)
         System.out.println("Ruff"); 
}  

Você está confundindo parâmetros com variáveis locais. Eles são coisas diferentes.

Parâmetro - algo que você passa para um método
Variável local - algo que um método usa internamente.

Por acaso você aprendeu C antes (usando a sintaxe antiga do Kerninghan e Ritchie? ) Em C antigo (que os compiladores não aceitam mais) existe uma coisa que acho terrivelmente confusa. Veja a diferença:

// Em C antigo, note que os parâmetros são declarados separadamente do tipo dos parâmetros, 
// e que podem ficar fora de ordem:
main (argc, argv)
char *argv[],
int argc;
{
}

e

// No C moderno, os parâmetros são declarados na lista de parâmetros, como em Java:
int main (int argc, char *argv[])
{
}

O primeiro caso vc esta dizendo que o metodo vai receber um int como parametro, por isso funciona
No segundo caso vc está criando uma variavel local dentro do metodo, entao vc precisa inicializar ela com algum valor inteiro.

Talvez isso possa confundir pelo seguinte comportamento: vc não precisa inicializar os atributos de uma classe. Assim

class X{ int i; // ja é 0 automagicamente }

Agora dentro de um método (ou qualquer outro tipo de bloco de código) isso é complicado, pois o compilador não vai atribuir um valor default.

Pessoal, uma dúvida, o problema não é também na linha 20 do segundo exemplo?

Pois ele declara: voidBark() <<< sem parâmetro

e depois

Dog d = new Dog():

d.bark(3); <<<<< isso não está errado não?

[quote=thinet]Pessoal, uma dúvida, o problema não é também na linha 20 do segundo exemplo?

Pois ele declara: voidBark() <<< sem parâmetro

e depois

Dog d = new Dog():

d.bark(3); <<<<< isso não está errado não?[/quote]

Com certeza está, a menos que exista um outro bark que não receba parâmetros.