Polimorfismo

Polimorfismo é a habilidade de dois objectos diferentes a responder ao mesmo pedido à sua única maneira.

polimorfismo
Exemplo do uso de polimorfismo

Cada veículo (carro, ambulância e camião), ao buzinar, tem o seu som! O carro tem um som mais agudo, a ambulância tem um timbre especifico e o camião tem um som mais grave. Facilmente consegue definir o conceito polimorfismo, justificando que tem o mesmo método mas resposta diferente.

Composição vs Herança

Qual é a diferença entre composição e herança?
A composição é onde uma classe é um componente de dados doutra classe. Devido a esta definição, usa a seguinte terminologia has-a.
A herança é onde uma classe estende doutra classe. Por causa desta definição, usa a seguinte terminologia is-a.

Herança

Herança é uma técnica que permite criar uma nova classe (chamada subclasse) a partir duma classe existente (superclasse) adicionado, assim, mais funcionalidades à subclasse.
A subclasse é mais especializada/especifica do que a superclasse que tem a tendência de ser mais genérica.

public class Point{
 protected int x, y;

 public Point(int x, int y){
  this.x = x;
  this.y = y;
 }

 public boolean equals(Point p){
  return (x == p.x && y = p.y);
 }

 public int getX(){
  return x;
 }

 public int getY(){
  return y;
 }

 public String toString(){
  return new String("(" + (float)x +", "+ (float)y+")");
 }
}

public class NamedPoint extends Point{
 final private String name;

 public NamedPoint(int x, int y, String name){
  super(x,y);
  this.name = name;
 }

 public String getName(){
  return name;
 }

 public String toString(){
  return new String(name +  "(" + x + "," + y + ")");
 }
}

A classe NamedPoint herda todos os métodos e duas variáveis: x e y. E é acrescentada mais uma variável para poder inserir nome do ponto. No construtor, a classe NamedPoint, para além herdar a variavel x e y com a keyword super, acrescentou mais uma variável name.

Composição

Composição é a criação duma classe usando outra classe como o seu componente de dados.

No código seguinte, escrito em JAVA, verá um exemplo de composição:

public class Person{

 protected Name name;
 protected char sex; //'M' ou 'F'
 protected String id; //por exemplo, número do cartão de cidadão

 public Person(Name name, char sex){
  this.name = name;
  this.sex = sex;
 }

 public Person(Name name, char sex, String id){
  this.name = name;
  this.sex = sex;
  this.id = id;
 }

 public Name getName(){
  return name;
 }

 public char getSex(){
  return sex;
 }

 public String getId(){
  return id;
 }

 public void setId(String id){
  this.id = id;
 }

public String toString(){
String s = new String(name + " (sexo: "+ sex);
if(id != null) s+= "; id: "+id;
s += ")";
return s;
}

Portanto, de acordo com o código acima escrito, temos duas classes (Name e String) que são usadas pela classe Person como componentes de dados.
.