Programação Orientada a Objetos e Java - Introdução Carlos Lopes POO e Java • Objetivo: proporcionar uma visão dos conceitos de POO e do seu uso na estruturação dos programas em Java. – Classes e objetos em Java – As duas principais partes de uma classe ou objeto: comportamento e atributo. – Herança de classes e a forma como ela afeta o projeto de programas. Pensando em Objetos • Exemplo do mundo real – Entrega de flores a um parente. Objetos e Classes • POO apresenta vários conceitos e aspectos que facilitam o processo de criação e uso de objetos. • Quando você escreve um programa em uma linguagem OO você define classes de objetos. • Uma classe em Java é uma “fábrica” de objetos. Objetos e Classes • Exemplo: você pode ter uma classe Árvore que descreve os aspectos de todas as árvores (tem folhas e raízes, cresce, produz clorofila). • A classe serve como um modelo abstrato de uma árvore. • Uma classe pode ser vista como uma implementação de um TAD. • Para cortar uma árvore você precisa ter uma instância concreta daquela árvore. Objetos e Classes • Uma vez que você tenha uma classe Árvore você pode criar várias instâncias diferentes daquela árvore (baixa, alta,...) comportando-se e sendo reconhecidas como árvore. • Mais uma vez: uma classe pode ser vista como uma fábrica de objetos ou instâncias concretas da classe. Objetos e Classes • Exemplo: A classe Botão para o elemento da interface gráfica botão. – A classe Botão define os aspectos de um botão e seu comportamento – Aspectos de um botão: rótulo, tamanho, aparência. – Comportamento: • Ativado com um simples ou duplo click? • Altera sua cor quando selecionado? • O que ele faz quando é ativado? Objetos e Classes • Exemplo: A classe Botão (cont.) – Uma vez que você tenha a classe Botão você pode criar vários objetos desta classe. – Os objetos criados possuem os mesmos aspectos existentes na classe Botão. Entretanto, podem ter aparências e comportamentos diferentes baseados naquilo que você quer que um determinado botão faça. Objetos e Classes • Quando você escreve um programa Java você projeta e constrói um conjunto de classes. • Quando seu programa é executado os objetos daquelas classes são criados e descartados quando necessários. • Sua tarefa como programador Java é criar um conjunto de classes que possa proporcionar os resultados desejados. Objetos e Classes • O ambiente Java apresenta uma biblioteca de classes que implementam muito do comportamento básico que você necessitará. – Funções matemáticas, vetores, strings, gráficos, classes para desenvolvimento de aplicações cliente/servidor etc. • Num programa muito simples você pode ter uma única classe que usa as outras classes da biblioteca. • Num programa mais sofisticado você provavelmente necessitará criar mais de uma classe que apresente interações entre elas. Comportamentos e Atributos • Geralmente toda classe em Java é constituída por dois componentes: atributos e comportamentos. • Os atributos são propriedades que diferenciam um objeto do outro e determinam sua aparência, estado e outras qualidades do objeto. Comportamentos e Atributos • Exemplo: vamos criar uma classe Motocicleta. Os atributos desta classe podem ser: – Cor: vermelho, preta, ... – Fabricante: Honda, Yamaha, ... – ... • Os Atributos são definidos por variáveis denominadas variáveis de instância.Cada objeto pode ter valores diferentes para suas variáveis de instância. Atributos • As variáveis de instância podem receber valores quando o objeto é criado e permanecer com estes valores durante o tempo de vida do objeto ou podem mudar durante a execução do programa. • Além das variáveis de instância existem as variáveis de classe. Diferente das variáveis de instância, os valores das variáveis de classe são armazenados na classe. Veremos com mais detalhes tais variáveis em aulas futuras. Comportamento • O comportamento da classe define o que os objetos da classe devem fazer quando recebem algum pedido (mensagem). • Exemplo: Continuando com a classe Motocicleta, alguns comportamentos associados a esta classe incluem: – – – – Liga o motor Desliga o motor Acelere Mude a marcha Comportamento • Para definir o comportamento da classe você cria métodos. • Métodos são funções definidas dentro da classe. • Métodos nem sempre afetam um único objeto. • Assim como existem variáveis de instância e variáveis de classe, também tem-se métodos de instância e métodos de classe. • Os Métodos de instância aplicam-se a objetos da classe. Os métodos de classe aplicam-se a classes. Criando uma Classe Class Motocicleta { String Fabricante; String Cor; Boolean estadoDoMotor; public Motocicleta(nomeDoFabricante, nomeDaCor){ Fabricante = nomeDoFabricante; Cor = nomeDaCor; } void funcionaMotor( ) { if (estadoDoMotor == true) System.out.println(“O motor já está funcionando.”) else { estadoDoMotor = true; System.out.println(“O motor agora está funcionando.”) } } } Criando uma Classe • Antes de compilar o código presente na transparência anterior vamos acrescentar mais um método que mostra os valores das variáveis de instância de um objeto motocicleta. void mostraAtributos( ){ System.out.println(“Esta motocicleta é uma” + fabricante + “ ” + cor); if (estadoDoMotor == true) System.out. println(“O motor está funcionando. ”); else System.out.println(“O motor está desligado.”) } Criando uma Classe • Após compilar o código descrito anteriormente tente executá-lo. Você obterá a seguinte mensagem: In class Motocicleta: void main(String argv[]) is not defined Java assumiu que a classe é um aplicativo e procurou por um Método main. Entretanto, a classe não possui um método main. Para criar objetos da classe Motocicleta você necessitará criar um aplicativo Java que use esta classe ou adicionar um método main a ela. Criando uma Classe public static void main(String args[ ]){ Motocicleta m = new Motocicleta(“Yamaha RZ135”, “Vermelha”); m.mostraAtributos( ); m.funcionaMotor( ); m.mostraAtributos( ); m.funcionaMotor( ); } Herança • Herança é um conceito primordial em POO • A herança é um mecanismo poderoso que permite que você possa escrever uma classe especificando apenas aqueles aspectos que a diferem de alguma outra classe existente. • Para usufruir da herança todas as classes devem estar dispostas segundo uma hierarquia. Herança: Exemplo Object Veículo VeiculoMotorizado VeiculoNaoMotorizado Herança • Conceitos: Superclasse e Subclasse • Exemplo: criando uma versão de Botão com rótulo pré-definido. – Tudo que se tem a fazer é definir uma classe que seja subclasse de Botão. – A subclasse herdará automaticamente todo o comportamento definido na classe Botão. – Tudo que você deve fazer é especificar na subclasse o comportamento que a difere de Botão. Criando uma Hierarquia de Classes • Um planejamento na organização das classes fazse necessário. – Quando desenvolvendo suas classes numa hierarquia você pode fatorar informação comum em superclasses. Assim cada subclasse usa a informação da superclasse. – Mudando ou inserindo uma classe numa hierarquia superior faz com que as mudanças sejam automaticamente sentidas nas classes inferiores. Criando uma Hierarquia de Classes • Exemplo: Suponha que já temos implementado a classe Motocicleta e queremos agora criar a classe Carro. – Carro e Motocicleta têm muitos aspectos em comum. – Ao invés de abrir um arquivo Carro e copiar várias informações definidas na classe Motocicleta, um plano melhor seria fatorar as propriedades comuns numa hierarquia de classes mais geral. Criando uma Hierarquia de Classes VeiculoMotorizado VeiculoMotorizadoDe2Rodas Motocicleta Scooter VeiculoMotorizadoDe4Rodas Carro Criando uma Subclasse • Provavelmente o exemplo mais típico de criação de uma subclasse ocorre quando criamos um applet. • Todos os applets são subclasses da classe Applet (pacote AWT) ou JApplet (pacote Swing). • Quando você escreve um applet existem vários métodos definidos na superclasse que você comumente deverá redefinir. Um destes métodos é o método paint() que mostra seu applet na tela. Criando uma Subclasse: Exemplo public class MeuPrimeiroApplet extends java.applet.Applet{ Font f = new Font(“TimesRoman”,Font.Bold,36); public void paint(Graphics g){ g.setFont(f); g.setColor(Color.red); g.drawString(“Meu Primeiro Applet!”,5,50); } } Criando uma Subclasse: Exemplo • A compilação da classe descrita anteriormente gerará erros. • É necessário importar as classes Graphics, Font e Color. import java.awt.Graphics; import java.awt.Font; import java.awt.Color; Ou import java.awt.*; Funcionamento da Herança • Como é que objetos de uma classe podem obter variáveis e métodos das classes hierarquicamente superiores? – Para variáveis de instância, quando você cria um objeto de uma classe você tem um “slot” para cada variável definida na classe corrente e para cada variável definida em todas as suas superclasses. Funcionamento da Herança • Como é que objetos de uma classe podem obter variáveis e métodos das classes hierarquicamente superiores? – Para métodos: novos objetos têm acesso a todos os nomes de métodos definidos na sua classe e em suas superclasses. Quando um método é chamado Java procura inicialmente pela definição do método na classe do objeto. Se o método não se encontra , ele procura pelo método na superclasse. Se ele não se encontra na superclasse ele procura pelo método na superclasse da superclasse e assim sucessivamente até encontrar ou não. Funcionamento da Herança Associações entre Classes ● Duas principais associações: agregação e composição. ● Agregação: estabelece uma relação todo-parte entre classes, sendo que a parte pode existir sem o todo. ● ● Exemplo: Carro e Roda. Uma Roda é parte de um Carro, porém pode a Roda existe por si só fora do Carro. Você pode por exemplo remover a roda de um carro para colocar em outro. Composição: estabelece uma relação todo-parte entre classes, sendo que a parte NÃO existe sem o todo. ● Pedido e Itens de Pedido. Se você destruir o Pedido, os Itens são destruidos junto, eles não tem sentido se não houver um Pedido.