aula bluej3.ppt [modo de compatibilidade] · 2009. 7. 16. · herança sendo uma linguagem...

14
Herança Herança Forma de reutilização de software Forma de reutilização de software Encapsular estrutura e comportamento em um Encapsular estrutura e comportamento em um tipo não é um conceito exclusivo da orientação tipo não é um conceito exclusivo da orientação a objetos, pois já era usado na programação de a objetos, pois já era usado na programação de tipos abstratos. O que torna a orientação a tipos abstratos. O que torna a orientação a objetos única é o conceito de herança; objetos única é o conceito de herança; Este conceito permite que características Este conceito permite que características comuns sejam agrupadas em uma classe base, comuns sejam agrupadas em uma classe base, chamada superclasse, e que a partir dela outras chamada superclasse, e que a partir dela outras classes possam ser especificadas. classes possam ser especificadas.

Upload: others

Post on 16-Feb-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • HerançaHerança Forma de reutilização de softwareForma de reutilização de software Encapsular estrutura e comportamento em um Encapsular estrutura e comportamento em um

    tipo não é um conceito exclusivo da orientação tipo não é um conceito exclusivo da orientação a objetos, pois já era usado na programação de a objetos, pois já era usado na programação de tipos abstratos. O que torna a orientação a tipos abstratos. O que torna a orientação a objetos única é o conceito de herança;objetos única é o conceito de herança;

    Este conceito permite que características Este conceito permite que características comuns sejam agrupadas em uma classe base, comuns sejam agrupadas em uma classe base, chamada superclasse, e que a partir dela outras chamada superclasse, e que a partir dela outras classes possam ser especificadas. classes possam ser especificadas.

  • HerançaHerança Sendo uma linguagem orientada a objetos Java Sendo uma linguagem orientada a objetos Java

    oferece mecanismos para definir classes oferece mecanismos para definir classes derivadas a partir de classes existentes;derivadas a partir de classes existentes;

    As classes derivadas absorvem atributos e As classes derivadas absorvem atributos e comportamentos das classes herdadas e comportamentos das classes herdadas e incluem os seus própriosincluem os seus próprios Sobrescrevem métodos podendo reescrever os Sobrescrevem métodos podendo reescrever os

    métodos herdadosmétodos herdados A subclasse herda de uma superclasse que A subclasse herda de uma superclasse que

    pode ser pode ser Superclasse direta, caso a herança seja feita Superclasse direta, caso a herança seja feita

    explicitamente.explicitamente. Superclasse indireta, caso a subclasse herde de dois Superclasse indireta, caso a subclasse herde de dois

    níveis ou mais acima.níveis ou mais acima.

  • Exemplos de herançaExemplos de herança Funcionário pode herdar de pessoa:Funcionário pode herdar de pessoa:

    PodePode--se dizer que um funcionário é uma pessoase dizer que um funcionário é uma pessoa Não se pode dizer que uma pessoa é um funcionárioNão se pode dizer que uma pessoa é um funcionário

    Pessoa => Superclasse, Funcionário => Pessoa => Superclasse, Funcionário => SubclasseSubclasse

    Apesar da nomeclatura, subclasse tem mais Apesar da nomeclatura, subclasse tem mais características do que a superclassecaracterísticas do que a superclasse

    Toda subclasse Toda subclasse é um é um objeto da sua superclasse objeto da sua superclasse mas não vicemas não vice--versaversa

    Com herança podeCom herança pode--se criar uma estrutura se criar uma estrutura hierárquica estilo uma árvorehierárquica estilo uma árvore

  • Para se implementar herança usaPara se implementar herança usa--se a palavra se a palavra extendsextendsclass funcionario extends pessoaclass funcionario extends pessoa{{......}}

    Na verdade herança é sempre utilizada em Java, Na verdade herança é sempre utilizada em Java, mesmo quando não explicitamente, quando uma classe mesmo quando não explicitamente, quando uma classe é criada não há nenhuma referência a sua superclasse, é criada não há nenhuma referência a sua superclasse, mas implicitamente a classe criada é derivada mas implicitamente a classe criada é derivada diretamente da classe object.diretamente da classe object.

    Durante a construção de um objeto de uma classe Durante a construção de um objeto de uma classe derivada o construtor de sua superclasse é executado derivada o construtor de sua superclasse é executado (implicitamente ou explicitamente) antes de executar o (implicitamente ou explicitamente) antes de executar o corpo de seu construtor.corpo de seu construtor.

  • Vejamos as proteções que podemos usar em Vejamos as proteções que podemos usar em uma superclasse:uma superclasse: Public: torna seu objeto de ação disponivel em Public: torna seu objeto de ação disponivel em

    qualquer classe;qualquer classe; Private: torna seu objeto de ação disponivel apenas Private: torna seu objeto de ação disponivel apenas

    na superclasse;na superclasse; Protected: torna seu objeto de ação acessível aos Protected: torna seu objeto de ação acessível aos

    métodos da superclasse bem como aos métodos de métodos da superclasse bem como aos métodos de qualquer subclasse desta. É uma proteção qualquer subclasse desta. É uma proteção intermediária entre a public e a private.intermediária entre a public e a private.

    Em uma subclasse os métodos podem se referir Em uma subclasse os métodos podem se referir a membros public ou protected de uma a membros public ou protected de uma superclasse pelo nome.superclasse pelo nome.

  • Sobrescrevendo métodos:Sobrescrevendo métodos: Métodos de uma superclasse podem ser redefinidos Métodos de uma superclasse podem ser redefinidos

    em uma subclasse. Quando o método for em uma subclasse. Quando o método for referenciado pela subclasse a versão redefinida será referenciado pela subclasse a versão redefinida será automaticamente utilizada.automaticamente utilizada.

    Caso seja necessário é possível acessar o método Caso seja necessário é possível acessar o método da superclasse, basta usar a referência completa:da superclasse, basta usar a referência completa:

    super.nomeDoMetodo(...);super.nomeDoMetodo(...);

    Para invocar o construtor da superclasse Para invocar o construtor da superclasse explicitamente dentro da subclasse ele tem que ser o explicitamente dentro da subclasse ele tem que ser o primeiro comando do construtor da subclasse:primeiro comando do construtor da subclasse:

    •• super( ); super( );

  • ExemploExemplo Imagine que os professores de uma Imagine que os professores de uma

    universidade se dividem em horistas e regime universidade se dividem em horistas e regime integral. Professores de regime integral integral. Professores de regime integral recebem um salario fixo por mês que equivale a recebem um salario fixo por mês que equivale a 40 horas mensais. Professores horistas 40 horas mensais. Professores horistas recebem um salário estipulado por hora.recebem um salário estipulado por hora.

    O cadastro de professores armazena: nome, O cadastro de professores armazena: nome, idade, matrícula e informação de salário.idade, matrícula e informação de salário.

    Como poderia ser uma modelagem de classes Como poderia ser uma modelagem de classes para este exemplo?para este exemplo?

  • Classe RegimeInteg:Classe RegimeInteg:String nome, mat;String nome, mat;int idade;int idade;double salario;double salario;

    Classe Horista:Classe Horista:String nome, mat;String nome, mat;int idade, horas;int idade, horas;double sal_hora;double sal_hora;

    RegimeInteg(string,string,int, double );RegimeInteg(string,string,int, double );String retornaNome()String retornaNome()String retornaMat()String retornaMat()int retornaIdade()int retornaIdade()double retornaSal()double retornaSal()

    Horista (string,string,int, int,double);Horista (string,string,int, int,double);String retornaNome()String retornaNome()String retornaMat()String retornaMat()int retornaIdade()int retornaIdade()double retornaSal()double retornaSal()int retornaHoras()int retornaHoras()

    •As classes tem alguns atributos e métodos iguais

    •Se precisarmos alterar alguma coisa que esteja representado nas duas classes teremos que alterar nas duas, pois o código está redundante. Ex: alterar matrícula de string para inteiro.

    •Uma forma de resolver isto seria através do mecanismo de herança

  • Poderíamos criar uma Poderíamos criar uma classe professor que classe professor que tivesse o que de comum tivesse o que de comum temos entre as duas temos entre as duas classes anteriormente classes anteriormente especificadas.especificadas.

    A partir dela podemos A partir dela podemos criar duas novas classes criar duas novas classes que irão representar os que irão representar os professores horistas e de professores horistas e de regime integral, estas regime integral, estas classes irão “herdar” de classes irão “herdar” de professor.professor.

    Classe Professor:Classe Professor:String nome, mat;String nome, mat;int idade;int idade;Professor (string,string,int);Professor (string,string,int);String retornaNome()String retornaNome()String retornaMat()String retornaMat()int retornaIdade()int retornaIdade()double retornaSal()double retornaSal()

  • public abstract class Professorpublic abstract class Professor{{

    // instance variables // instance variables -- replace the example below with your ownreplace the example below with your ownprotected String nome;protected String nome;protected int idade;protected int idade;protected String mat;protected String mat;

    public Professor(String n, String m, int i)public Professor(String n, String m, int i){{

    nome = n;nome = n;mat = m;mat = m;idade = i;idade = i;

    } }

    public String retornaNome(){return nome;}public String retornaNome(){return nome;}public String retornaMat(){return mat;} public String retornaMat(){return mat;} public int retornaIdade(){return idade;} public int retornaIdade(){return idade;}

    } }

  • public class ProfRegime extends Professorpublic class ProfRegime extends Professor{{

    protected double sal;protected double sal;

    public ProfRegime(String n, String m, int i, double valSal)public ProfRegime(String n, String m, int i, double valSal){{super(n,m,i);super(n,m,i);if (valSal > 0) sal = valSal;if (valSal > 0) sal = valSal;}}

    public double retornaSal()public double retornaSal(){{return sal; return sal; } }

    }}

  • public class Horista extends Professorpublic class Horista extends Professor{{

    // instance variables // instance variables -- replace the example below with your ownreplace the example below with your ownprivate double valHora;private double valHora;private int q_horas;private int q_horas;private double sal;private double sal;

    public Horista(String n, String m,int i,int qh, int vh)public Horista(String n, String m,int i,int qh, int vh){{super(n,m,i);super(n,m,i);if (qh > 0) valHora = vh;if (qh > 0) valHora = vh;if (vh > 0) q_horas = qh;if (vh > 0) q_horas = qh;}}

    public double retornaSal()public double retornaSal(){{sal = valHora * q_horas;sal = valHora * q_horas;return sal;return sal;} }

    }}

  • ExercicioExercicioConstrua uma hierarquia de classes para Construa uma hierarquia de classes para

    ponto, circulo e cilindro:ponto, circulo e cilindro: Classe ponto:Classe ponto:

    •• Variaveis protected a, b;Variaveis protected a, b;•• Metodos: setPonto, geta, getb;Metodos: setPonto, geta, getb;

    Classe circulo (herda de ponto):Classe circulo (herda de ponto):•• Variavel: protected raio;Variavel: protected raio;•• Metodos: setRaio, getRaio, area;Metodos: setRaio, getRaio, area;

    Classe cilindro (herda de circulo):Classe cilindro (herda de circulo):•• Variavel: protected alt;Variavel: protected alt;•• Metodos: setAlt, getAlt, area (superficie), volume;Metodos: setAlt, getAlt, area (superficie), volume;