Dúvida sobre o main e métodos statics

10 respostas
X

o main é declarado como static e tal, e apenas le métodos tabém declarados como static, e objetos a msm coisa, se eu declaro um objeto apenas como public ele e tento chamar 1 método desse objeto pede pra mim transformar a instância em static.

a dúvida é:

é sempre assim msm ? todos os métodos e objetos que eu fizer ou declarar na classe q esta o main irão ter q ser static ?

agradeço desde já.

10 Respostas

Gustavokt

Sim. O mesmo vale para métodos statics que não sejam o main.

Nicolas_Fernandes

Para solucionar esse caso, pode-se fazer da seguinte maneira:

public class Main
{
   public static void main(String[] args)
   {
      new Main().metodoCriado();
   }
   public void metodoCriado()
   {
      System.out.println("Chamei este método!");
   }
}
Gustavokt

Nicolas Fernandes:
Para solucionar esse caso, pode-se fazer da seguinte maneira:

public class Main { public static void main(String[] args) { new Main().metodoCriado(); } public void metodoCriado() { System.out.println("Chamei este método!"); } }

Isso não seria um pouco “deselegante”?

evertonsilvagomesjav

Gustavokt:
Nicolas Fernandes:
Para solucionar esse caso, pode-se fazer da seguinte maneira:

public class Main { public static void main(String[] args) { new Main().metodoCriado(); } public void metodoCriado() { System.out.println("Chamei este método!"); } }

Isso não seria um pouco “deselegante”?

LOL deselegante pq? Vc vai acessar metodos de instancia como entao? magia negra?

Gustavokt

evertonsilvagomesjava:

LOL deselegante pq? Vc vai acessar metodos de instancia como entao? magia negra?

Deselegante porque do meu ponto de vista, a classe que contém o main deveria ter variáveis e/ou métodos que eventualmente interferissem com a execução do método main(). Faz sentido eu criar uma instância da classe que contém o main só para usar o método dele? Será que você não poderia ter criado uma classe e encapsular essa lógica?

public class ClasseQueContemAlgumaLogica{
   public Resultado facaAlgumaCoisa()...
}

...

public class Main  
{  
   public static void main(String[] args)  
   {  
      ClasseQueContemAlgumaLogica instancia = new ClasseQueContemAlgumaLogica();
      Resultado r = instancia.facaAlgumaCoisa();
      ...
   }  
}

É a mesma coisa quando falam de orientação a objeto em java. Você pode escrever um programa inteiro de forma procedural em java. Se dá para usar orientação a objeto, porque não usar? :wink:

Mas isso é do meu ponto de vista. De fato, é possível fazer o que o Nicolas disse, mas eu não recomendaria (pelo menos nesse caso).

Everton, você está começando a programar em java ou isso foi apenas uma dúvida?

evertonsilvagomesjav

A questão não é o padrão de projeto a ser usado, e sim explicar para o amigo como usar métodos de instancia, staticos e etc.

Nicolas_Fernandes

Gustavokt:
evertonsilvagomesjava:

LOL deselegante pq? Vc vai acessar metodos de instancia como entao? magia negra?

Deselegante porque do meu ponto de vista, a classe que contém o main deveria ter variáveis e/ou métodos que eventualmente interferissem com a execução do método main(). Faz sentido eu criar uma instância da classe que contém o main só para usar o método dele? Será que você não poderia ter criado uma classe e encapsular essa lógica?

public class ClasseQueContemAlgumaLogica{
   public Resultado facaAlgumaCoisa()...
}

...

public class Main  
{  
   public static void main(String[] args)  
   {  
      ClasseQueContemAlgumaLogica instancia = new ClasseQueContemAlgumaLogica();
      Resultado r = instancia.facaAlgumaCoisa();
      ...
   }  
}

É a mesma coisa quando falam de orientação a objeto em java. Você pode escrever um programa inteiro de forma procedural em java. Se dá para usar orientação a objeto, porque não usar? :wink:

Mas isso é do meu ponto de vista. De fato, é possível fazer o que o Nicolas disse, mas eu não recomendaria (pelo menos nesse caso).

Everton, você está começando a programar em java ou isso foi apenas uma dúvida?

A questão não é falar sobre encapsulamento, sobre OO ou coisas similares. Nosso amigo queria saber só como faria para acessar, dentro do Main, um método não-estático.

