Alguém poderia explicar de forma simples para um iniciante na programação para que servem os métodos em java?
Mais especificamente gostaria de saber o que são métodos public
, private
, protected
e static
.
Alguém poderia explicar de forma simples para um iniciante na programação para que servem os métodos em java?
Mais especificamente gostaria de saber o que são métodos public
, private
, protected
e static
.
Explicando os tipos de métodos existentes na programação OO. Quando definimos um objeto num programa orientado a objetos, implementamos todo o comportamento desse objeto em um ou mais métodos . Um método em Java é equivalente a uma função, subrotina ou procedimento em outras linguagens de programação. (Ref.
https://www.devmedia.com.br/metodos/7348)
Essas palavrinhas na frente do método são chamados de modificadores de acesso:
public
Você tem acesso fora e dentro do escopo da instância dessa classe.
private
O acesso é somente dentro do escopo da classe, ou seja, só pode ser acessado internamento na classe.
protected
Bem parecido com private
só que além do escopo atual da classe pode ser acessado por classes que fizeram herança
static
Método que é acessado sem uma instância de uma classe.
Eu acho que são conceitos bem básicos, vamos deixar o pessoal povoar melhor essa resposta, mas, basicamente é isso.
Independente do Java, o que você sabe sobre programação orientada a objetos?
Basicamente, na programação orientada a objetos, tentamos moldar as entidades que compõe nosso programa tomando inspiração no mundo real.
No mundo real os seres humanos habitam cidades e se reúnem em famílias; temos os “da Silva”, os “dos Santos”, etc… Se fossemos moldar uma certa família em Java, poderíamos ter o seguinte:
package saopaulo;
class DaSilva {
}
Algumas famílias possuem tradições fortes. Imaginemos que nessa nossa família todos são médicos, só que com diferentes especialidades.
package saopaulo;
class DaSilva {
String especialidade;
}
Aqui já podemos ter diferentes individuos.
DaSilva joao = new DaSilva();
joao.especialidade = "Oftalmologista";
DaSilva paulo = new DaSilva();
paulo.especialidade = "Pediatra";
Como profissionais, os membros dessa família podem executar ações, em outras palavras, eles possuem comportamento.
package saopaulo;
class DaSilva {
String especialidade;
public void atenderPaciente() {
System.out.println("Atendendo paciente");
}
}
Como médicos, eles não se recusam a atender nenhum paciente. Qualquer um pode solicitar uma consulta. Por isso este comportamento é public.
Apesar de toda a influência desta família, ela possui uma limitação. Por algum motivo (marcas do passado) seus membros não podem caminhar fora da cidade.
package saopaulo;
class DaSilva {
String especialidade;
public void atenderPaciente() {
System.out.println("Atendendo paciente");
}
void caminharPelaCidade() {
System.out.println("Caminhando pela cidade");
}
}
A cidade aqui é representada pelo pacote. Quando o método ou campo não possui modificador de acesso, quer dizer que aquele recurso só pode ser acessado de dentro do mesmo pacote.
Com tudo isso, há coisas que os membros dessa família podem fazer que não são compartilhadas com qualquer um. Existem coisas que só podemos fazer entre membros da família.
Um exemplo é o dinheiro, apenas membros do nosso núcleo famíliar podem mexer nele.
package saopaulo;
class DaSilva {
String especialidade;
public void atenderPaciente() {
System.out.println("Atendendo paciente");
}
void caminharPelaCidade() {
System.out.println("Caminhando pela cidade");
}
protected void gastarDinheiro() {
System.out.println("Gastando dinheiro");
}
}
Ninguém fora desse núcleo pode gastar esse dinheiro. Mas se um dia o João da Silva se casar com a Maria dos Santos e eles tiverem um filho, este filho poderá ter acesso à esse recurso.
class DaSilvaESantos extends DaSilva {}
DaSilvaESantos joaoJr = new DaSilvaESantos();
joaoJr.gastarDinheiro(); // protected pode ser acessado pelos herdeiros
Dentro dessa família também existem segredos. Seus individuos fazem coisas quando nínguém mais está olhando, nínguém pode saber o que é.
Eu não falei antes, mas esta família combate o crime organizado da cidade. Eu não sei como eles fazem isso, mas no dia a dia, a cada paciente atendido, a cada vez que caminham pela cidade e a cada vez que eles gastam dinheiro, eles estão secretamente fazendo algo pelo bem maior.
package saopaulo;
class DaSilva {
String especialidade;
public void atenderPaciente() {
combaterOCrime();
System.out.println("Atendendo paciente");
}
protected void gastarDinheiro() {
combaterOCrime();
System.out.println("Gastando dinheiro");
}
void caminharPelaCidade() {
combaterOCrime();
System.out.println("Caminhando pela cidade");
}
private void combaterOCrime() {
System.out.println("Combatendo o crime!!!");
}
}
Quando digo que ninguém pode saber, é sério. Nem mesmo seus herdeiros tem conhecimento dessa habilidade, embora ele também estejam contribuindo para o bem maior sem ter consciencia disso. Métodos privados não são herdados.
Em resumo e respondendo a sua pergunta:
Métodos em Java representam o comportamento dos nossos objetos, as coisas que eles podem fazer.
Já os modificadores de acesso determinam quem pode acessar o comportamento desses objetos.
Qualquer um pode invocar a habilidade que essa família tem de atender paciente, por isso é public.
Apenas quando estão dentro da cidade deles é que eles podem caminhar, por isso não tem modificador.
Apenas herdeiros tem acesso à habilidade de gastar o dinheiro, por isso é protected.
E apenas eles mesmos tem acesso à habilidade de lutar contra o crime e eles fazem isso de forma escondida, por isso é private.
Pra encerrar, métodos estáticos são métodos que não dependem de um objeto para serem executados.
Em situações normais, vc tem que instanciar uma classe, ou seja, criar um novo individuo dessa família, antes de poder ter acesso à tudo o que ele pode fazer.
Mas com método estático a instanciação não é necessária.
package saopaulo;
class DaSilva {
/* ... */
static void umComportamentoQualquer() { // sem criatividade aqui ^^
System.out.println("Fazendo coisas legais");
}
}
Com isso, vc poderia invocar este método assim:
// Viu? Sem usar o new, chamando direto da classe
DaSilva.umComportamentoQualquer();
Você pode combinar os modificares de acesso com o static. Sempre o que o fizer, a convenção diz que eles devem vir antes do static. Assim:
public static void metodoUm() {}
protected static int metodoDois() {}
private static String metodoTres() {}
E é isso! Espero sinceramente não te complicar ainda mais.