[MÚSICA] Esse é o curso de Orientação a Objetos com Java, meu nome é Eduardo Guerra, e hoje vamos estar falando aí sobre, modificadores de acesso. Que que é isso? Os modificadores de acesso permitem que você controle o acesso, aos pedacinhos de uma classe a método, a atributo para que ninguém vá lá e modifique aquilo, ou acesse aquilo de uma forma que você não gostaria, que você não queria, então vamos entender porque que isso é necessário e entender como que isso funciona, quais são os modificadores de acesso Java. Então, imagina o seguinte: aquela classe Carro lá que a gente desenvolveu você vai lá, cria carro e coloca 100 na velocidade dele, e carro aparece do nada com 100, o que seria correto, seria você acelerar ou frear o carro para estar aumentado a velocidade dele gradativamente, então essa ideia de você ir lá e simplesmente colocar valor na velocidade, por mais que a classe lá que a gente criou, permita isso, isso não seria o correto, então a ideia é o quê? É que eu chegue e fale assim: olha esse atributo velocidade aqui, ele só pode ser acessado dentro da minha classe, fora da minha classe eu quero que as pessoas usem o método acelerar e frear. E aí sim, dentro da minha classe o método acelerar, ele vai ter uma lógica, ele vai ter algoritmo para aumentar essa velocidade, assim como o método frear, ele também vai ter algoritmo para diminuir essa velocidade, não quero que ninguém vá lá diretamente e fique modificando as coisas. Os modificadores de acesso, eles tem Justamente esse papel dentro de sistema orientado a objetos, ele diz quem que pode estar acessando determinado membro de uma classe, então eu posso falar assim: olha, esse atributo ele só é acessível dentro da classe, ou para a subclasse, ou para a classe do pacote. E a gente vai ver que Java, existem quatro tipos diferentes de modificadores de acesso, inclusive deles é quando você não coloca nada, então dessa forma a gente vai permitir por exemplo que uma classe, vamos supor método, ou atributo, ela possa ser acessado pela subclasse e não seja acessível por exemplo a outras classes, pode ser que eu tenha atributo que eu queira permitir somente para subclasses e não para outras classes. O primeiro tipo que a gente tem aí é o private, ou seja o privado que quando membro tem esse tipo de controle de acesso, ele só pode ser acessado por membros da própria classe. Seguida o oposto desse seria o public, são aqueles que qualquer pode acessar, então por exemplo, se eu tiver uma variável do tipo private isso significa que, só métodos dentro daquela classe, vão poder acessar essa variável, por outro lado se essa variável for public, qualquer outra classe pode ir lá e acessar ela. Agora a gente tem o que seria aí meio termo, que é o protected, o protected, somente subclasses, obviamente inclui ali dentro da própria classe, mas fora da classe, somente a subclasse e classes do mesmo pacote que podem estar acessando. E para finalizar, o que a gente usou até agora, até sem saber, que seria o default, que é quando a gente não coloca nada, então ao invés de colocar "private int variável" ou "public int variável" se a gente não coloca nada, não coloca "int variável" seria esse tipo default ta? O default não é o público, o default ele só torna aquele membro acessível para a classes do mesmo pacote. Então assim, a gente entendeu os tipos que têm private, bloqueia tudo, só dentro da classe que pode; public, qualquer pode; protected é só subclasse e classe do mesmo pacote, se eu não colocar nada é só dentro do mesmo pacote. Cuidado que a gente precisa ter e que é muito importante é de não expor além do necessário, os membros da minha classe, e eu vou explicar porquê que isso pode ser perigoso. Então, existem algumas variáveis que só podem ser acessadas de certas formas, exemplo que a gente viu, foi a variável velocidade, eu não posso simplesmente ir lá e colocar valor genérico, eu tenho que acelerar ou frear o carro para modificar a velocidade dele, de repente se eu estou por exemplo criando uma estrutura de dados, uma fila, ou uma pilha que eu tenho que colocar os objetos ordenados de uma certa forma, por exemplo dentro de array, eu não quero que o cara vá lá e possa modificar aquele array de qualquer maneira, eu quero que meus métodos trabalhem com aquele array de uma forma controlada, e de repente, não é só uma variável, conjunto de variáveis dentro da classe, que quando eu fizer uma determinada ação elas vão mudar de forma a ficar consistente. E se de repente eu pego uma variável dessa e deixo ela pública, ou de uma forma que outras classes podem estar acessando, isso daí vai expor esse dado aí de uma forma que a pessoa pode ir lá e modificar do jeito que ela quiser, e isso pode causar uma inconsistência dentro da classe. Eu projeto que participei, eu vi isso acontecer. A pessoa criou a classe com seus atributos e colocou métodos ali que acessavam, só que deixou os atributos abertos, o que aconteceu? Foi uma outra pessoa, precisava modificar atributo, e ao invés de usar o método que modificava aquele atributo de uma forma válida, e deixava todos os outros ali consistentes, ele foi e alterou direto, o que aconteceu? Deu bug no sistema, e foi bug extremamente difícil de ser encontrado, tudo é questão de a pessoa ter exposto mais do que deveria. Uma outra questão é que a gente tem que lembrar que as subclasses também podem estar modificando. Então a gente lembra que como a gente viu na aula de herança, a subclasse ela tem que prover aqueles mesmos serviços, ela tem que ter aquele mesmo contrato da superclasse, e aí também, dependendo de como for, eu não posso sair expondo todas as variáveis, para que a subclasse também possa fazer uma festa, e ás vezes quebrar determinadas funcionalidades da subclasse. Então da mesma forma a exposição pública, a exposição para subclasse pode gerar esse mesmo problema, e ainda tem uma outra questão, que toda vez que você deixa alguma coisa pública e alguém vai lá e acessa, aquela característica se torna mais difícil de ser alterada. Então, por exemplo, imagina que você tem uma classe, e você tem array dentro dessa classe, se de repente você quer que esse array seja trocado por uma lista, se você tem uma outra classe acessando direto aquele array você não vai ter que ir mais alterar só sua classe, você vai alterar sua classe e a outra, porquê quanto mais classes tiverem acessando, mais difícil vai ser. Então mais uma vez, a gente tem que tomar todo cuidado para expor só aquilo que realmente é necessário, aquelas coisas que são do funcionamento interno da classe, a gente não precisa deixar público, a gente pode deixar privado ou protegido, no caso da gente precisar das subclasses estarem acessando depois. Bom, eu acredito que se você está assistindo esse curso, você é programador então deve ter criado aí, alguns programas, e as vezes você vai lá e você fala assim: "Poxa preciso de tal coisa." Aí você pega uma classe, começa a ver ali que métodos que ela tem, que atributos ela tem, e de repente você fala: "Opa! Atributo público aqui, deixa eu alterar esse negócio que é o que eu estou precisando, Opa! Método aqui, deixa eu invocar isso para saber o que está acontecendo." Então, se o cara vê que ele pode alterar aquela variável, que é aquele resultado que ele quer, ele vai lá e vai alterar direto, ele não está nem aí se aquilo vai gerar uma inconsistência, se vai gerar bug depois, ele está atrás do objetivo dele, ele não conhece a sua classe por dentro para saber que aquela alteração direta vai ser inválida. Então o que posso dizer é, não dá essa chance para o cara. Bloqueia aquelas coisas que ele não pode acessar através desses modificadores de acesso. Expõe só aquilo que é necessário. Com isso eu apresentei para vocês na aula, os modificadores de acesso, mostrei aí alguns cenários que eles são necessários e como utilizar ele aí para estar acessando, para estar imitando e controlando o acesso aos vários membros aí, de uma classe. Muito obrigado. Até a próxima aula. [MÚSICA]