Apresentac~ao Java { conceitos Basicos Java Basico | I I I Parte II Polimorsmo em Java I denic~ao I exemplos I Qualicador abstract Excep co ~es I throws, try, catch e nally Interfaces I implements I \heranca multipla" em Java Rui Camacho Apresentac~ao Java { conceitos Basicos Complementos de Programac~ao e Algoritmos { LEIC Polimorsmo em Java Propriedade que permite tratar objectos de subclasses diferentes como objectos de uma unica superclasse seleccionando automaticamente os metodos apropiados a cada objecto. Para obter um comportamento polimorco fazer: I denir os metodos polimorcos numa superclasse comum I utilizar a sobreposic~ao de metodos para sobrepor os metodos em cada classe que os herda Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Polimorsmo { exemplo { public class Colorf protected int intensity; // Intensity of color public Color() f System.out.println("In constructor Color():"); intensity = 0; g public Color(int intensity) f System.out.println(\In constructor \+ \Color(int intensity):"); this.intensity = intensity; g // Convert to string public String toString() f System.out.println("In Color.toString():"); String s = "Color: intensity = " + intensity; return s; g g Rui Camacho Apresentac~ao Java { conceitos Basicos exemplo do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Polimorsmo { exemplo (cont.) Complementos de Programac~ao e Algoritmos { LEIC { public class Red extends Colorf public Red() f System.out.println("In constructor Red():"); g public Red(int intensity) f super(intensity); System.out.println("In constructor Red(int intensity):"); g public String toString() f System.out.println("In Red.toString():"); String s = "Red: intensity = " + intensity; return s; g g exemplo do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Polimorsmo { exemplo (cont.) { public class Green extends Colorf public Green() f System.out.println("In constructor Green():"); g public Green(int intensity) f super(intensity); System.out.println("In constructor Green(int intensity):"); g public String toString() f System.out.println("In Green.toString():"); String s = "Green: intensity = " + intensity; return s; g g exemplo do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Rui Camacho Apresentac~ao Java { conceitos Basicos Polimorsmo { exemplo (cont.) Complementos de Programac~ao e Algoritmos { LEIC { public class Blue extends Colorf public Blue() f System.out.println("In constructor Blue():"); g public Blue(int intensity) f super(intensity); System.out.println("In constructor Blue(int intensity):"); g public String toString() f System.out.println("In Blue.toString():"); String s = "Blue: intensity = " + intensity; return s; g g exemplo do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Polimorsmo { exemplo (cont.) { public class TestColorf public static void main(String[] args) f Color c[] = new Color[3]; c[0] = new Red(120); c[1] = new Green(255); c[2] = new Blue(); g g System.out.println("nnColor values:"); for ( int i = 0; i < c.length; i++ ) System.out.println("Color = " + c[i]); exemplo do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Rui Camacho Apresentac~ao Java { conceitos Basicos Polimorsmo { exemplo In In In In In In Resultado: (cont.) constructor constructor constructor constructor constructor constructor Complementos de Programac~ao e Algoritmos { LEIC { Color(int intensity): Red(int intensity): Color(int intensity): Green(int intensity): Color(): Blue(): Color values: In Red.toString(): Color = Red: intensity = 120 In Green.toString(): Color = Green: intensity = 255 In Blue.toString(): Color = Blue: intensity = 0 exemplo do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Modicador abstract I I I I Metodo abstract n~ao tem corpo. Declarac~ao de funcionalidades que as classes derivadas devem fornecer Classe abstract n~ao tem inst^ancias uma classe abstract pode implementar alguns dos metodos, especicando outros como abstract todas as subclasses de uma classe abstract t^em que reescrever todos os metodos abstract da superclasse public abstract class Formaf public abstract void desenha(); g public class Circulo extends Formaf public void desenha()f ..... co digo aqui ... g g Rui Camacho Apresentac~ao Java { conceitos Basicos Complementos de Programac~ao e Algoritmos { LEIC Excepco~es Uma excepc~ ao e um evento que interrompe o normal uxo de execuc~ao de um programa (geralmente um erro) I quando um metodo n~ao consegue completar o seu processamento normal atira (throws) uma excepc~ao I excepc~oes s~ao objectos da classe Exception ou de suas subclasses I s~ao essencialmente usadas para tratar erros que devem ser tratados a um nvel diferente do nvel onde o erro ocorreu Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Excepco~es { exemplo { public class InvalidDateException extends Exceptionf public InvalidDateException() g g f super(\Data invalida"); public class Datef private int year; // Year (0 - xxxx) private int month; // Month (1 - 12) private int day; // Day (1 - 31) public Date(int day, int month, int year) throws InvalidDateException f g setDate( day, month, year ); // Method to check for leap year public boolean isLeapYear() f boolean leap year; if ( year % 400 == 0 ) leap year = true; else if ( year % 100 == 0 ) leap year = false; else if ( year % 4 == 0 ) leap year = true; else leap year = false; g return leap year; public String toString() g Rui Camacho Apresentac~ao Java { conceitos Basicos f Complementos de Programac~ao e Algoritmos { LEIC return (month + "/" + day + "/" + year); Excepco~es { exemplo (cont) { public void setDate(int day, int month, int year) throws InvalidDateException f int maxDays = 0; // Max days in a month < if ( year 0 ) throw new InvalidDateException(); else this.year = year; if ( month < 1 jj month > 12 ) throw new InvalidDateException(); else this.month = month; switch ( month ) f case 1: case 3: case 5: case 7: case 8: case 10: case 12: maxDays = 31; break; case 4: case 6: case 9: case 11: maxDays = 30; break; case 2: if ( isLeapYear()) maxDays = 29; g else maxDays = 28; if ( day < 1 jj day > maxDays ) throw new InvalidDateException(); g g else this.day = day; Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Processamento de Excepc~oes exemplo do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 8) Rui Camacho Apresentac~ao Java { conceitos Basicos Complementos de Programac~ao e Algoritmos { LEIC Processamento de Excepc~oes I Todas as classes Java t^em que tratar (catch) qualquer excepc~ao vericavel em tempo-de-compilac~ao que ocorra dentro do seu domnio ou ent~ao explicitamente atira-la (throw) I as excepco~es s~ao atiradas incluindo a palavra throws na denic~ao do metodo public void setData(int dia, int mes, int ano) throws ExcepcaoDataInvalidaf I criadas com new (s~ao objectos) e atiradas com throw throw new InvalidDateException() Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Processamento de Excepc~oes I I qualquer excepc~ao atirada por um metodo deve ser apanhada e tratada ou re-atirada por todos os metodos acima na arvore de chamadas se todos os metodos re-atirarem a excepc~ao ent~ao o programa mostra uma mensagem de erro e aborta tryf g ... // codigo onde pode ocorrer um erro catch(Excep1 e)f ... // executado caso ocorra excepcao da class Excep1 ou subclasse g catch(Excep2 e)f ... // executado caso ocorra excepcao da class Excep2 ou subclasse g .... nallyf ... // sempre executado ocorra ou nao excepcao g Rui Camacho Apresentac~ao Java { conceitos Basicos Complementos de Programac~ao e Algoritmos { LEIC Heranca multipla Problema: como denir objectos que se enquadram em mais do que uma hierarquia public interface Noisyf String noise(); g public interface Movesf String move(); g Interface: I I I abstracta: n~ao pode ser implementada independentemente de uma classe metodos s~ao public abstract atributos s~ao public static nal Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Interfaces public class Cat extends Animal implements Noisy, Movesf String name; public Cat()f; name = new String(\cat"); g public String noise()f; return \MEOW"; g public String move()f; return \feet"; g g public class Car extends Machine implements Noisy, Movesf String name; public Cat()f; name = new String(\car"); g public String noise()f; return \VROOM"; g public String move()f; return \wheels"; g g public class Earf String heard; void hear(Noisy n)f heard = n.noise(); g g Rui Camacho Apresentac~ao Java { conceitos Basicos Complementos de Programac~ao e Algoritmos { LEIC Interfaces { exemplo public interface Relationf // Devolve true se a > b, em que a e' o ojecto corrente public boolean isGreater( Object b ); Devolve true se a < b, em que a e' o ojecto corrente public boolean isLess( Object b ); g // Devolve true se a == b, em que a e' o objecto corrente public boolean isEqual( Object b ); exemplo traduzido do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Interfaces { exemplo public class SortObj f public static Object[] sort(Object[] obj) f // Denicao do metodo de ordenacao int i, j; // Indices para os ciclos for int menor; // Guarda o valor mais pequeno Object temp; // para trocar el. vector for ( i = 0; i < obj.length-1; i++ ) f menor = i; for ( j = i+1; j < obj.length; j++ ) if (((Relation) obj[j]).isLess((Relation) obj[menor])) menor = j; if (i != menor) f temp = obj[i]; obj[i] = obj[menor]; obj[menor] = temp; g g g g return obj; // Devolve os objectos ordenados Rui Camacho Apresentac~ao Java { conceitos Basicos Complementos de Programac~ao e Algoritmos { LEIC exemplo traduzido do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Interfaces { exemplo public class Line implements Relation f private double x1; // First x value private double x2; // Second x value private double y1; // First y value private double y2; // Second y value public Line(double x1, double y1, double x2, double y2) f this.x1 = x1; this.x2 = x2; g this.y1 = y1; this.y2 = y2; public double length( ) g f return Math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ); // Returns true if current object > > b public boolean isGreater( Object b ) g return length() // Returns true if current object < public boolean isLess( Object b ) g return length() < f f return length() == ((Line)b).length(); public String toString( ) g b ((Line)b).length(); public boolean isEqual( Object b ) g f ((Line)b).length(); f g return "Line from (" + x1 + "," + y1 + ") to (" + x2 + "," + y2 + "): Length = " + length(); traduzido de \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC Apresentac~ao Java { conceitos Basicos Interfaces { exemplo public class TestLine f public static void main(String[] args) f Object objecto[] = new Line[5]; objecto[0] objecto[1] objecto[2] objecto[3] objecto[4] = = = = = new new new new new Line(0,0,2,1); Line(0,0,1,-1); Line(-1,1,1,1); Line(2,0,0,0); Line(0,2,-2,0); // Sort the objects in ascending order SortObj.sort( objecto ); for(int i = 0; i < objecto.length; i++ ) f System.out.println(objecto[i].toString()); g g g exemplo traduzido do livro \Java for Engineers and Scientists" , S. J. Chapman (cap tulo 9) Rui Camacho Complementos de Programac~ao e Algoritmos { LEIC