Retorno de método

[b]questão 4.32b do livro de Deitel, edição 3º fala sobre a constante E que eu acho que é a constante de euler ou eulesson.
Eu utilizei um método para calcular o fatorial, ESTOU RETORNANDO UM VALOR DE FAT PARA O PROGRAMA PRINCIPAL, dúvida: por eu eu estou vendo esse valor no meu MÉTODO MAIN uma vez que eu criei DOUBLE FAT dentro de um método FATORIAL, ESSE VALOR NÃO DEVERIA SER VISTO SÓ dentro do método fatorial não ???

O PROGRAMA ESTÁ RODANDO LEGAL (A PRECISÃO É PEQUENA POR QUE RODEI SÓ 100 VEZES DENTRO DO LAÇO), GOSTARIA DE SABER APENAS ESSE LANCE PERGUNTADO ACIMA E POR QUE EU TENHO QUE COLOCAR AS PALAVRAS CHAVE public static ANTES DO MÉTODO FATORIAL ?? GRATO MEU AMIGO!! [/b]

[code] public class Questao4_32b {

public static void main(String args[]) {   
    double somatorio = 0, parcela = 1, denominador = 1;   

    int i;   

    for (i = 1; i <= 1000; i++) {   
        somatorio = somatorio + parcela;   
        denominador = fatorial(i);   
        parcela = 1 / denominador;   
        System.out.println(somatorio);   
    }   
   
}   

public static double fatorial(int x) {   
    double fat = 1;   
    for (int j = 1; j <= x; j++) {   
        fat = fat * j;   
    }   
    return fat;   

}   

}
[/code]

pq vc esta chamando de dentro de um metodo statico

Rpaz, obrigado mais continuo viajando nesse assunto (static ???) e sobre a variável fat ser recebida lá no main vc sabe dizer por quê? Grato !!!

public static é obrigatório somente no método main.

seu metódo fatorial poderia ser apenas

fatorial(param)

isso deixaria a visibilidade dele como default.

static quer dizer que seu método pode ser acessado sem criar instância de sua classe. Isso tudo você encontra na apostila da caelum ou no guia de certificação SCJP

[quote=luciano@@]public static é obrigatório somente no método main.

seu metódo fatorial poderia ser apenas

fatorial(param)

isso deixaria a visibilidade dele como default.

static quer dizer que seu método pode ser acessado sem criar instância de sua classe. Isso tudo você encontra na apostila da caelum ou no guia de certificação SCJP
[/quote]

Da forma que está não… ele teria que criar um Objeto da classe pra poder chamar o método diretamente…

Amigo criador do tópico, como você está estudando, não se preocupe com o conceito de static agora,. Com certeza o livro abordou assim pra facilitar o entendimento do algoritmo, é sinal que um dia ele irá abordar o static e aí sim você irá entender…

Apesar que pra certos conceitos da linguagem, eu ainda sugiro o “Use a Cabeça, Java !” aborda com mais clareza do que o Deitel…

Abs[] e bons estudos…

Algumas premissas:

  • O método main inicia a aplicação

  • Um método pode ser acessado por um objeto

  • Antes do programa iniciar não existem objetos

----------(como chamar o main :?: )

  • Um método estático não precisa de um objeto para ser chamado

----------(o que leva a outra condição)

  • Ou um método é estático ou ele deve ser chamado a partir de um objeto

Então, o método main deve obrigatoriamente ser estático :smiley:

e se você não quiser chamar o método por um objeto, ele deve ser estático :stuck_out_tongue:

quando você chama um método, o retorno assume a posição em que o método foi chamado…

[editando] Não tinha visto resposta acima [/editando]

Opa nada… sua explicação foi mais completa…

Abs []

felipifariasdesantana, por favor evite colocar títulos de tópico em caixa alta…

Antes de entender o que faz a a palavra chave static você tem que entender como funciona os objetos em java.
Quando voce cria uma classe como a do exemplo abaixo:

public class MinhaClasse {
	public int variavelAlgumaCoisa;
	public void funcaoFazAlgumaCoisa(){
		//Faz algo
	}
}

essa classe não existe na memória ainda, então se você fizer algo como:

MinhaClasse minhaClasse = null;

minhaClasse.variavelAlgumaCoisa = 1;
ou
minhaClasse.funcaoFazAlgumaCoisa();

você vai ter uma NullPointerException por que sua classe não foi inicializada, ou seja ela não é um objeto ainda pois não foi alocado memória para ela.
Sendo assim você tem que instanciar a classe:

MinhaClasse minhaClasse = new MinhaClasse();

assim você pode acessar seus membros:

minhaClasse.variavelAlgumaCoisa = 1;
e
minhaClasse.funcaoFazAlgumaCoisa();

Agora é que entra a palavra chave static, ela permite que um membro de uma classe (seja um atributo ou um método) seja acessado mesmo que a classe não tenha sido instanciada ou seja se você criar a classe assim:

public class MinhaClasse {
	static public int variavelAlgumaCoisa;
	static public void funcaoFazAlgumaCoisa(){
		//Faz algo
	}
}

você não precisa criar um objeto para ter acesso aos membros ou seja não necessario fazer:

MinhaClasse minhaClasse = new MinhaClasse();

Você pode simplesmente fazer:

MinhaClasse.variavelAlgumaCoisa = 1;
e
MinhaClasse.funcaoFazAlgumaCoisa();

