[MÚSICA] Meu nome é Eduardo Guerra e você está aqui no curso de programação orientada a objetos com Java. Hoje vamos estar falando sobre métodos e atributos estáticos, tá? Vamos descobrir o que que é isso. O que que é método ou atributo estático. E vamos aprender a diferenciar eles daqueles é, que a gente já aprendeu que são os métodos e atributos de instância. E aà vamos entender quando que tipo deve ser utilizado e quando que outro tipo deve ser utilizado. Nós temos diferentes tipos de informações que podemos guardar num software, tá? Se a gente pensar numa classe, tem informações que dizem respeito a todos os objetos de uma classe e tem informações que dizem respeito a objeto especÃfico. Então se a gente pensar aqui por exemplo na classe gato, né, se a gente for pensar assim o número total de gatos, certo? É uma informação que é pertinente à classe Gato, mas que não diz respeito a gato especÃfico. Se eu tiver falando por exemplo da cor do gato, isso aà é uma informação de gato e não diz respeito a todos os gatos. Então, a partir desse exemplo, a gente pode ver que tem diferentes tipos de informação que você pode querer armazenar. Essas informações que são da classe como todo a gente chama de informações estáticas, variáveis estáticas, porque não varia de objeto pra objeto. Então, a gente está vendo aqui no exemplo de código que eu criei aqui uma variável estática. Pra isso eu coloco o modificador static nessa variável. Então o nome da variável é totalGatos e você pode ver que no construtor eu somo 1 nessa variável. O que que significa? Que cada gato que for criado vai estar incrementando essa variável e ela vale pra todos os gatos. Então a partir de qualquer objeto que eu tentar acessar essa variável totalGatos, ele vai estar acessando a mesma variável. Por quê? Porque ela estática, ela é uma variável, uma variável da classe, não é uma variável de objeto. Ela tanto é uma variável da classe que eu posso estar acessando a variável sem necessariamente estar, ter objeto daquela classe. Então eu posso simplesmente pegar por exemplo o nome da classe Gato.totalGatos e obter aquele valor. Eu não preciso de objeto gato pra estar acessando aquele valor. Agora a gente tem que tomar muito cuidado com esse tipo de variável. Nossa senhora, o que que é isso? Toma muito cuidado quando você for usar essa variável. Pra quem veio da programação estruturada sabe que tem aà terror, que são as chamadas variáveis globais, aquelas variáveis que você coloca no software e você acessa ela de vários lugares diferentes. E aà você nunca sabe qual que é o valor daquela variável, se alguém modificou, se de repente alguém utiliza aquela variável, deixa lixo ali. E aà você vai acessar de outro lugar, dá problema e você não sabe por que que aquela variável estava com aquele valor. Então realmente utilização de variável global na programação estruturada é assim verdadeiro pesadelo. Talvez alguns devam estar pensando aÃ: opa, descobri jeito de criar uma variável global na programação orientada a objetos, porque a variável estática é basicamente isso. A partir do nome da classe, né, como a gente viu aqui nesse slide, né, por exemplo o Gato.totalGatos. A gente acessa de qualquer lugar. Só que se você começar a utilizar isso pra fazer variável global, vai acabar assim ó. O mundo aà chamas, né, com o seu software dando problema e você não sabendo. Então a gente tem que tomar muito cuidado com as variáveis estáticas e utilizar ela para informações dentro do escopo de uma classe pertinentes a essa classe e não pra ficar criando a variável global dentro de contexto orientado a objetos, tá? Então estou ensinado pra vocês as variáveis estáticas, mas muito cuidado na hora de utilizar. Ela tem a sua utilização e você não deve ficar utilizando esse tipo de recurso da linguagem pra criação de variáveis globais. Os métodos estáticos são muito parecidos com as funções que a gente tinha na programação estruturada, tá? Muitas vezes eles são utilizados pra métodos auxiliares, como por exemplo à s vezes algum cálculo, né, então a gente tem o exemplo, por exemplo o cálculo de raiz quadrada, né? Então esses métodos estáticos são muito similares à s funções. Mais uma vez a gente tem que tomar muito cuidado para a gente também não estar utilizando uma linguagem orientada a objetos, mas estar fazendo design estruturado. Então assim é, a gente tem que prestar atenção na forma que a gente estrutura, que a gente modela software orientado a objetos pra gente não criar bando de método estático, certo? E fazer o sistema todo dessa forma. A gente vai estar utilizando Java, que é uma linguagem orientada a objetos, mas vai estar longe de estar fazendo sistema com a modelagem orientada a objetos. Então exemplo pra você ver como que é, seria pensamento estruturado e como seria pensamento orientado a objetos, por exemplo enquanto com pensamento estruturado eu sempre estaria passando, digamos assim, o que eu quero modificar como parâmetro. Então por exemplo, se eu quisesse acelerar carro, eu chamaria a função acelerar e estaria passando o carro como parâmetro, tá? Enquanto na orientação a objetos o acelerar já seria uma ação do carro, seria método do carro. Então já faria muito mais sentido carro.acelerar, certo? Então a gente tem que também, mais uma vez, eu ensinei pra vocês as variáveis estáticas. Tô ensinando os métodos estáticos. Mas também temos que utilizar eles realmente pra aquele tipo de execução auxiliar, né? Pra aquela biblioteca de funções normalmente que recebe uma coisa e retorna outra coisa. Muito utilizado pra cálculo, pra processamento de strings, né? Normalmente pra execuções simples, tá? E procurar não estar utilizando esses métodos estáticos quando for mais adequado a utilização da orientação a objetos, né, dos métodos de instância. Então sempre desconfia quando você passar objeto como parâmetro pra método, principalmente se esse método for estático, se de repente aquele método não era para estar naquele objeto. Uma última dica aqui né: se você está utilizando métodos estáticos e você não quer ficar repetindo nome da classe, né? Então você pode usar o import static, certo? Então por exemplo a gente tem no Java a classe Math, que tem uma série de métodos estáticos de cálculo. Calcular o máximo, calcular raiz quadrada, seno, cosseno. Então se você não quer, toda vez que você for chamar esse método, utilizar Math. o nome do método, você pode usar o import static e aà você não precisa mais referenciar o nome da classe na hora de utilizar aqueles métodos. Isso vale tanto pra métodos estáticos, quanto pra variáveis estáticas, certo? Então eu espero que com isso vocês tenham compreendido melhor o que é método estático, o que que é atributo estático, as situações que isso vai ser utilizado. Espero que com os exemplos de códigos também acabe ficando mais claro, tá? E acredito que todo mundo agora já sabe a diferença entre método e uma variável estática dos métodos e as variáveis de instância. Muito obrigado. Até a próxima aula.