Estou começando a estudar métodos abstrados e gostaria de saber qual sua utilização alguém tem um exemplo bem simples e pode me falar onde ele é mais usado…?
Olá amigo.
Uma classe abstrata não pode ser instanciada.
Já um método abstrato, como você perguntou, é definido assim:
public abstract double nomeDoMetodo();
Isso significará que toda subclasse herdada desta classe que está essa linha será OBRIGADA a ter um método ‘nomeDoMetodo’ retornando double.
Classes e métodos abstratos tem tudo a ver com as interfaces.
Abraço.
Valew cara mais isso é muito utilizado…???
Em qual situação vc recomendaria usar métodos abstratos…?
Sim, é bastante utilizado.
Perceba nesta situação:
Suponha que temos uma classe chamada EscalasDeTemperatura.
E que portanto, são subclasses: Celsius, Fahrenheit e Kelvin
Não faz sentido termos um objeto da superclasse ‘EscalasDeTemperatura’. Então ela é abstrata e portanto não poderá ser instanciada.
Supondo que queremos um método específico que tenha OBRIGAÇÃO de estar nas três escalas mas difere em algo em cada uma, inserimos na classe-mãe ‘EscalasDeTemperatura’ a linha:
public abstract double nomeDoMetodo();
Isso OBRIGARÁ às classes de escalas, que herdaram da classe ‘EscalasDeTemperatura’, a ter este método.
Agora avançando um pouco: suponhamos que nós queremos criar nas classes Fahrenheit e Kelvin um método converteTemperaturaEmCelsius() que irá converter tal temperatura em Celsius, mas queremos fazer ter certeza que essas classes tenham esse método, aí estará a INTERFACE que obrigará essas classes a terem tal método. Ou melhor, ‘implementaríamos’ uma interface. Herança usa extends, certo? Interface usa ‘implements’. Lembrando que usamos interface pois não poderíamos ter colocado um método abstrato na superclasse já que isso obrigaria à classe Celsius a ter o método ‘converteTemperaturaEmCelsius’ também, o que não tem lógica pois se a temperatura está na escala Celsius não precisa converter nada Celsius.
Deu pra ter uma noção ainda não começei a estudar interfaces, vão começar já já qualquer dúvida eu coloco ai obrigado cara!
Beleza!
Depois dá uma relida no meu post acima que editei e deixei uns pontos mais claros.
Abraço.
Olá
Vale lembrar que tendo um único método abstrato na classe obriga a própria classe a ser abstrata também, sendo assim essa classe só pode ser herdada por outras classes, sendo elas abstratas ou não e que a primeira classe filha não abstrata dessa classe deve implementar todos os métodos abstratos que ela possui.
E quanto à declaração do método abstrato, acho que o colega esqueceu de avisar que deve ser:
public abstract double nomeDoMetodo();
Em classes abstratas, em interface é implícito.
Tem razão Veronica!
Esqueci do principal!
Abstract na declaração do bendito método. Hahaha.
Obrigado pelos lembretes e as correções já foram feitas.
[quote=Veronicaaa]Olá
Vale lembrar que tendo um único método abstrato na classe obriga a própria classe a ser abstrata também, sendo assim essa classe só pode ser herdada por outras classes, sendo elas abstratas ou não e que a primeira classe filha não abstrata dessa classe deve implementar todos os métodos abstratos que ela possui.
E quanto à declaração do método abstrato, acho que o colega esqueceu de avisar que deve ser:
public abstract double nomeDoMetodo();
Em classes abstratas, em interface é implícito.[/quote]
Bom dia,
Eu dei uma lida sobre interface, mas ainda não entendi bem, será que dava pra alguém explicar um pouco sobre?
abraço.
Você tentou entender ao meu exemplo nessa mesma página? Eu expliquei o que é interface!
Mas explico de novo.
Suponhamos que temos 3 subclasses de uma determinada superclasse. Então você quer criar um tipo de obrigação de apenas duas das três subclasses terem um determinado método, aí entra a interface! Criaremos uma interface e usaremos o ‘implements’ para implementá-la às duas subclasses que queremos ter certeza que terão estes métodos. Caso as três subclasses e possíveis novas subclasses que possivelmente seriam criados fossem precisar de tal método, poderíamos ao invés da interface aplicar um método abstrato à superclasse, que deverá ser abstrata também! Mas acho que a interface simplifica tudo, creio que seja um bom método de programação.
Entendeu???
Abraço.
Então uma classe de uma classe que herda de uma abstract obrigatoriamente tem que implementar todos os métodos abstratos dessa classe. No caso de interface é opcional implementar os metodos. é isso?
Outra coisa eu posso criar uma classe que tenha tanto metodos abstratos como interface?
Obrigado.
[quote=Jorgev]Então uma classe de uma classe que herda de uma abstract obrigatoriamente tem que implementar todos os métodos abstratos dessa classe. No caso de interface é opcional implementar os metodos. é isso?
Outra coisa eu posso criar uma classe que tenha tanto metodos abstratos como interface?
Obrigado.[/quote]
Não, você também é obrigado a implementar todos os metodos da interface.
Classes abstratas você pode ter métodos abstratos e não abstratos, nas interfaces todos os métodos são implicitamente abstratos.
Tá pegando o espírito da coisa.
Lembrando que numa Interface tudo é implicitamente abstrato! Então abstração é essencialmente a base do conceito de interface.
Mas como a Veronica falou acima, numa interface você TEM que usar todos os métodos contidos nela numa classe na qual você a implementou. Se não usar dará erro. Assim como dará erro se na superclasse tiver um método abstrato e você não usá-lo nas subclasses.
Cara, pega a apostila da Caelum. Você vai entender muito bem esses conceitos porque ela é bem enxuta e resumida(apesar de completa). Mas qualquer coisa continua perguntando aí mesmo. Ela me ajudou muito!
Abraço
Obrigado, deu pra entender um pouco melhor sobre o assunto, eu vou dar uma olhada na apostila.
abraço.