Classes, Superclasses e Subclasses

Documentos relacionados
Programação Orientada a Objetos em Java. Herança

Técnicas de Programação II

BCC221 Programação Orientada a Objetos. Prof. Marco Antonio M. Carvalho 2014/2

Capítulo 5 Reuso de Classes

Módulo 06 Desenho de Classes

Programação por Objectos. Java

Reuso com Herança a e Composiçã

Módulo 07 Características Avançadas de Classes

Programação por Objectos. Java

Herança. Alberto Costa Neto DComp - UFS

Java 2 Standard Edition Como criar classes e objetos

Lista de Contas: Assinatura. Lista de Contas. Listas de Contas: Descrição. Listas de Contas: Descrição. Listas de Contas: Descrição

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

7 RTTI e Interfaces. Desenvolvimento OO com Java. Vítor E. Silva Souza (vitorsouza@inf.ufes.br)

Orientação a Objetos e a Linguagem Java

Programação Orientada a Objetos em java. Polimorfismo

Programação Orientada a Objetos em Java

Encapsulamento de Dados

Introdução à Programação. Interface, Polimorfismo e Dynamic Binding

Análise e Projeto Orientados por Objetos

Computação II Orientação a Objetos

Orientação a Objetos com Java

Capítulo 4. Packages e interfaces

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

Curso Java Starter. 1

Java Básico. Classes Abstratas, Exceções e Interfaces Prof. Fernando Vanini Ic-Unicamp

Linguagem de Programação III

Tópicos da Aula. Classes e Objetos. Classe Pública em Java. Classes em Java. Assinatura de Métodos. Corpo de Classes e Métodos. Conceitos de classe

Herança. Algoritmos e Programação II. Aula 5 Herança

EXERCÍCIOS SOBRE ORIENTAÇÃO A OBJETOS

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Programação com Objectos. Processamento de Dados I. 4. Classes Abstractas

Programação Orientada a Objetos (DPADF 0063)

Programação Orientada a Objetos Prof. Rone Ilídio UFSJ/CAP

BSI UFRPE Prof. Gustavo Callou

Programação de Computadores - I. Profª Beatriz Profº Israel

Um objeto é uma instância de uma 'classe'. Você define uma classe utilizando o trecho de código abaixo;

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

Programação Orientada a Objetos. Encapsulamento

Curso de Java. Orientação a objetos e a Linguagem JAVA. TodososdireitosreservadosKlais

Análise de Programação

Java. Marcio de Carvalho Victorino

Construção de novas Classes em Java. Classes Atributos Métodos Herança...

Revisão OO Básico. Orientação a Objetos em Java

Herança e Polimorfismo de Inclusão

Programação Orientada a Objetos e Java - Introdução. Carlos Lopes

Introdução. Programação. Orientada a Objetos: Reuso. Introdução. Classes Abstratas

8 Classes Internas. Desenvolvimento OO com Java. Vítor E. Silva Souza

Paradigmas da Programação PPROG. Linguagem JAVA. Interfaces. (Livro Big Java, Late Objects Capítulo 9) Nelson Freire (ISEP DEI-PPROG 2013/14) 1/33

Implementação de Classe e Auto-Relacionamento em Java

Capítulo 3. Programação por objectos em Java

Profº. Enrique Pimentel Leite de Oliveira

ATRIBUTOS PRIVADOS 6. ENCAPSULAMENTO MÉTODOS PRIVADOS MÉTODOS PRIVADOS

Implementando uma Classe e Criando Objetos a partir dela

Curso de PHP. FATEC - Jundiaí. A programação orientada a objetos (object-oriented oriented programming

Capítulo 14. Herança a e Polimorfismo. Rui Rossi dos Santos Programação de Computadores em Java Editora NovaTerra

Para desenvolver a atividade a atividade desta aula utilizaremos o ambiente de desenvolvimento integrado NetBeans.

2 Orientação a objetos na prática

UNIVERSIDADE FEDERAL DO PARANÁ

POO Programação Orientada a Objetos. Classes em Java

ARRAYS. Um array é um OBJETO que referencia (aponta) mais de um objeto ou armazena mais de um dado primitivo.

Noções sobre Objetos e Classes

5 Caso de estudo O cartão fidelidade

PHP INTRODUÇÃO CLASSES E OBJETOS

Introdução a Java. Hélder Nunes

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Prof. Jhonatan Fernando

public Agenda() { compromissos = null; } public int getnumerodecompromissos() { if (compromissos==null) return 0; else return compromissos.

A Introdução à Programação Orientada a Objetos. Programação e Sistemas de Informação

3 Classes e instanciação de objectos (em Java)

Membros de classe e de instância. PARTE III: Java e OO - detalhes. Exemplo 1: método. Exercício. Exemplo 1 corrigido

Material de Apoio 5. int getres() { return res; O que estas classes possuem em comum? 1) 2) 3)

