Diferenças entre Herança X Classe Abstratas X Interfaces  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
hvivox
Virtual Machine Man
[Avatar]
Membro desde: 19/09/2006 20:27:47
Mensagens: 561
Localização: SEDE DA COPA
Offline

Olá galera,

Todos já sabemos qual o significado de Herança, Classe Abstratas e Interfaces por esse motivo estou abrindo um topico para listarmos as DIFENÇAS entre esse conceitos da orientação a objetos.

Quais as diferenças entre Herança X Classe Abstratas X Interfaces? As experienças também são válidas e falicidades proporcionadas também vale!

Lembrando que o significado todos já sabemos!

Aguardo muitas respotas. vlw

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]
[WWW] [Yahoo!] aim icon [MSN] [ICQ]
marcobiscaro2112
JWizard

Membro desde: 01/12/2008 11:56:04
Mensagens: 2408
Localização: São Paulo - SP
Offline

Classes abstratas: classes que não podemos instanciar (na sua definição consta abstract class) e que define ao menos um método abstrato para que suas subclasses o implementem.

Interfaces: contratos. Usamos a palavra chama interface e o nível de acoplamento ao usar uma interface é menor que ao usar uma classe abstrata (no caso da interface interessa o que as implementações fazem, e não como).

Marco Biscaro.

Seja livre!

Você sabia que provavelmente há milhares de arquivos duplicados no seu computador?

Ei... você está usando DefaultTableModel no seu projeto?? Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[Email] [WWW] [MSN]
gudamiao
Entusiasta Java
[Avatar]
Membro desde: 14/10/2009 19:46:06
Mensagens: 15
Offline

Oiiii Pessoal

Herança, é uma classe herdar todos atributos e metodos visiveis em outra classe. EX:



Depois irei criar uma classe Aluno, a perguta é: Aluno é uma Pessoa?



Abraços
Rafael Marques
JavaEvangelist
[Avatar]

Membro desde: 11/10/2008 23:04:11
Mensagens: 435
Localização: Santo André - SP
Offline

http://www.guj.com.br/posts/list/79093.java
http://www.guj.com.br/posts/list/131561.java
http://www.guj.com.br/posts/list/22989.java

Rafael Marques

@ blog / @ Linkedin / @ twitter



"Dream on, Dream until your dream comes true"
[WWW] [MSN] [ICQ]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

marcobiscaro2112 wrote:Classes abstratas: classes que não podemos instanciar (na sua definição consta abstract class) e que define ao menos um método abstrato para que suas subclasses o implementem.


Cuidado, uma classe abstrata não força a existencia de um método abstrato. A classe pode ser abstrata tento apenas métodos concretos (não abstratos). O que nao pode acontecer é ter métodos abstratos e classe não ser abstrata.

O marcador "abstract" na classe significa "Esta classe não é instanciável" nada tem a haver com os métodos. A classe abstrata nem precisa sequer ter métodos.


Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

gudamiao wrote:Oiiii Pessoal

Herança, é uma classe herdar todos atributos e metodos visiveis em outra classe. EX:



Primeira regra para definir algo : não se usa o algo na definição. Herança é herdar ?

Herança não é isso. Herança é a classificação hierárquica de classes. Herança serve para classificar as classes.
No caso do Java, que apenas permite herança simples, a herança serve para classificar a identidade das classes. Ou seja, classificar o que elas são. Se aluno é uma pessoa, todos os alunos são pessoas. é esta a implicação da herança, estabelecer uma relação de É-UM.
Por exemplo, é mentira que todos os alunos são pessoas. Animais também podem aprender e seu alunos. Um modelo onde Aluno é uma Pessoa, não consegue classificar um aluno animal.

Quando uma classe herda de outra, isso cria um escopo de visibilidade entre as duas classes. Esse escopo é usadado para que a implementação seja coerente. Ou seja, a visibilidade e acesso dos métodos e atributos entre as classes pais e filhas não é a herança, é um efeito secundário decorrente da relação de herança.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
el_loko
JavaEvangelist

Membro desde: 30/10/2007 12:09:43
Mensagens: 357
Offline

marcobiscaro2112 wrote:
Interfaces: contratos. Usamos a palavra chama interface e o nível de acoplamento ao usar uma interface é menor que ao usar uma classe abstrata (no caso da interface interessa o que as implementações fazem, e não como).


O que é acoplamento pra vc?
Me explique oq difere os itens abaixo em relação ao acoplamento!


