Dúvida sobre o main e métodos statics

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á.

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

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!");
   }
}

[quote=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!"); } } [/quote]

Isso não seria um pouco “deselegante”?

[quote=Gustavokt][quote=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!"); } } [/quote]

Isso não seria um pouco “deselegante”?[/quote]

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

[quote=evertonsilvagomesjava]

LOL deselegante pq? Vc vai acessar metodos de instancia como entao? magia negra?[/quote]

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 é o padrão de projeto a ser usado, e sim explicar para o amigo como usar métodos de instancia, staticos e etc.

[quote=Gustavokt][quote=evertonsilvagomesjava]

LOL deselegante pq? Vc vai acessar metodos de instancia como entao? magia negra?[/quote]

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?
[/quote]

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!

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

[quote=Nicolas Fernandes][quote=Gustavokt][quote=evertonsilvagomesjava]

LOL deselegante pq? Vc vai acessar metodos de instancia como entao? magia negra?[/quote]

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?
[/quote]

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![/quote]

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.

agora s consegui entender =] vlw galera