INSTITUTO DE COMPUTAÇÃO UNICAMP 1o. SEMESTRE DE Profa. Cecília M. F. Rubira

Padrão Básico de Projeto: Interfaces e Polimorfismo

Programação Orientada a Objetos Classes Abstratas Técnico em Informática. Prof. Marcos André Pisching, M.Sc.

Aula 3 Objeto atual com referencia THIS e Classes com Herança

Orientação a Objetos

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Lição 9 Trabalhando com bibliotecas de classes

Guia de Fatores de Qualidade de OO e Java

PROGRAMAÇÃO ORIENTADA A OBJETO EM PHP

Programação Orientada por Objetos

Programação com Acesso a BD. Programação com OO Acesso em Java

Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos. Relacionamentos entre objetos

Exercícios de Revisão Java Básico

Unidade IV: Ponteiros, Referências e Arrays

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

Objetivos: Sun recomenda que utilize o nome de domínio da Internet da empresa, para garantir um nome de pacote único

Introdução à orientação a objetos. João Tito Almeida Vianna 25/05/2013

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

DEFINIÇÃO DE MÉTODOS

JSP - ORIENTADO A OBJETOS

Classes Abstratas e Interfaces

Polimorfismo. Prof. Leonardo Barreto Campos 1

Pratica JFlex. Prática criando o primeiro analisador léxico

Programação Orientada a Objetos C++

Transcrição:

Herança

Herança A idéia é criar novas Classes construindo-as sobre outras existentes Ao herdar de uma classe, reusamos (herdamos) seus métodos E podemos adicionar novos métodos e campos para adaptar a nova classe para novas situações

Classes, Superclasses e Subclasses Vamos aprimorar nosso exemplo de classe Employee, adicionando uma nova classe Manager Um gerente é um empregado [também] possui salário, tem uma data de contratação, um nome Mas, adicionalmente, pode ter um bônus no salário

Classes, Superclasses e Subclasses Vamos aprimorar nosso exemplo de classe Employee, adicionando uma nova classe Manager Um gerente é um empregado [também] possui salário, tem uma data de contratação, um nome Mas, adicionalmente, pode ter um bônus no salário Tudo o que foi implementado em Employee (atributos, métodos) é preservado public class Manager extends Employee // métodos e atributos adicionados

Classes, Superclasses e Subclasses Ao usar extends, indicamos que estamos criando uma nova classe que deriva de uma classe existente a classe existente é chamada superclasse, classe base ou classe pai a nova classe é chamada subclasse, classe derivada ou classe filha public class Manager extends Employee // métodos e atributos adicionados

Classes, Superclasses e Subclasses Apesar da denominação talvez dar a entender o contrário, a superclasse não é superior à subclasse. O contrário que é verdade, uma vez que a subclasse herda tudo que a superclasse possui e Ao usar extends, indicamos que estamos criando uma nova classe que deriva de uma classe existente adiciona novas funcionalidades. a classe existente é chamada superclasse, classe base ou classe pai a nova classe é chamada subclasse, classe derivada ou classe filha public class Manager extends Employee // métodos e atributos adicionados

public class Manager extends Employee private double bonus; // outros atributos e métodos public void setbonus(double b) bonus = b;

public class Manager extends Employee private double bonus; // outros atributos e métodos public void setbonus(double b) bonus = b; //se temos um objeto do tipo Manager Manager boss =...; boss.setbonus(5000);

public class Manager extends Employee private double bonus; // outros atributos e métodos public void setbonus(double b) bonus = b; //se temos um objeto do tipo Manager Manager boss =...; boss.setbonus(5000); //se temos um objeto do tipo Employee Employee emp =...; emp.setbonus(5000); //ERRO!! O método não existe

public class Manager extends Employee private double bonus; // outros atributos e métodos public void setbonus(double b) bonus = b; //se temos um objeto do tipo Manager Manager boss =...; boss.setbonus(5000); boss.getname(); boss.getsalary(); boss.gethireday();