e
gudamiao
Entusiasta Java
[Avatar]
Membro desde: 14/10/2009 19:46:06
Mensagens: 15
Offline

Boa Tarde sergiotaborda

Legal, entendi perfeitamente, so me tira uma duvida!!!

Você disse que não é verdade, que o aluno é uma pessoa!!

Como projetaria um diagrama de classes, para uma Escola de Crianças, onde nao tem animal?

Como ficaria a herança da mesma?
att
Gustavo
sergiotaborda
GUJ Expert
[Avatar]

Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline

gudamiao wrote:Boa Tarde sergiotaborda

Legal, entendi perfeitamente, so me tira uma duvida!!!

Você disse que não é verdade, que o aluno é uma pessoa!!

Como projetaria um diagrama de classes, para uma Escola de Crianças, onde nao tem animal?

Como ficaria a herança da mesma?


Não ficaria. Aluno não é uma pessoa, a pessoa que pode ser aluno.
eu faria uma composição em que aluno tem uma pessoa - se a pessoa é realmente importante para o modelo. Se não, simplesmente não colocaria pessoa no modelo. Não usaria herança.

Criando sua própria API de Validação



Blog do MiddleHeaven
[WWW]
laudenpower
JavaEvangelist
[Avatar]

Membro desde: 28/12/2008 21:00:08
Mensagens: 349
Offline

sergiotaborda wrote:
gudamiao wrote:Boa Tarde sergiotaborda

Legal, entendi perfeitamente, so me tira uma duvida!!!

Você disse que não é verdade, que o aluno é uma pessoa!!

Como projetaria um diagrama de classes, para uma Escola de Crianças, onde nao tem animal?

Como ficaria a herança da mesma?


Não ficaria. Aluno não é uma pessoa, a pessoa que pode ser aluno.
eu faria uma composição em que aluno tem uma pessoa - se a pessoa é realmente importante para o modelo. Se não, simplesmente não colocaria pessoa no modelo. Não usaria herança.


Nesse caso pelo que entendi você analisou o modelo de cima (Pessoa) para baixo (Aluno), quando afirmou que uma pessoa pode ser um aluno... achei interessante essa análise.

Enquanto cultivares teu saber, nada tens a temer!

"Any fool can write code that a computer can understand. Good programmers write code that humans can understand."
-Martin Fowler et al, Refactoring: Improving the Design of Existing Code, 1999
corcunda
What is classpath?

Membro desde: 08/01/2010 08:47:57
Mensagens: 8
Localização: Curitiba - PR
Offline

É para esse caso que servem as interfaces.

Tanto a classe Cachorro quanto a classe Aluno poderiam implementar a interface "Learnable" dando a capacidade de aprender as duas classes.
Assim, o aluno poderia continuar sendo uma pessoa e realizar tarefas de aluno e o cachorro poderia ter a capacidade de aprender. Caso essa fosse a ideia.

abraços,
corcunda
gudamiao
Entusiasta Java
[Avatar]
Membro desde: 14/10/2009 19:46:06
Mensagens: 15
Offline

Boa Noite


Legal a melhor solução também acho que a interface serial legal!!!

att
Gustavo Damião
hvivox
Virtual Machine Man
[Avatar]
Membro desde: 19/09/2006 20:27:47
Mensagens: 561
Localização: SEDE DA COPA
Offline

A discursão é bem interessante mas... precisamos nos focar nos objetico do tópico. Quais são as direnças existentes entre Herança X Classe Abstratas X Interfaces

Esse fator que torna o tópico importante.

SDS

Se o seu tópico foi respondido e você está satisfeito, segue:
- Pressione o botão <Edit> de seu primeiro post
- Acrescente no final do título a tag [RESOLVIDO]
[WWW] [Yahoo!] aim icon [MSN] [ICQ]
TiD
Debugger
[Avatar]

Membro desde: 03/01/2007 15:47:37
Mensagens: 69
Localização: Rio de Janeiro/RJ
Offline

Ola,


