Duvida a respeito do Static

Olá galera tudo bem? eu esto com um duvida a respeito do metodo static. Eu já li sobre ele aqui no forum, mas ainda não entendi muito bem. eu tenho um programa aqui aonde que voces poderiam me explicar ele um pouco melhor. Abraço a todos

 import javax.swing.JOptionPane;
    public class Ex1
    {
       public static void main(String[] args) {
             
          
           int quantidadeFuncionarios = 0;
          float salarioFuncionario = 0;
           float totalSalarios = 0;
           float mediaSalarial = 0;
         //variável contadora para laço
         int contadora = 0;

         quantidadeFuncionarios = Integer.parseInt(JOptionPane.showInputDialog(null,"Digite a quantidade de funcionários","Número de funcionários",JOptionPane.QUESTION_MESSAGE));

         while (contadora < quantidadeFuncionarios)
         {
           contadora++;
            salarioFuncionario = Float.parseFloat(JOptionPane.showInputDialog(null,"Digite o salário do funcionário","Salário",JOptionPane.QUESTION_MESSAGE));
           totalSalarios = totalSalarios + salarioFuncionario;

        }

             saldo(totalSalarios);   // No caso se eu tirar o static do metodo Saldo da erro nesta linha aqui. eu gostaria de entender um pouco melhor sobre ele. 
            totalSalarios = saldo(totalSalarios);
            System.out.println("TOTAL SALARIOS"+ totalSalarios);
         mediaSalarial = totalSalarios / quantidadeFuncionarios;
         System.out.println("Média Salarial = " + mediaSalarial);

        System.exit(0);
       }

       public  float saldo(float x)  // Aqui no caso se eu acrescentar o static o programa funciona bem, caso eu tire ele dá erro. porque isso?
       {

           return x;
       }
    }

[quote=halm]Olá galera tudo bem? eu esto com um duvida a respeito do metodo static. Eu já li sobre ele aqui no forum, mas ainda não entendi muito bem. eu tenho um programa aqui aonde que voces poderiam me explicar ele um pouco melhor. Abraço a todos

[code]
import javax.swing.JOptionPane;
public class Ex1
{
public static void main(String[] args) {

       int quantidadeFuncionarios = 0;
      float salarioFuncionario = 0;
       float totalSalarios = 0;
       float mediaSalarial = 0;
     //variável contadora para laço
     int contadora = 0;

     quantidadeFuncionarios = Integer.parseInt(JOptionPane.showInputDialog(null,"Digite a quantidade de funcionários","Número de funcionários",JOptionPane.QUESTION_MESSAGE));

     while (contadora < quantidadeFuncionarios)
     {
       contadora++;
        salarioFuncionario = Float.parseFloat(JOptionPane.showInputDialog(null,"Digite o salário do funcionário","Salário",JOptionPane.QUESTION_MESSAGE));
       totalSalarios = totalSalarios + salarioFuncionario;

    }

         saldo(totalSalarios);   // No caso se eu tirar o static do metodo Saldo da erro nesta linha aqui. eu gostaria de entender um pouco melhor sobre ele. 
        totalSalarios = saldo(totalSalarios);
        System.out.println("TOTAL SALARIOS"+ totalSalarios);
     mediaSalarial = totalSalarios / quantidadeFuncionarios;
     System.out.println("Média Salarial = " + mediaSalarial);

    System.exit(0);
   }

   public  float saldo(float x)  // Aqui no caso se eu acrescentar o static o programa funciona bem, caso eu tire ele dá erro. porque isso?
   {

       return x;
   }
}

[/code][/quote]

O que acontece é o segunte seu “método main” é um “método static” um método ou um bloco estático so pode acessar “membros staticos” por isso quando vc tira o “static” do seu método saldo não funciona.

o que vc realmente quer saber!?

esse programa recebe a quantidade de funcionarios, o salario deles e devolve a média de salários ou algo do tipo…

métodos estáticos referem-se a propria classe, e não a determinada instância.

ah, ta! entendi

vc pode fazer duas coisas:

[code]
public class Testeee {

public static void main(String[] args) {
	bla();
}

public static void bla() {
	System.out.println("bla");
}

}

//ou

public class Testeee {

public static void main(String[] args) {
	Testeee t = new Testeee();
	t.bla();
}

public void bla() {
	System.out.println("bla");
}

}[/code]

:wink:

O que você não entendeu sobre o ‘static’ ?

Veja esse tutorial da Sun sobre o assunto:
http://java.sun.com/docs/books/tutorial/java/javaOO/classvars.html

Pessoa mas de acordo com o meu exemplo e que nem o nosso colega falou que eu não posso acessar o main porque ele é statico. Mas digamos que eu retiro o static do main e coloco um metodo sem o static tambem funcionaria? abraço

cara, o main é um método especial. Ele é o ponto de partida do seu programa, a thread principal.

a questão é que métodos estáticos referem-se a própria classe, e não a instância da classe. Logo um método estático é independente de instâncias.
Por isso você não pode acessar dentro de um método estático, propriedades ou comportamentos que dependem do estado em que o objeto se encontra.

por isso você ou acessa um método estático neste caso, ou instancia um objeto para ter acesso ao metodo.

Se você retira o “static” do main o programa não roda.

Você teria que instanciar a classe e depois colocar outro método static void main.

Se você tirar o static do método, você precisará instanciar a classe para poder usar aquele método. No caso de uma máquina de calcular, o melhor seria deixar todos os métodos estáticos. Pois senão você teria que criar várias instâncias do mesmo objetos várias vezes. E isso nem sempre é bom negócio, pois consome memória.

Lembre-se que Java é orientado a objetos.

Métodos estáticos são métodos pertinentes a determinada classe.

Métodos não-estáticos (ou ‘de instância’) são métodos pertinentes a determinada instância de uma classe.

O método main é um método especial para a JVM e precisa ser, necessariamente, estático se você pretende usá-lo como ponto de partida para o seu programa.

Isso traz a seguinte implicação: eu só posso acessar qualquer método a partir do main se:

  1. O método que eu quero acessar também for estático.
    Ou
  2. O método não é estático e eu tenho uma instância para usar como forma de acesso ao método. Por exemplo:
System.exit(0);

Esse acima é um método estático da classe System, portanto não é preciso ter uma instância da classe para acessar o método.

String s = "       oi          ".trim();

Esse método (trim()) não é estático. É um método de instância da classe String. Portanto, para acessá-lo eu preciso de uma instância de String (no caso o que está entre aspas duplas).