• Nenhum resultado encontrado

Herança

No documento CENTRO EDUCACIONAL NSL (páginas 41-47)

}

class CriaCalcado{

public static void main(String args[]){

Calcado sandalia = new Calcado();

} }

A partir do momento em que o programador define um construtor, o construtor padrão deixa de ser utilizado. Quando uma nova instancia da classe for feita, devemos sempre informar os parâmetros exigidos pelo método anteriormente.

class Calcado{

//ESTE É O MÉTODO CONSTRUTOR PADRÃO DA CLASSE Calcado(String cor, int tamanho){

//AS INSTRUÇÕES AQUI É OPCIONAIS }

}

class CriaCalcado{

public static void main(String args[]){

Calcado sandalia = new Calcado("Verde", 38);

//EXIBE CÓDIGO DE DA LOCALIZAÇÃO DO DADO NA MÉMORIA System.out.print(sandalia);

} }

24. Herança

A herança possibilita que as classes compartilhem seus atributos e métodos entre si. Para essa ligação entre as classes, a herança adota um relacionamento esquematizado hierarquicamente. Na herança, temos dois tipos principais de classe.

Superclasse A classe que se encontra em nível mais elevado da hierarquia e concede as características a uma outra classe;

Subclasse A classe que se encontra em nível mais baixo na hierarqui e que herda as características da superclasse.

A herança atua de maneira interativa com o encapsulamento, suponho que uma certa classe tenha alguns atributos encapsulados. Assim, uma subclasse dessa classe herdará esses atributos encapsulados, além de outros atributos adicionais que fazem parte da especialização da subclasse.

O fato de conceito de subclasse ter herdado atributos de classes ancestrais assegura que programas orientados a objetos cresçam de forma linear e não geometricamente em complexibilidade. Cada nova subclasse não possui interações imprevisíveis em relação ao restante do código do sistema.

De maneira bem natural, as pessoas visualizam o mundo formado por objetos, que estão relacionados hierarquicamente entre si. Vejamos, por exemplo, a relação entre os animais, mamíferos e cachorros.

Os animais, sob uma descrição abstrata, apresentam atributos, tais como tamanho, inteligência e estrutura óssea, e aspectos comportamentais descritos definem a classe dos animais.

Se analisarmos os mamíferos, que estão inseridos na classe animais, notaremos atributos mais particulares, como o tipo de dente, pêlos e glândula mamárias.

Os mamíferos são classificados como uma subclasse dos animais, os quais, por sua vez, é uma superclasse de mamíferos.

Pela chamada hierarquicamente de classes, a subclasse mamíferos recebe todos os atributos de animais, partindo do principio da subclasse recebe por herança todos os atributos de seus ancestrais.

No exemplo a seguir, temos a hierarquia de classe do cachorro:

Reino: animal;

Filo: Cordata (cão, lobo, raposa, gato, cobra, sapo, peixe);

Classe: Mamalia (cão, lobo, raposa, gato, cavalo);

Ordem: Carnívora (cão, lobo, raposa, gato);

Família: Canídea (cão, lobo, raposa);

Gênero: Canis (cão, lobo);

Espécies: Canis familiares (cão): dálmata, pastor, dobermann, etc.

Adotemos como exemplo, um cão de raça dálmata, pertence à espécie “Canis familiares”, como visto no exemplo anterior. Por herança, o dálmata herda as características do gênero Canis, o qual, por sua vez, herda as características da família Canídea, que herda as características da ordem Carnívora e, assim, sucessivamente.

24.1. Criando uma herança

Com herança, podemos criar classes que herdem características de classes adotadas de funcionalidades próprias do java, como applets, criação de componentes gráficos, multiprocessadores e outras.

A seguir, temos um exemplo de Funcionário e Programador utilizando o recurso de herança:

public class FuncionarioMatriz{

//ATRIBUTOS

protected String nome;

protected String email;

//CONSTRUTORES

public FuncionarioMatriz(){}

public FuncionarioMatriz(String nome, String email){

this.nome = nome;

this.email = email;

} }

public class Programador extends FuncionarioMatriz{

//ATRIBUTOS PRIVADOS private String linguagem;

private String sistemaOperacional;

//CONSTRUTORES public Programador(){}

public Programador(String n, String e, String linguagem, String sistemaOperacional){

//OS ATRIBUTOS nome e email SÃO HERDADOS DA SUPERCLASSE FuncionarioMatriz

nome = n;

email = e;

this.linguagem = linguagem;

this.sistemaOperacional = sistemaOperacional;

}

//MÉTODOS GETTERS E SETTERS public String getLinguagem(){

return linguagem;

}