A função main é estática justamente por causa disso, na hora de rodar o programa quem o faz chama assim:
NomeDaClasse.Main(parametros);

Só existe um problema, uma função estática só pode chamar outra função estática e só pode utilizar acessar atributos estáticos! Isso ocorre porque não tem como saber se a classe foi instanciada ou não!
Por isso a função fatorial do seu exemplo é estática, ela é chamada de dentro da função main que também é estática.

Mais uma coisa, um atributo estático mantém seu valor entre classes que o instanciam, mas isso é uma outra conversa.
Continue lendo o livro dos Deitel é muito bom, recomendo que você adquira a 8º Edição, é cara, mas vale cada centavo, nela explica melhor a palavra chave static, creio que na 3º também, mas não tenho certeza.

[quote=drigo.angelo]Algumas premissas:

  • O método main inicia a aplicação

  • Um método pode ser acessado por um objeto

  • Antes do programa iniciar não existem objetos

----------(como chamar o main :?: )

  • Um método estático não precisa de um objeto para ser chamado

----------(o que leva a outra condição)

  • Ou um método é estático ou ele deve ser chamado a partir de um objeto

Então, o método main deve obrigatoriamente ser estático :smiley:

e se você não quiser chamar o método por um objeto, ele deve ser estático :stuck_out_tongue:

quando você chama um método, o retorno assume a posição em que o método foi chamado…

[editando] Não tinha visto resposta acima [/editando][/quote]

Brilhante resposta, obrigado!!

Blz , vou evitar .

[quote=adriano_si][quote=luciano@@]public static é obrigatório somente no método main.

seu metódo fatorial poderia ser apenas

fatorial(param)

isso deixaria a visibilidade dele como default.

static quer dizer que seu método pode ser acessado sem criar instância de sua classe. Isso tudo você encontra na apostila da caelum ou no guia de certificação SCJP
[/quote]

Da forma que está não… ele teria que criar um Objeto da classe pra poder chamar o método diretamente…

Amigo criador do tópico, como você está estudando, não se preocupe com o conceito de static agora,. Com certeza o livro abordou assim pra facilitar o entendimento do algoritmo, é sinal que um dia ele irá abordar o static e aí sim você irá entender…

Apesar que pra certos conceitos da linguagem, eu ainda sugiro o “Use a Cabeça, Java !” aborda com mais clareza do que o Deitel…

Abs[] e bons estudos…[/quote]
Rapaz já me falaram sobre esse livro mas, na prova que irei fazer eles deram como bibliografia o de Deitel por isso estou com ele. Porém,com certeza darei uma olhada nesse outro quando eu acabar o de Deitel. Obrigado pela dica

[quote=x@ndy]Antes de entender o que faz a a palavra chave static você tem que entender como funciona os objetos em java.
Quando voce cria uma classe como a do exemplo abaixo:

public class MinhaClasse {
	public int variavelAlgumaCoisa;
	public void funcaoFazAlgumaCoisa(){
		//Faz algo
	}
}

essa classe não existe na memória ainda, então se você fizer algo como:

MinhaClasse minhaClasse = null;

minhaClasse.variavelAlgumaCoisa = 1;
ou
minhaClasse.funcaoFazAlgumaCoisa();

você vai ter uma NullPointerException por que sua classe não foi inicializada, ou seja ela não é um objeto ainda pois não foi alocado memória para ela.
Sendo assim você tem que instanciar a classe:

MinhaClasse minhaClasse = new MinhaClasse();

assim você pode acessar seus membros:

minhaClasse.variavelAlgumaCoisa = 1;
e
minhaClasse.funcaoFazAlgumaCoisa();

Agora é que entra a palavra chave static, ela permite que um membro de uma classe (seja um atributo ou um método) seja acessado mesmo que a classe não tenha sido instanciada ou seja se você criar a classe assim:

public class MinhaClasse {
	static public int variavelAlgumaCoisa;
	static public void funcaoFazAlgumaCoisa(){
		//Faz algo
	}
}

você não precisa criar um objeto para ter acesso aos membros ou seja não necessario fazer:

MinhaClasse minhaClasse = new MinhaClasse();

Você pode simplesmente fazer:

MinhaClasse.variavelAlgumaCoisa = 1;
e
MinhaClasse.funcaoFazAlgumaCoisa();

A função main é estática justamente por causa disso, na hora de rodar o programa quem o faz chama assim:
NomeDaClasse.Main(parametros);

Só existe um problema, uma função estática só pode chamar outra função estática e só pode utilizar acessar atributos estáticos! Isso ocorre porque não tem como saber se a classe foi instanciada ou não!
Por isso a função fatorial do seu exemplo é estática, ela é chamada de dentro da função main que também é estática.

Mais uma coisa, um atributo estático mantém seu valor entre classes que o instanciam, mas isso é uma outra conversa.
Continue lendo o livro dos Deitel é muito bom, recomendo que você adquira a 8º Edição, é cara, mas vale cada centavo, nela explica melhor a palavra chave static, creio que na 3º também, mas não tenho certeza.
[/quote]

Blz , vou implementar sua sugestão . Obrigado!!!

Por favor, evite usar letras maiúsculas no título todo do tópico, ou em frases inteiras do seu texto.

vou evitar , obrigado!!