Pessoal estou estudando Java, e tenho algumas dúvidas:
A maioria delas é a respeito de Herança x Composição. 1) Seria correto eu dizer que Composição eu sempre implemento com interfaces?
2) Ouvi dizer que posso substituir todas minhas heranças por composição, é correto isso? Se sim, existem desvantagens?
3)A outra dúvida, é que não estou conseguindo diferenciar overriding de overloading.
4) Uma array bidimensional não precisa ser retangular, isto é, cada linha pode ter um número diferente de colunas. Como? Porque?
Pessoal, são dúvidas apenas teóricas, mas acredito que para a prática são fundamentais! Poderia pesquisar tudo isso no google (é claro), mas resolvi postar no GUJ, pq sempe as perguntas são respondidas com total clareza e portanto facilítará e muito no meu aprendizado.
bom respondendo algumas pela numeração… eu nao lembro perfeitamente de Composicao… e nao entendi sua pergunta de numero 2…
mais vamos la resposta
3 - overriding - é quando vc que subscrever um metodo, entao ele deve ter o mesmo tipo de retorno e mesma lista de argumentos, pense nisso como, tenho uma pasta com nome Java unidade C: e agora pego uma pasta Java no pen-drive e vou subscrever minha pasta na unidade C, para ser subcrita a pasta deve estar com o mesmo nome correto? pena que o windows ele nao diferencia maiusculo e minusculo… mais isso eh o overriding. exemplo em java.
class Over{
public void met1(){System.out.println("super");}
}
class Sub extends Over{
public void met1(){System.out.println("Sub");}
}
//metodo subscrito na Subclass
agora vamos ao overloading que é uma sobrecarga é quando vc tem metodos com mesmo nome porem tipos de retornos diferentes e a lista de arg diferentes. Exemplo: posso ter um arquivo conta na extensao do word e outro arquivo conta na extensao excel, porem nomes iguais mais extensao diferente. Em java:
class Sob{
public void setM(){System.out.println("ssa");
}
}
class SobSub extends Sob{
public void setM(int a){System.out.println("sobrecarga");}
}
se vc chamar na classe principal setM ele chama o da super classe agora se vc chamar o setM(10) ele chama o dar subclass… bom coloquei apenas para explicacao… as sintaxes acima… espero ter ajudado…
4 - assim para vc entender arrya bidimensional abra o word crie uma tabela com 4 colunas e 3 linhas isso eh um array dentro de outro array entao eu posso ta na linha 2 e me referenciar a coluna 4 do meu array… qdo sair de um arrauy simples e for para um array bidimensional, pense sempre em tabela na duvida crie um tabela normal e va executando o seu codigo em java e olhando para uma tabela…
flw!! acho que isso ai… se eu tiver errado a galera me corrigi ai… que tb sou um iniciante…
Cara, não querendo ser crítico, mas eu acho que você não está com esses conceitos muito claros na cabeça… acho que deveria retomar um pouco os conceitos de herança e composição, porque as perguntas 1 e 2 ao meu ver não fazem sentido.
Poder você até pode. Correto não é! Imagine que você precise herdar uma classe específica que já tenha a implementação de um método que você vá sempre precisar usar. Se você substituir por uma interface, você vai ter que implementar o código desse método TODA VEZ que precisar. Isso é totalmente contrário a reusabilidade de código!
Cara, fiquei curioso e acho que achei o artigo que te levou a ter essa dúvida (ou quem o questionou a ter essa dúvida). A composição nada mais é do que um tipo de agregação em que, conceitualmente, uma instância não existe sem a outra.
Por que alguns autores estão dizendo que a composição “substitui” a herança em alguns casos? Na verdade, eles estão tratando principalmente de um erro conceitual que muito projetistas cometeram ao longo do tempo, de usar herança para reaproveitar código da classe herdada, sem que houvesse conceitualmente a herança e / ou não houvesse necessidade de se herdar um comportamento ou propriedade. Nesse sentido, ele está correto, já que afirma que nesses casos deve-se usar uma composição (ou seja, “utilizar serviços” ao invés de “herdar comportamento”).
Agora, onde entra a questão da utilização de interfaces nessa história? A questão é que um dos principais problemas de utilizar herança apenas para reutilização de código causa um acoplamento forte entre as classes, incorreta e desnecessariamente. No sentido de diminuir o acoplamento entre as implementações, então, sugere-se mais um nível de abstração, com a utilização de interfaces. Nem sempre isso é necessário / recomendável, porque muitas vezes acaba tornando o seu sistema muito “burocrático” e com muito código inútil.
Composição x Herança…é algo que depende especificamente de seu projeto.
Existem situacoes que voce deve usar heranca,mas existem situacoes que voce deve usar composicao.
Composicao,ao meu ver,nao tem relacao com o uso ou nao de interfaces,isso tem mais a ver com polimorfismo.
A composicao e chamada relacao “tem um” , ou seja o objeto Carro,tem um atributo que é o ojeto Porta.
Heranca e composicao,sao conceitos diferentes.
Entenda heranca como a relacao “é um”, pois um Palio “é um” Carro e “tem Porta”…Entao temos composicao e heranca trabalhando juntos.
Arrays multidimensionais pode ter as dimensoes que voce desejar,nao existem nenhuma especificacao sobre limites de tamanhos,nem de linhas,nem de colunas.
Overload é sobrecarga é quando para um mesmo método você possui diversas “versões do mesmo”…Você faz overload de construtores…
X(){}
X(String nom){}
X(String nome,int idade){}
E tambem pode fazer de metodos…(construtores nada mais sao que metodos)
E quando falamos de overridingnos referiamos a heranca.Pois overriding conceitualmente quer dizer sobrescrever…Ou seja,é um metodo que voce herda de sua classe pai e implementa a sua maneira,mas sem mudar assinatura,nem o tipo de retorno…