[pergunta] Onde se faz necessario metodos abstratos

por favor, alguem poderia me dizer onde se faz necessario metodos abstratos?

Onde vc quiser seguir um contrato, como em uma interface, mas vc quer prover algumas funcionalidades já prontas, deixando só o que é abstrato para ser implementado pela classe filha.

é meio abstrato né? :lol:

Ainda sou novato em Java. E eu já me peguntei isso tb. Pelo que eu ja vi uma classe abstrata seria uma especie de super classe. As classe filho herdam seu métodos e atributos. E além disso ela não gera objeto. No caso dos métodos segue o mesmo raciocinio?

seguinte vc tem uma classe que nao pode ser instanciada, exemplo veiculo, vc nao ve um “veiculo” acelerando pela rua, pq veiculo é um objeto abstrato, vc ve implementações de veiculo, exemplo motos, carros, caminhoes, patinetes e etc!

todo veiculo tem um comportamento, supomos acelerar, mas cada veiculo acelera do seu modo em particular, entao o metodo acelerar deve ser implementado em cada veiculo, da sua maneira…

um metodo abstrado obrigatoriamente tem que ser implementado em cada classe que extenda a classe abstrata.

abrasssssss

Oi,

“Imagine um sistema de envio de mensagens do tipo texto e fax. Não faria sentido ter uma instância de Mensagem, mas sim uma de MensagemTexto ou MensagemFax.”

Tchauzin!

Ola !

Acho que se voce pegar o exemplo da classe Animal, fica bem facil de entender.

Bom, imagine que no seu sistema voce vai utilizar varios animais que emitem algum tipo de som.
Como eu não sei exatamente quais são esses animais, então crio uma classe genérica chamada Animal, conforme exemplo abaixo:

public class Animal { int altura; // todo animal tem uma certa altura int peso; // todo animal tem peso (creio eu) // get / set altura // get / set peso ... }

Assim, se surgir um novo animal, voce está mais preparado, bastando cria-lo extendendo a classe Animal.

Bom, mas o que importa mesmo para mim é o animal “emitindo som” (que tenho certeza de que todos os animais que vou utilizar no sistema o fazem), logo adiciono na classe Animal o tal metodo:

[code]public class Animal {
int altura; // todo animal tem uma certa altura
int peso; // todo animal tem peso (creio eu)
// get / set altura
// get / set peso

public void emitirSom() {
// epa, mas que som que vou colocar aqui, se eu não sei qual é o animal ?
}


}[/code]

Logo, no meu projeto, sei que vou precisar do metodo emitirSom(), mas a gente não sabe a sua implementação, até porque isso depende da proxima classe (concreta) que vai extende-la. Por isso, podemos deixar esse metodo abstrato, consequentemente, a classe toda vira abstract tambem:

[code]public abstract class Animal {
int altura; // todo animal tem uma certa altura
int peso; // todo animal tem peso (creio eu)
// get / set altura
// get / set peso

public abstract void emitirSom() ; // nao se sabe a implementacao ainda


}[/code]

Agora, só falta criar os animais concretos, conforme eles forem surgindo em seu projeto:

Exemplos:

public class Cachorro extends Animal { @Override public void emitirSom() { System.out.println("Au au!") } }

public class Gato extends Animal { @Override public void emitirSom() { System.out.println("Miau!") } }

public class Galinha extends Animal { @Override public void emitirSom() { System.out.println("Cocoricó!") } }

Bom, acredito que seja isso.
Se tiver erro, me corrijam ok.

Espero que tenha complementado com algo.

[quote=ono.leo]Ola !

Acho que se voce pegar o exemplo da classe Animal, fica bem facil de entender.

Bom, imagine que no seu sistema voce vai utilizar varios animais que emitem algum tipo de som.
Como eu não sei exatamente quais são esses animais, então crio uma classe genérica chamada Animal, conforme exemplo abaixo:

public class Animal { int altura; // todo animal tem uma certa altura int peso; // todo animal tem peso (creio eu) // get / set altura // get / set peso ... }

Assim, se surgir um novo animal, voce está mais preparado, bastando cria-lo extendendo a classe Animal.

Bom, mas o que importa mesmo para mim é o animal “emitindo som” (que tenho certeza de que todos os animais que vou utilizar no sistema o fazem), logo adiciono na classe Animal o tal metodo:

[code]public class Animal {
int altura; // todo animal tem uma certa altura
int peso; // todo animal tem peso (creio eu)
// get / set altura
// get / set peso

public void emitirSom() {
// epa, mas que som que vou colocar aqui, se eu não sei qual é o animal ?
}


}[/code]

Logo, no meu projeto, sei que vou precisar do metodo emitirSom(), mas a gente não sabe a sua implementação, até porque isso depende da proxima classe (concreta) que vai extende-la. Por isso, podemos deixar esse metodo abstrato, consequentemente, a classe toda vira abstract tambem:

[code]public abstract class Animal {
int altura; // todo animal tem uma certa altura
int peso; // todo animal tem peso (creio eu)
// get / set altura
// get / set peso

public abstract void emitirSom() ; // nao se sabe a implementacao ainda


}[/code]

Agora, só falta criar os animais concretos, conforme eles forem surgindo em seu projeto:

Exemplos:

public class Cachorro extends Animal { @Override public void emitirSom() { System.out.println("Au au!") } }

public class Gato extends Animal { @Override public void emitirSom() { System.out.println("Miau!") } }

public class Galinha extends Animal { @Override public void emitirSom() { System.out.println("Cocoricó!") } }

Bom, acredito que seja isso.
Se tiver erro, me corrijam ok.

Espero que tenha complementado com algo.

[/quote]

Boa tarde a todos.

É exatamente isto:

Pegando o embalo, tá na hora então de saber a diferença entre Interface e Classe Abstrata.

Bom uma classe abstrata o nosso amigo Ono.leo já definiu o que é, ou seja, ela possui (não todos) alguns métodos abstratos e por esse motivo essa classe não pode ser instanciada, haja visto que alguns dos seus métodos não foram definidos.

Já uma Interface é nada mais nada menos que uma Classe totalmente Abstrata, ou seja, todos os seus métodos tem que ser abstratos e obedecendo o mesma regra de classe abstrata ela também não é instanciada.

Outra diferença de Interface para Classe Abstrata é que uma Classe Abstrata tem como herdeiro default a classe Object, já uma Interface não herda de ninguém o seja, ela não tem herança definida e por isso que é implementada ao invés de extendida, e também voce pode implementar várias interfaces em uma mesma classe. Já com a herança, voce só pode fazer em uma classe uma única herança.