public void setLinguagem(String linguagem){

this.linguagem = linguagem;

}

public String getSistemaOperacional(){

return linguagem;

}

public void setSistemaOperacional(String sistemaOperacional){

this.sistemaOperacional = sistemaOperacional;

}

public void imprimirDados(){

//OS ATRIBUTOS NOME EMAIL SÃO HERDADOS DA SUPERCLASSE FuncionarioMatriz

System.out.println("Nome: " + nome);

System.out.println("E-mail: " + email);

System.out.println("Linguagem: " + linguagem);

System.out.println("Sistema Operacional: " + sistemaOperacional);

} }

public class TesteFuncionarios{

public static void main(String args[]){

Programador junior = new Programador("João Fernandes",

"[email protected]", "JAVA", "LINUX");

junior.imprimirDados();

} }

24.2. Acesso a classe pai com o uso do super

Qualquer referencia feita com uso do operador super, dentro de uma classe filha, será referenciado diretamente para a classe pai.

No exemplo a seguir, a classe Analista utiliza super no construtor e no método imprimirDados( ) filha:

public Funcionario(String nome, String email){

this.nome = nome;

this.email = email;

}

//MÉTODOS

public String getNome(){

return nome;

}

public void setNome(String nome){

this.nome = nome;

}

public String getEmail(){

return email;

}

public void setEmail(String email){

this.email = email;

} }

public class Analista extends Funcionario{

//ATRIBUTOS

private String grauEscolaridade;

private String tipoSistema;

//CONSTRUTORES public Analista(){}

public Analista(String nome, String email, String grauEscolaridade, String tipoSistema){

//ACESSANDO DADOS COM O USO DO super super.setNome(nome);

public void setGrauEscolaridade(String grauEscolaridade){

this.grauEscolaridade = grauEscolaridade;

}

public String getTipoSistema(){

return tipoSistema;

}

public void setTipoSistema(String tipoSistema){

this.tipoSistema = tipoSistema;

}

public void imprimirDados(){

System.out.println("Nome: " + super.getNome());

System.out.println("E-mail: " + super.getEmail());

System.out.println("Grau de Escolaridade: " + grauEscolaridade);

System.out.println("Tipo de sistema: " + tipoSistema);

} }

public class TesteAnalista{

public static void main(String args[]){

Analista setor = new Analista("Ana Luiza", "[email protected]",

"MESTRADO", "WEB");

setor.imprimirDados();

} }

24.3. Classe Object

Definimos a classe Object com a raiz para a definição de todas as classes, uma vez que, de forma implícita, toda classe criada sem que haja uma referencia à sua superclasse é derivada diretamente da classe Object.

Pelo fato de as classes serem derivadas de forma direta da classe Object, os objetos de todas as classes têm as definições da classe em questão disponíveis.

24.3.1. Classes abstratas

Entendemos por classes abstratas as classes a partir das quais é possível realizar qualquer tipo de instancia. Membros que não são abstratos podem estar contidos nessas classes, tais como métodos e variáveis normais, entretanto, em sua declaração, essas classes abstratas deverão ter, preferencialmente, um ou mais métodos abstratos.

A implementação desse método é responsabilidade da classe que tem a função de estender à abstrata, uma vez que o método abstrato não contém corpo e tão pouco implementação.

Os métodos abstratos estão presentes somente em classes abstratas, e são aqueles que não possui implementação. Uma classe abstrata pode ter ou não métodos abstratos.

A sintaxe desse tipo de método é a seguinte:

abstract <tipoRetorno> <nomeMetodo> (listaParametros);

No exemplo a seguir, faremos com que a classe Polígono seja abstrata e, como ela será a classe base, outras duas classes, Quadrado e Triangulo derivadas dela.

Ambas as subclasses concretas Quadrado e Triangulo são obrigadas a implementar o método abstrato calcularArea( ). Observemos:

abstract class Poligono {

public abstract double calcularArea();

}

class Quadrado extends Poligono

System.out.println("A área do quadrado é: "+resultado);

return (resultado);

} }

class Triangulo extends Poligono {

private double base;

private double altura;

public Triangulo(double base, double altura) {

System.out.println("A área do Triangulo é: "+resultado);

return (resultado);

} }

public class CalculoAreaPoligonos {

public static void main(String args[]) {

Quadrado quadrado= new Quadrado(10);

quadrado.calcularArea();

Triangulo triangulo= new Triangulo(15,20);

triangulo.calcularArea();

} }

No documento CENTRO EDUCACIONAL NSL (páginas 41-47)

Documentos relacionados