public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; n, double s, int year, int month, int calendar = new GregorianCalendar(year, // outros atributos e métodos public void setbonus(double b) bonus = b; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; Além de poder usar os métodos da superclasse, todos os campos em Employee também existem em Manager. Ou seja, todos os objetos do tipo Manager têm 4 atributos: name, salary, hireday e bonus.

public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; n, double s, int year, int month, int calendar = new GregorianCalendar(year, // outros atributos e métodos public void setbonus(double b) bonus = b; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; Ao criar uma subclasse, herdamos tudo e apenas indicamos (implementamos) as diferenças entre elas. Uma ação comum de refatorção de código em Orientação à Objetos é justamente criar superclasses mais genéricas com código comum.

public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; n, double s, int year, int month, int calendar = new GregorianCalendar(year, // outros atributos e métodos public void setbonus(double b) bonus = b; public double getsalary() return salary; public Date gethireday() return hireday; esse método funciona adequadamente para um Manager? public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;

public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; // outros atributos e métodos public double getsalary() return salary + bonus; //não! public String getname() return name; public double getsalary() return salary; public void setbonus(double b) bonus = b; public Date gethireday() return hireday; sobreposição (override) public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;

public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; // outros atributos e métodos public double getsalary() return salary + bonus; //não! public String getname() return name; public double getsalary() return salary; public void setbonus(double b) bonus = b; public Date gethireday() return hireday; subclasses não podem acessar os atributos privados da superclasse! public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;

public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; // outros atributos e métodos public double getsalary() return getsalary() + bonus;// ainda n! public String getname() return name; public double getsalary() return salary; public void setbonus(double b) bonus = b; public Date gethireday() return hireday; subclasses podem acessar os atributos e métodos públicos da superclasse! public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;

public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; // outros atributos e métodos public double getsalary() return getsalary() + bonus;// ainda n! public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; public void setbonus(double b) bonus = b; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;

public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; public double getsalary() return salary; n, double s, int year, int month, int calendar = new GregorianCalendar(year, // outros atributos e métodos public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b; public Date gethireday() return hireday; indicação que desejamos acessarum método sobreposto da superclasse public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise;

public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; n, double s, int year, int month, int calendar = new GregorianCalendar(year, public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; // outros atributos e métodos public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b; Ao criar uma subclasse, herdamos tudo e apenas indicamos (implementamos) as diferenças entre elas. Podemos adicionar adicionar atributos e adicionar ou sobrepor métodos mas nunca podemos remover atributos ou métodos!

public class Employee private String name; private double salary; private Date hireday; public class Manager extends Employee private double bonus; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; n, double s, int year, int month, int calendar = new GregorianCalendar(year, public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; // outros atributos e métodos public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b; Ao criar uma subclasse, herdamos tudo e apenas indicamos (implementamos) as diferenças entre elas. Podemos adicionar adicionar atributos e adicionar ou sobrepor métodos mas nunca podemos remover atributos ou métodos!

public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; public Manager(String n, double s, int year, int month, int day) super(n, s, year, month, day); bonus = 0; public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b;

public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; public Manager(String n, double s, int year, int month, int day) super(n, s, year, month, day); bonus = 0; public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double b) bonus = b; chama o construtor da superclasse única forma de inicializar os atributos privados herdados da superclasse

public class Employee private String name; private double salary; private Date hireday; day) public Employee(String name = n; salary = s; GregorianCalendar month - 1, day); hireday = calendar.gettime(); n, double s, int year, int month, int calendar = new GregorianCalendar(year, public class Manager extends Employee private double bonus; public Manager(String n, double s, int year, int month, int day) super(n, s, year, month, day); bonus = 0; public String getname() return name; public double getsalary() return salary; public Date gethireday() return hireday; public void raisesalary(double bypercent) double raise = salary * bypercent / 100; salary += raise; public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; Se nenhum construtor public voidda setbonus(double superclasse b) é chamado explícitamente, o construtor padrão é chamado automaticamente. bonus Caso= b; não exista o construtor padrão é gerado um erro de compilação. As mesmas regras gerais sobre construtores também se aplicam as subclasses.

// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary());

// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); // saída do programa name=carl Cracker,salary=85000.0 name=harry Hacker,salary=50000.0 name=tommy Tester,salary=40000.0

// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); é sempre executado o método correto// de acordo saídacom do o tipo programa do objeto name=carl Cracker,salary=85000.0 name=harry Hacker,salary=50000.0 name=tommy Tester,salary=40000.0

// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); O fato de uma variável objeto poder referenciar múltiplos tipos reais diferentes é chamado polimorfismo. O fato de automaticamente chamar os metodos corretos, de acordo com o tipo real de um objeto, é chamado ligação dinâmica.

Hierarquia da Herança Podemos adionar muitas outras subclasses em Manager Por exemplo: Executive A coleção de todas as classes que herdam de uma superclasse comum é chamada de hierarquia da herança O caminho de uma subclasse em particular pelos seus ancestrais é chamado de cadeia hierárquica

Polimorfismo Uma regra simples para ajudar na decisão de usar ou não herança é a regra do é um Todo gerente é um empregado, mas nem todo empregado é gerente Outro é o princípio da substituição Indica que você pode usar um objeto da subclasse quando o programa espera um da superclasse Toda variável objeto em Java é polimórfica!

Polimorfismo Uma regra simples para ajudar na decisão de usar ou não herança é a regra do é um Um gerente é um empregado, mas nem todo empregado é gerente Outro é o princípio da substituição Indica que você pode usar um objeto da subclasse quando o programa espera um da superclasse Toda variável objeto em Java é polimórfica! Employee e; e = new Employee("João", 1000, 2015, Calendar.OCTOBER, 20); e = new Manager("João", 1000, 2015, Calendar.OCTOBER, 20); Manager boss = new Manager("Carl Cracker, 80000, 1987, 12, 15); Employee[] staff = new Employee[3]; staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);

// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); se referem ao mesmo objeto

// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); boss.setbonus(5000); // OK staff[0].setbonus(5000); // Erro! Manager m = staff[0]; // Erro!

Prevenindo a Herança Classes e métodos finais com o modificador final Pode ser útil quando você não quer que alguma subclasse mude a semântica de um método Ou ainda quando existe um método importante e complexo que você nãoquerqueumasubclasse faça alguma besteira vocêassume toda a responsabilidade por esse método

Prevenindo a Herança Classes e métodos finais com o modificador final public class Employee nenhuma subclasse pode sobrepôr public Employee(String n, double s, int year, int month, int day) name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public final String getname() return name;

Prevenindo a Herança Classes e métodos finais com o modificador final public final class Employee nenhuma subclasse pode ser criada public Employee(String n, double s, int year, int month, int day) name = n; salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getname() return name;

// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); // Coerção Manager m = (Manager) staff[0]; // OK Manager m = (Manager) staff[1]; // Erro!

// constrói um Manager Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000); Employee[] staff = new Employee[3]; // preenche o array com Manager e Employee staff[0] = boss; staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1); staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15); // imprime informacoes sobre os empregados for (Employee e : staff) System.out.println("name=" + e.getname() + ",salary=" + e.getsalary()); // Coerção if (staff[1] instanceof Manager) boss = (Manager) staff[1];

Classes Abstratas Uma superclasse pode ser tão genérica que pode se tornar apenas uma base (ou modelo) e não uma classe que poderia gerar instâncias utilizáveis Pode possuirmétodos quesó permitam implementaçõesem uma subclasse Por exemplo, adicionando uma classe Person como super classe de Employee e Manager

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; faz sentido para toda pessoa (empregado, gerente ) public String getname() return name;

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) como descrever uma pessoa (nome, salário) se não sabemos qual função dela? name = n; public String getname() return name;

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; define método como abstrato sem implementação

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; a classe também deve ser abstrata

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; pode possuir atributos e métodos concretos!

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; Person p = new Person("João"); // Erro! Person p = new Employee("Harry Hacker", 50000, 1989, 10, 1); // OK public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //...

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; public class Student extends Person private String major; public Student(String n, String m) super(n); major = m; public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //... public String getdescription() return "a student majoring in " + major;

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; public class Student extends Person private String major; public Student(String n, String m) super(n); major = m; public String getdescription() return "a student majoring in " + major; public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //... Person[] people = new Person[2]; people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1); people[1] = new Student("Maria Morris", "computer science"); for (Person p : people) System.out.println(p.getName() + ", " + p.getdescription());

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() Person[] people = new Person[2]; return String.format("an employee with public class Student extends people[0] Person= new Employee("Harry Hacker", a salary 50000, of $%.2f", 1989, 10, salary); 1); people[1] = new Student("Maria Morris", "computer science"); private String major; public Student(Stringfor n, (Person String m) p : people) super(n); major = m; //... System.out.println(p.getName() + ", " + p.getdescription()); // saída do programa public String getdescription() return "a student majoring in " + major; Harry Hacker, an employee with a salary of $50000,00 Maria Morris, a student majoring in computer science

public abstract class Person public abstract String getdescription(); private String name; public Person(String n) name = n; public String getname() return name; public class Student extends Person private String major; public Student(String n, String m) super(n); major = m; public String getdescription() return "a student majoring in " + major; public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //... só é possível chamar em Pessoa por ter declarado como abstrato, não baster ser implementado nas subclasses Person[] people = new Person[2]; people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1); people[1] = new Student("Maria Morris", "computer science"); for (Person p : people) System.out.println(p.getName() + ", " + p.getdescription());

public abstract class Person private String name; private int age = -1; public class Employee extends Person private double salary; private Date hireday; public Person(String n) name = n; public String getname() return name; public int getage() return age; protected void setage(int anage) age = anage; public abstract String getdescription(); public Employee(String n, double s, int year, int month, int day) super(n); setage(25); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //...

public abstract class Person private String name; private int age = -1; public class Employee extends Person private double salary; private Date hireday; public Person(String n) name = n; public String getname() return name; public int getage() return age; protected void setage(int anage) age = anage; public abstract String getdescription(); pode chamar public Employee(String n, double s, int year, int month, int day) super(n); setage(25); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //...

public abstract class Person private String name; private int age = -1; public Person(String n) name = n; public String getname() return name; public int getage() return age; protected void setage(int anage) age = anage; public abstract String getdescription(); não pode chamar public class Employee extends Person private double salary; private Date hireday; public Employee(String n, double s, int year, int month, int day) super(n); setage(25); salary = s; GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day); hireday = calendar.gettime(); public String getdescription() return String.format("an employee with a salary of $%.2f", salary); //... Person[] people = new Person[2]; people[0] = new Employee("Harry Hacker", 50000, 1989, 10, 1); people[1] = new Student("Maria Morris", "computer science"); for (Person p : people) p.setage(21);

Modificadores de Acesso Modificador public protected private padrão (nenhummodificador) Visibilidade Para o mundo Para o pacote e todas subclasses Apenas para a classe Para o pacote

A Classe Object Todo objeto em Java herda dessa classe mesmo que não explicitamente Alguns métodos são úteis boolean equals(object obj) int hashcode() String tostring()

public class ArrayListTest public static void main(string[] args) ArrayList<Employee> staff = new ArrayList<Employee>(); staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15)); staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1)); staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15)); for (Employee e : staff) e.raisesalary(5); staff.get(0); staff.remove(1); Employee joao = new Employee("João", 45000, 2001, 2, 1); staff.remove(joao);