Heranca eh um dos pilares da orientacao a objetos, segundo a literatura (Heranca, polimorfismo, abstracao e encapsulamento). Heranca eh uma ferramenta que essas linguagens O-O te dao para te ajudar na modelagem. Utilizando-se a modelagem por heranca, ou seja, definindo seu modelo hierarquicamente, obtem-se clareza na modelagem (eh muito facil ler um modelo de classes bem projetado utilizando Heranca) e forte reutilizacao de codigo (ja que as classes filhas herdam codigo e definicoes das classes pai, evitando a reescrita de muito codigo). Por outro lado, voce ganha forte acoplamento -- qualquer alteracao que voce porventura tenha que fazer nas classes pai (imagine seu sistema com muitos niveis de heranca) reflete em tooooodos que extendem daquela classe. DEpendendo do tamanho do sistema isso pode ser catastrofico. ALem do mais, a heranca em determinados casos quebra o encapsulamento -- por muitas vezes, para reescrever um metodo com eficiencia em uma classe filha eh necessario conhecer detalhes da implementacao do metodo pai.

Classes Abstratas sao classes utilizadas na modelagem baseada em heranca. Sao classes que representam conceitos abstratos, genericos que nao fazem sentido serem instanciados no seu sistema e estao ali visando reutilizacao de codigo, reunindo caracteristicas que sao comuns a todos os que vao herdar dessa classe. Por exemplo.. suponha a classe abstrata Motor -- que tera os atributos basicos de um motor: potencia, torque, cilindros, valvulas.. e os metodos ligar() e desligar().

Provavelmente voce ira definir os metodos ligar() e desligar() como abstratos. Por que? Sua classe concreta MotorCarro tem o ligar() de um jeito, sua classe concreta MotorMOto tem o ligar() de outro jeito, sua classe MotorAviao tem outro ligar(). Idem para o desligar(). Deu pra sacar? Voce esta delineando mais ou menos o seguinte: olha, no meu modelo, pra ser um motor voce deve herdar de Motor e implementar os metodos abstratos (o compilador te forca a isso). Se algum metodo for comum atodos, voce pode defini-lo na classe abstrata (seria o metodo concreto), com codigo dentro. Dai, todos que herdarem dessa classe abstrata herdadao o codigo. Como eh baseado em heranca, tem os pros e contras da mesma.

Interfaces dizem respeito a outra forma de modelar - a composicao, que eh uma alternativa a heranca. Uma interface eh basicamente o seguinte: nao tem codigo nenhum dentro, apenas atributos e assinaturas de metodos.

Meio confuso, ne ? Com composicao voce nao tem a reutilizacao de codigo -- interfaces apenas definem assinaturas de metodos. SUponha o mesmo exemplo de motor -- seria identico. Todas as classes que quiserem ser um Motor no modelo terao de implementar a interface motor.



Supondo que todos os nossos motores terao 16 valvulas (esse valor pode ser sobrescrito nas classes que implementam a interface). Entao, como dizia, toda classe que quiser ser um Motor (MOtorCarro, MotorMoto etc...) tera de implementar a interface, respeitando a definicao dos metodos na interface.

Qual a diferenca, entao ?

COmo disse, sao 2 formas de modelar -- com suas vantagens e desvantagens. O uso de interfaces nao produz o problema de quebra de encapsulamento visto que as implementacoes nao herdam nada de classes-mae, porem nao tem a reutilizacao do codigo com a facilidade que a heranca da. Basicamente, uma interface define um comportamento 100% abstrato, deixando a responsabilidade da implementacao total para o programador.

Se ficou confuso, basta dizer que tento explicar melhor.

Abs!!

Valério Lopes
Oracle Certified Programmer for the Java 2 Platform, SE 6.0
[WWW]
pgnt
Debugger
[Avatar]

Membro desde: 18/01/2007 04:27:33
Mensagens: 57
Offline

Olás,
Meio q desenterrando o tópico, gostaria de colocar algumas conclusões de tudo que foi lido pra ver se estamos de acordo:

1. Usamos classe abstrata no lugar de uma interface quando queremos obter o benefício da herança, isto é, além da subclasse ser forçada a implementar os métodos abstratos da classe pai (como seria numa interface), pode contar com o reaproveitamento de código da classe pai, por meio de algum método não abstrato implementado.

2. A vantagem da interface (dependendo do caso) é que uma classe pode implementar mais de uma, diferente de herdar uma classe abstrata, onde só se pode fazer uma vez.


Agora sobre instanciar essas abstrações, é possível (ou aparentemente, se não há algo 'por trás dos panos') com interface mas não com classe abstrata, ex:

confere?

abs
 
Índice dos Fóruns » Java Básico
Ir para:   
Powered by JForum 2.1.8 © JForum Team