Linguagem de Programação Java
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 70
Na Listagem 7.15, linha 7, invocamos o método valoresCampos() da superclasse Funcionarios.
public class Secretaria extends Funcionario { String departamento;
String chefe;
String valoresCampos() {
// chama método da superclasse return super.valoresCampos() +
"\nDepartamento: " + departamento + "\nChefe: "+ chefe; }
}
Listagem 7.15 – Subclasse Secretaria
Uma invocação de método na forma super.algumMétodo() tem o mesmo efeito que a invocação feita por uma referência do tipo da superclasse. O método não precisa estar definido diretamente na superclasse, ele pode ter sido herdado de alguma classe mais alta na hierarquia.
7.4.4.2 Regras sobre Sobreposição de Métodos
As seguintes regras para sobreposição de métodos devem ser seguidas:
1 – O tipo de retorno do método na subclasse deve ser o mesmo ou um subtipo do tipo de retorno do método sobreposto na superclasse.
2 – O método que está sobrepondo não pode ser menos acessível que o seu método sobreposto.
3 – O método que está sobrepondo não pode lançar exceções de tipos diferentes das exceções do método sobreposto. Veremos detalhes no estudo de exceções.
Estas regras resultam da natureza do polimorfismo combinado com as características de tipagem segura da linguagem Java. Considere este exemplo:
public class Pai { public void m() { }
}
Listagem 7.16 – Superclasse Pai public class Filho extends Pai {
private void m() {//problemas aqui, é private }
}
Listagem 7.17 – Subclasse Filho public class UsaAmbos {
public void mo() {
Pai p1 = new Pai(); Pai p2 = new Filho(); p1.m();
p2.m(); }
}
Listagem 7.18 – Testando sobreposição de métodos
Um membro marcado com o modificar private só estão acessível dentro da própria classe, ou seja somente métodos e construtores definidos na classe poderão usar este membro.
Lembrando que o nome do método e ordem dos argumentos
do método na subclasse devem ser
idênticos aos do método da superclasse,
para que a versão da superclasse seja
//atribuindo valor a variável referência Carro carro1 = new Carro();
carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";
Figura 2.4 – Layout Memória após inicialização //criando novo alias
Carro carro2 = carro1;
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
2.3 Membros de Instância
Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.
2.3.1 Invocação de Métodos
Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.
Os valores das variáveis em um objeto constituem
o seu estado. Dois objetos distintos têm
o mesmo estado se suas variáveis membro têm os
mesmos valores. Uma chamada a p2.m() (listagem 7.18, linha 6) resulta na execução da
versão do método m() definido na classe Filho (Listagem 7.17, linha 2). Porém, pela regra 2 (dois) o método m() da classe Filho tem menor visibilidade que o método m() na classe Pai, o que viola a regra e portanto o código não irá compilar.
7.4.5 Modificador de Método final
Métodos marcados como final são o que chamamos de métodos finais. Para declarar um método final, adicionamos a palavra-chave final na declaração do método (na posição do modificador).
Assim como uma classe final não pode ser herdada, gerando um erro de compilação caso o façamos. O mesmo acontecerá ao se tentar fazer um override de um método final.
7.5 Encapsulamento
Quando estamos criando as nossas classes e definindo as suas propriedades e métodos, queremos implementar algum tipo de restrição para
acessar esses dados. Por exemplo, ao necessitar que um certo atributo seja
modificado apenas pelos métodos dentro da classe, é possível esconder isso dos outros objetos que estejam usando a sua classe. Para implementar isso, com Java, temos os modificadores de acesso (veja seção 7.5.2).
Existem quatro diferentes tipos de modificadores de acesso: public, private, protected e "default" ou
pacote. Os três primeiros modificadores são escritos explicitamente no código para indicar o acesso, para o tipo default, não se utiliza nenhuma palavra-chave.
7.5.1 Pacotes
Esta é uma característica poderosa que oferece um mecanismo para gerenciamento de um grande grupo de classes e interfaces e evita possíveis conflitos de nome, sendo também um modo de encapsulamento dessas estruturas.
7.5.1.1 Criando pacotes
Para criar pacotes, declaramos como segue: package <nomeDoPacote>;
Suponha que desejamos criar um pacote onde colocaremos a nossa classe Funcionario juntamente, com outras classes relacionadas. Chamaremos o nosso pacote de empresa.rh.
A primeira coisa que temos que fazer é criar as pastas (ou diretórios) chamadas empresa/rh, estes diretórios se encontram de algum outro diretório onde esteja guardando seus arquivos de classes (arquivos com extensão .class), por exemplo [ /opt/java/lib ].
Em seguida, copiar para a pasta rh todas as classes que pertençam a este pacote. Adicione a seguinte instrução no arquivo da classe, esta linha deve ser a primeira linha dentro de seu arquivo fonte (rever seção 2.8 ). Agora vamos modificar a classe Funcionario para que a mesma fique dentro do pacote:
package empresa.rh;
public class Funcionario { double salario;
java.util.Date dataContrato; //(1) String nome;
String cargo="indefinido";
Também é possível criar métodos que não possam ser modificados pelos filhos, impedindo o
override. Estes métodos são o que chamamos de
métodos finais.
Existem quatro diferentes tipos de
modificadores de acesso: public, private,
protected e default. Pacotes são utilizados para agrupar classes e interfaces relacionadas em uma única unidade.
Linguagem de Programação Java
Seja um Profissional Aprendendo com Profissionais
www.3way.com.br 12
//atribuindo valor a variável referência Carro carro1 = new Carro();
carro1.ano = "2001"; carro1.modelo= "fusca"; carro1.cor = "prata";
Figura 2.4 – Layout Memória após inicialização //criando novo alias
Carro carro2 = carro1;
Figura 2.5 – Layout Memória duas variáveis referência para o mesmo objeto
2.3 Membros de Instância
Cada objeto criado deverá ter sua própria instância de variáveis (atributos) definidas pela classe. Os métodos definem o comportamento de um objeto. Isto é importante, pois denota que um método pertence a cada objeto da classe. Porém não devemos confundir isto com a implementação do método, que é compartilhada por todas as instâncias da classe.
2.3.1 Invocação de Métodos
Objetos se comunicam pela troca de mensagens, isto significa que um objeto pode ter que mostrar um comportamento particular invocando uma operação apropriada que foi definida no objeto. Em Java, isto é feito pela
chamada de um método em um objeto usando o operador binário "." (ponto),
devendo especificar a mensagem completa: o objeto que é o recebedor da mensagem, o método a ser invocado e os argumentos para o método (se houver). O método invocado no recebedor pode também enviar informações de volta ao objeto chamador através de um valor de retorno. O método chamado deve ser um que esteja definido pelo objeto.
Os valores das variáveis em um objeto constituem
o seu estado. Dois objetos distintos têm
o mesmo estado se suas variáveis membro têm os
mesmos valores.