public class Manager extends Employee private double bonus; public Manager(String n, double s, int year, int month, int day) super(n, s, year, month, day); bonus = 0; public double getsalary() double basesalary = super.getsalary(); return basesalary + bonus; public void setbonus(double... somebonus) bonus = 0; for (double b : somebonus) bonus += b; Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setbonus(5000, 4000, 1000);

name = "java.lang.string"; Class cl = Class.forName(name); Class supercl = cl.getsuperclass(); String modifiers = Modifier.toString(cl.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " "); System.out.print("class " + name); if (supercl!= null && supercl!= Object.class) System.out.print(" extends " + supercl.getname()); System.out.print("\n\n"); printconstructors(cl); System.out.println(); printmethods(cl); System.out.println(); printfields(cl); System.out.println(""); public static void printmethods(class cl) Method[] methods = cl.getdeclaredmethods(); for (Method m : methods) Class rettype = m.getreturntype(); String name = m.getname(); System.out.print(" "); // print modifiers, return type and method name String modifiers = Modifier.toString(m.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " " System.out.print(retType.getName() + " " + name + "("); // print parameter types Class[] paramtypes = m.getparametertypes(); for (int j = 0; j < paramtypes.length; j++) if (j > 0) System.out.print(", "); System.out.print(paramTypes[j].getName()); System.out.println(");");

name = "java.lang.string"; Class cl = Class.forName(name); Class supercl = cl.getsuperclass(); String modifiers = Modifier.toString(cl.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " "); System.out.print("class " + name); if (supercl!= null && supercl!= Object.class) System.out.print(" extends " + supercl.getname()); System.out.print("\n\n"); printconstructors(cl); System.out.println(); printmethods(cl); System.out.println(); printfields(cl); System.out.println(""); // saída do programa public static void printmethods(class cl) Method[] methods = cl.getdeclaredmethods(); for (Method m : methods) Class rettype = m.getreturntype(); String name = m.getname(); System.out.print(" "); // print modifiers, return type and method name String modifiers = Modifier.toString(m.getModifiers()); if (modifiers.length() > 0) System.out.print(modifiers + " " System.out.print(retType.getName() + " " + name + "("); // print parameter types Class[] paramtypes = m.getparametertypes(); for (int j = 0; j < paramtypes.length; j++) if (j > 0) System.out.print(", "); System.out.print(paramTypes[j].getName()); System.out.println(");"); public boolean equals(java.lang.object); public java.lang.string tostring(); public int hashcode(); public int compareto(java.lang.string); public volatile int compareto(java.lang.object); public int indexof(int); public int indexof(java.lang.string);