xray_495
As classes que você criar não devem conter a palavra reservada static, mas sim os seus métodos. Você pode definir quais métodos que você queira que sejam chamados sem existir uma instância da classe. Um exemplo disso é o padrão Singleton, onde você criar um método estático para pegar a instância da classe, e o resto não-estático.

public class ClasseExemplo
{
   public void mostrarMensagem()
   {
      String mensagem = "Esta é a minha mensagem.";
      return mensagem;
   }
   pubic static int somarValores(int primeiroValor, int segundoValor)
   {
      int somaValores = primeiroValor + segundoValor;
      return somaValores;
   }
}

Para usar a classe…

public class Main
{
   public static void main(String[] args)
   {
      String mensagem = ClasseExemplo.mostrarMensagem();  // Errado! Você precisa de uma instância para acessar este método.
      String mensagem = new ClasseExemplo().mostrarMensagem();  // Assim funciona!
      System.out.println(mensagem);

      int somaValores = ClasseExemplo.somarValores(1, 2); // Assim funciona! Método estático é acessado só pela assinatura da classe.
      int somaValores = new ClasseExemplo().somarValores(1, 2);  // Errado!
      System.out.println(somaValores);
   }
}

Você pode acessar os métodos estáticos sem necessitar de uma instância da classe, mas os métodos que não são estáticos precisam dela, por exemplo!

Gustavokt

É que eu acho que pegar a classe do main e o main para explicar o static pode acabar confundindo, mas você que sabe :wink:

Gustavokt

Nicolas Fernandes:
Gustavokt:
evertonsilvagomesjava:

LOL deselegante pq? Vc vai acessar metodos de instancia como entao? magia negra?

Deselegante porque do meu ponto de vista, a classe que contém o main deveria ter variáveis e/ou métodos que eventualmente interferissem com a execução do método main(). Faz sentido eu criar uma instância da classe que contém o main só para usar o método dele? Será que você não poderia ter criado uma classe e encapsular essa lógica?

public class ClasseQueContemAlgumaLogica{
   public Resultado facaAlgumaCoisa()...
}

...

public class Main  
{  
   public static void main(String[] args)  
   {  
      ClasseQueContemAlgumaLogica instancia = new ClasseQueContemAlgumaLogica();
      Resultado r = instancia.facaAlgumaCoisa();
      ...
   }  
}

É a mesma coisa quando falam de orientação a objeto em java. Você pode escrever um programa inteiro de forma procedural em java. Se dá para usar orientação a objeto, porque não usar? :wink:

Mas isso é do meu ponto de vista. De fato, é possível fazer o que o Nicolas disse, mas eu não recomendaria (pelo menos nesse caso).

Everton, você está começando a programar em java ou isso foi apenas uma dúvida?

A questão não é falar sobre encapsulamento, sobre OO ou coisas similares. Nosso amigo queria saber só como faria para acessar, dentro do Main, um método não-estático.

xray_495
As classes que você criar não devem conter a palavra reservada static, mas sim os seus métodos. Você pode definir quais métodos que você queira que sejam chamados sem existir uma instância da classe. Um exemplo disso é o padrão Singleton, onde você criar um método estático para pegar a instância da classe, e o resto não-estático.

public class ClasseExemplo
{
   public void mostrarMensagem()
   {
      String mensagem = "Esta é a minha mensagem.";
      return mensagem;
   }
   pubic static int somarValores(int primeiroValor, int segundoValor)
   {
      int somaValores = primeiroValor + segundoValor;
      return somaValores;
   }
}

Para usar a classe…

public class Main
{
   public static void main(String[] args)
   {
      String mensagem = ClasseExemplo.mostrarMensagem();  // Errado! Você precisa de uma instância para acessar este método.
      String mensagem = new ClasseExemplo().mostrarMensagem();  // Assim funciona!
      System.out.println(mensagem);

      int somaValores = ClasseExemplo.somarValores(1, 2); // Assim funciona! Método estático é acessado só pela assinatura da classe.
      int somaValores = new ClasseExemplo().somarValores(1, 2);  // Errado!
      System.out.println(somaValores);
   }
}

Você pode acessar os métodos estáticos sem necessitar de uma instância da classe, mas os métodos que não são estáticos precisam dela, por exemplo!

Era isso que eu queria dizer, que dava para usar um exemplo melhor do que usar a classe do main, ainda mais se vai explicar para outra pessoa.

X

agora s consegui entender =] vlw galera

Criado 12 de setembro de 2010
Ultima resposta 14 de set. de 2010
Respostas 10
Participantes 4