Capítulo 2 Classes em Java INTRODUÇÃO Uma classe é um conjunto de software que representa uma realidade qualquer, que pode ser representada por números e símbolos. Uma classe possui dados de um ou mais tipos e métodos que actuam sobre dados específicos. A classe é a arquitectura de um objecto. É a representação geral de vários casos particulares (os Objectos). A classe é um ficheiro texto com extensão.java onde o nome da classe é o nome do ficheiro.java. Ou seja se tivermos o ficheiro teste.java o nome da classe tem de ser teste. INICIAÇÃO Por norma o nome de uma classe deve respeitar a seguinte regra: 1ªLetra : Maiúscula. Restantes: Minusculas, excepto quando for outra palavra agregada. Por norma o nome de um método(que não um construtor) e dos dados respeitam a seguinte regra: 1ªLetra : Minúscula. Restantes: Minusculas, excepto quando for outra palavra agregada. Exs: ClasseTeste, Macacada //CORRECTO classeteste, macacada //INCORRECTO metodoteste, macacada //CORRECTO MetodoTeste, Macacada //INCORRECTO dadosteste, macacada //CORRECTO DadosTeste, Macacada //INCORRECTO 1
ESTRUTURA DE UMA CLASSE package ClassPath; //Se estiver na root não é necessário colocar Package /* Não é obrigatório colocar import (O import é a instrução que permite dizer onde se vai buscar classes que não pertençam ao mesmo package) */ import _ public class NOMEDACLASSE //ZONA DE DADOS (Vem antes dos construtores, local onde se define variáveis) //ZONA DE MÉTODOS (Um construtor é um método) //Construtor por default da classe CasseMain public NOMEDACLASSE() //Construtor por argumentos public NOMEDACLASSE(TIPO NOMEARGUMENTO1,TIPO NOMEARGUMENTO2, ) /* Pode-se fazer quantos construtores se quiser, desde que possuam argumentos diferentes */ //Método que retorna valores e não possui argumentos public TIPORETORNO NOMEMETODO1() //Método que não retorna valores(ver void) e recebe argumentos public void NOMEMETODO1(TIPO NOMEARGUMENTO1, TIPO NOMEARGUMENTO2, ) Ex: Pessoa.java 2
CLASSE MAIN Em java e em grande parte das linguagens a classe main é SEMPRE a primeira classe a ser executada. A classe main pode ter uma designação qualquer, mas o que a diferencia das outras é que possui um método denominado "main" que é a primeira zona de código a ser executada. Para executar uma operação de soma, criar um objecto, em suma, criar um programa, é necessário que haja um main. Todo o código que queremos correr tem de estar de alguma forma, ligado a esse main (caso excepcional: Applet). O main pode receber x número de argumentos do tipo String (Ver glossário). Esses argumentos são recebidos na variável args[]. Para saber quantos argumentos se encontram em args, basta usar o método do array.length; Ex: public class nomedaclassequetemomain public static void main(string args[]) int numeroargumentos=args.length; HERANÇA DE CLASSES É um processo que permite a uma classe obter métodos e dados que se encontram implementados ou por implementar, noutra classe distinta. Existem dois tipos de herança: 1) Herança Simples: Permite a uma classe usar os métodos e dados de outra classe, mas só de uma. 2) Herança Multipla: Permite a uma classe usar determinados métodos e dados de uma ou mais classes, com as quais não possuem qualquer relação lógica. 3
Exs: 1) public class ClassePai int valor; public ClassePai() public class ClasseFilho extends ClassePai public ClasseFilho() A ClasseFilho herda os métodos e dados da ClassePai neste caso herda uma variável valor e um método/construtor. 2) public interface Comunicador public String infotextual(); public class ClasseProdutoraDeTexto1 implements comunicador public ClasseProdutorDeTexto() public String infotextual return new String("O meu texto específico"); 4
public class ClasseProdutoraDeTexto2 implements comunicador public ClasseProdutorDeTexto() public String infotextual return new String("O meu texto MARAVILHA"); public class ClasseMostraTexto public ClasseMostraTexto() //Designação da classe que implementa o interface Comunicador com=new ClasseProdutoraDeTexto1(); //Apresentação no ecrã de: O meu texto específico System.out.println(com.infoTextual); //Designação da classe que implementa o interface Comunicador com=new ClasseProdutoraDeTexto1(); //Apresentação no ecrã de: O meu texto MARAVILHA System.out.println(com.infoTextual); /* O "com.infotextual" é uma chamada designada de "Callback" */ IMPORTANTE: Ambos os tipos de herança acima descritos possuem as mesmas regras das classes, ou seja necessitam de package, nome, podem ter dados e métodos, no entanto existe uma diferença nos interfaces, todos os métodos são por default public abstract final. Quem usar o interface tem acesso a todos os seus dados e métodos(public), que alguém tem de os implementar(abstract) e que não podem ser sobrepostos(final). (ver capítulo de encapsulamento). 5
CLASSES ASTRACTAS Uma classe abstracta é uma classe como as outras, mas com pequenas diferenças: 1) Não pode ser compilada por si só. 2) Não diz como se executam todos os seus métodos (esses métodos são abstractos) Um método abstracto tem de ser implementado algures nas classes filhas, da classe abstracta, para que se possa executar e compilar a classe. Uma classe filha só não é obrigada a implementar um método se esta for abstracta e definir esse método como abstracto. Se assim for o método é propagado da seguinte forma: ClassePai-->ClasseFilha-->ClasseNeta A classeneta para poder ser compilada e executada deve implementar o método e não pode ser abstracta. Quando se utiliza classes abstractas? As classes abstractas são usadas quando existem semelhanças entre classes, mas alguns métodos são implementados de forma diferente. Ex: public abstract class SerVivo String nomeespecie=new String(); //Espécie: homo sapiens sapiens, gorila String raca=new String(); //Raça: caucasiana, gorila do Buim long tempodvidamedio; //TVM: 80, 30 String convertetempo; //MTVM: anos, minutos, segundos, séculos public SerVivo() abstract void apresentastringcominfo(); 6
public class Homem extends SerVivo int numerodeolhos; public Homem() nomeespecie="homo Sapiens Sapiens"; numerodeolhos=2; void apresentastringcominfo() System.out.println(" O "+ nomeespecie +" TEM "+ numerodeolhos +"OLHOS"); public class Virus extends SerVivo int numerodeolhos; public virus() nomeespecie="virus"; void apresentastringcominfo() System.out.println(" O "+ nomeespecie +" NÃO TEM OLHOS"); Como se pode ver o método apresentastringcominfo() tem uma implementação diferente conforme a classe. Para melhorias ou dúvidas contactar FAILPROOF. 7