última dúvida sobre static

10 respostas
gustavobs

E aí pessoal, seguinte, já ali o artigo daqui, apostila da caelum mas ainda me restou uma dúvida,

a parte que uma variavel ou metodo static se refere a classe e nao ao objeto tá tranquilo… mas o lance de so poder instanciar uma vez a classe é que fiquei em duvida, se alguem poder me ajudar, valeu!

10 Respostas

H

Pense na seguinte analogia.

Você Gustavo nasceu, ou seja, foi inicializado, você pode nascer de novo(ser novamente inicializado).

E a mesma coisa. (risos)

Essa analogia foi podre mas você vai entender.

gustavobs

mas nao entendi bem ainda qual a condição para que isto funcione assim

basta ter uma variavel static, um metodos static?

H

Você pode ter um atributo ou método estático.

Quando falamos em um método ou atributo estático,
estamos falando de podermos acessar de qualquer lugar
e hora na aplicação.

Por isso eu dei o exemplo de você ser inicializado, pois
você só pode inic inicializar uma única vez.

classe Pessoa {
    public static String dataNascimento = "03/03/1978";
}

classe UsaPessoa {
    public static void main(String [] args) {
        System.out.println("Data = " + Pessoa.dataNascimento)
    }
}
Em momento nenhum você precisou fazer new Pessoa, para consigar imprimir a data de nascimento de uma pessoa.

Esse é um dos beneficios dos metodos e atributos estáticos,
mas pode ocasionar em um grande gasto de mémoria
se usado em demasia.

Espero ter esclarecido mas um pouco.

B

Não entendi muito bem o que você tá querendo dizer, mas atributos static são da classe.

Exemplo:

public class Pessoa
{
   private String nome;
   private static String sobrenome;

   public Pessoa(String nome, String sobrenome)
   {
      this.nome = nome;
      this.sobrenome = sobrenome;
   }

   @Override
   public String toString()
   {
      return nome + " " + sobrenome;
   }

   public static void main(String[] args)
   {
      Pessoa joao = new Pessoa("João", "da Silva");
      Pessoa maria = new Pessoa("Maria", "dos Santos");

      System.out.println(joao);
      System.out.println(maria);

     // imprime:
     // João dos Santos
     // Maria dos Santos
   }
}

Se você souber explicar por quê ele imprime João dos Santos em vez de João da Silva, então terá entendido o static.

gustavobs

ah acho que entendi… na verdade “nao poder instaciar” se refere ao fato de que as variaveis e metodos estaticas so podem pertecer a classe e nao a objetos…

ate poderia instanciar Pessoa varias vezes, mas seus atributos e metodos estaticos não existiriam, então a Pessoa nao existiria de fato, certo?

gustavobs

Bruno Laturner:
Não entendi muito bem o que você tá querendo dizer, mas atributos static são da classe.

Exemplo:

public class Pessoa
{
   private String nome;
   private static String sobrenome;

   public Pessoa(String nome, String sobrenome)
   {
      this.nome = nome;
      this.sobrenome = sobrenome;
   }

   @Override
   public String toString()
   {
      return nome + " " + sobrenome;
   }

   public static void main(String[] args)
   {
      Pessoa joao = new Pessoa("João", "da Silva");
      Pessoa maria = new Pessoa("Maria", "dos Santos");

      System.out.println(joao);
      System.out.println(maria);

     // imprime:
     // João dos Santos
     // Maria dos Santos
   }
}

Se você souber explicar por quê ele imprime João dos Santos em vez de João da Silva, então terá entendido o static.

entendi essa parte tranquilo, o sobrenome é uma variavel unica para todos objetos, mas a minha duvida é sobre o fato de eu ter lido que a classe nao pode ser instaciada mais de uma vez, o que me deixa confuso, como no teu exemplo a classe foi instaciada 2x, ou sera q é outro fator que nao permite instanciar mais de uma vez uma classe?

B

Uma classe pode ser instanciada quantas quiser, até que a memória do computador acabe.

O que pode acontecer é o que existe com o modificador final

Uma variável marcada como final só pode ser atribuído um valor uma única vez, se tornando uma constante. No caso de variáveis de objetos marcados como final, eles só podem receber uma referencia uma única vez.

Por conseguinte, existe a junção de static e final:

Uma variável marcada static final só pode ser atribuída uma única vez na classe inteira.

Aliás, falando nisso, qualquer atributo de uma interface é automaticamente public static final, sempre serão constantes.

gustavobs

ah agora ficou mais claro :wink:
valeu!!

wswillianss

sendo static, signfica que para acessa-la não exige que seja instanciada(o). Exemplo de métodos static e pode ser chamado de qualquer classe.

exemplo:

public class ConnectionFactory {
	public static Connection getConnection()throws SQLException{
		try{
			Class.forName("com.mysql.jdbc.Driver");
			return DriverManager.getConnection("jdbc:mysql://localhost/test","root","");
		}catch(ClassNotFoundException e){
			throw new SQLException(e.getMessage());
		}
	}
}

veja que o método é static

vamos vê-lo em ação nesta classe abaixo:

public class ContatoDAO {
	private Connection connection;

	public ContatoDAO() throws SQLException {
		this.connection = ConnectionFactory.getConnection();
	}

se não fosse static seria assim:

public class ContatoDAO {
	private Connection connection;
                ConnectionFactory factory = new ConnectionFactory();

	public ContatoDAO() throws SQLException {
		this.connection = factory.getConnection();
	}

com isso toda classe que fize-se uso da ConnectionFactory, seria obrigatório instancia-la para poder utiliza-la.

Sendo o método getConnection() static da classe ConnectionFactory, isso não seria necessário, pois se tratando de método estático pode ser chamado diretamente no método construtor da classe que vai fazer uso da ConnectionFacrtory.

Isso não é um tutorial… mas dar para entender mais ou menos a questão proposta.

Abraços!

Ataxexe

Um exemplo bizarro para que você possa ver como o método static não depende da instância:

JOptionPane pane = null; pane.showMessageDialog(null, "Sou um método estático, não dependo da instância!");

Criado 30 de outubro de 2008
Ultima resposta 30 de out. de 2008
Respostas 10
Participantes 5