Algoritmos e Programação II Aula 3 – Sobrecarga *Adaptado do material do Prof. Júlio Machado Sobrecarga Em várias linguagens é comum encontrarmos rotinas que fazem basicamente a mesma coisa, porém, com nomes distintos porque se diferenciam nos tipos dos parâmetros. Ex.: classe Acumulador Dois métodos adicionaDouble e adicionaInt. Ambos somam o valor recebido como parâmetro ao atributo de instância. public class Acumulador { private double valor; public Acumulador() { valor = 0; } public double getValor() { return(valor); } public void adicionaDouble(double n) { valor = valor + n; } public void adicionaInt(int n) { valor = valor + n; } } 1 Em Java, podemos criar os dois métodos com o mesmo nome! A condição é que tenham uma lista de parâmetros diferentes. public class Acumulador { ... public void adiciona(double n) { valor = valor + n; } public void adiciona(int n) { valor = valor + n; } } 2 Chama-se de sobrecarga de métodos (overloading) o ato de criar diversos métodos com o mesmo nome que se diferenciam pela lista de argumentos (parâmetros). Métodos são identificados pela sua assinatura: nome do método + lista de parâmetros. Métodos com mesmo nome, mas com tipo, quantidade ou ordenação de parâmetros diferentes, são considerados métodos diferentes. Cuidado!!! Esses métodos possuem uma definição correta para sobrecarga? public void soma(int n, double d) public void soma(double d, int n) ? public void soma(int n) public void soma(int v) ? public void soma(int n) public double soma(int n) ? Na API de Java, diversas classes utilizam a sobrecarga de métodos, por exemplo: Classe String valueOf (boolean b) valueOf (char c) valueOf (double d) valueOf (float f) valueOf (int i) valueOf (long l) retorna a representação em String do argumento recebido. 3 Classe Vector • add(int indice, Object elemento) insere o elemento na posição indicada do vetor • add(Object elemento) insere o elemento no final do vetor • remove(int indice) remove o elemento da posição indicada do vetor • remove(Object elemento) busca e remove a primeira ocorrência do elemento encontrada no vetor Sobrecarga de Construtores Usualmente é útil para uma classe possuir mais de um construtor a fim de oferecer diversas maneiras para instanciar e inicializar os objetos dessa classe. Um construtor também pode sofrer o processo de sobrecarga. Exemplo: classe Circulo Deseja-se ter a capacidade de inicializar os atributos de um novo objeto de duas formas: através de um construtor sem parâmetros, que cria um círculo padrão de centro (0,0) e raio 1, e através de um construtor que recebe as informações de centro e raio para criar o círculo 4 public class Circulo { private int centrox; private int centroy; private int raio; public Circulo(int x, int y, int r){ if (x >= 0) centrox = x; else centrox = 0; if (y >= 0) centroy = y; else centroy = 0; if (r > 0) raio = r; else raio = 1; } public Circulo() { centrox = 0; centroy = 0; raio = 1; } ... } Testando a classe: public class TesteCirculo { public static void main (String args[]) { Circulo circ1 = new Circulo(); Circulo circ2 = new Circulo(1,2,4); System.out.println("Area circ1= " + circ1.area()); System.out.println("Area circ2= " + circ2.area()); } } Estudo de Caso Classe Professor Definir construtores para: Inicializar um professor informando um nome, número de matrícula e carga horária; Inicializar um professor informando o nome e número de matrícula, com carga horária padrão de 12 horas semanais. 5 Estudo de Caso – Construtores 1 public class Professor { ... public Professor(String n, int m, int c) { setNome(n); setMatricula(m); setCargaHoraria(c); } } public Professor(String n, int m) { setNome(n); setMatricula(m); setCargaHoraria(12); } ... Observando mais de perto a implementação dos dois construtores da classe Professor: Nota-se que o segundo construtor (o construtor com dois parâmetros) possui o mesmo código de inicialização do primeiro construtor (o construtor com três parâmetros). Repetir desnecessariamente código não é uma boa prática de programação. Java permite compartilhar código entre os diversos construtores!!! Palavra-chave this(). Estudo de Caso – Construtores 2 public class Professor { ... public Professor(String n, int m, int c) { setNome(n); setMatricula(m); setCargaHoraria(c); } } public Professor(String n, int m) { this(n,m,12); } Um construtor pode chamar outro construtor da mesma classe utilizando ... a chamada this( ). Deve obrigatoriamente ser o primeiro comando do corpo de definição do construtor sobrecarregado. 6 Exercícios 1. Altere a classe Ponto apresentada abaixo para apresentar três construtores: Um sem parâmetros, que cria um ponto nas coordenadas (0,0); Um que recebe dois parâmetros de coordenadas X e Y; Um que inicializa o ponto através das coordenadas de um outro ponto recebido como argumento. 2) Utilizando a classe Ponto, altere e introduza novos métodos na classe Circulo, através da sobrecarga, para realizar as seguintes funções: armazenar as coordenadas do centro em um objeto Ponto; construir novos círculos através da informação de um ponto central e raio; mover um círculo para um novo ponto central qualquer. 3) Desenvolva um programa em Java para testar todos os novos métodos desenvolvidos no exercício anterior para a classe Circulo. 4) Crie uma classe CadastroDePontos que armazena um conjunto de pontos em um ArrayList, e contenha um método para incluir novos pontos no cadastro e um método para imprimir as coordenadas de todos os pontos. 7 4) Acrescente à classe Ponto, desenvolvida anteriormente, a capacidade de calcular a distância entre dois pontos. Para tal, é desejado o seguinte comportamento: calcular a distância entre a instância do ponto e um outro objeto ponto qualquer; calcular a distância entre a instância do ponto e um outro ponto dado pelas coordenadas X e Y; calcular a distância entre dois pontos dadas as coordenadas X1, Y1 e X2, Y2. Obs: A distância entre dois pontos é calculada por: 5) Você está desenvolvendo um sistema de cálculos matemáticos e se depara com um problema: a necessidade de utilização de números complexos. Solicitando ajuda de um matemático, você obtém as seguintes informações: ... ... Números complexos possuem a forma parte real + parte imaginária * i como por exemplo 1+3i. i representa a raiz quadrada de -1. O número complexo resultante da soma é aquele cuja parte real é a soma das partes reais dos operandos, e a parte imaginária é a soma das partes imaginárias dos operandos. O número complexo resultante da subtração é aquele cuja parte real é a diferença das partes reais dos operandos, e a parte imaginária é a diferença das partes imaginárias dos operandos. Números complexos podem ser representados por extensão, como 1+3i, ou por uma forma resumida pelo par (parte real, parte imaginária), como (1,3). Um número real a qualquer, é representado pelo número complexo (a,0). Modele e implemente as estruturas necessárias para a utilização de números complexos em um programa Java. 8