Você está na página 1de 25

Programação 2

Visibilidade da Classe e seus membros


Classes Derivadas
Encapsulamento e Herança
Classes Abstratas e Finais
Visibilidade da Classe e seus Membros
Em Java, a visibilidade padrão de classes, atributos e métodos está restrita a todos os
membros que fazem parte de um mesmo pacote. A palavra-chave public modifica essa
visibilidade de forma a ampliá-la, deixando-a sem restrições. Uma classe definida como
pública pode ser utilizada por qualquer objeto de qualquer pacote. Em Java, uma unidade
de compilação (um arquivo fonte com extensão .java) pode ter no máximo uma classe
pública, cujo nome deve ser o mesmo do arquivo (sem a extensão). As demais classes na
unidade de compilação, não públicas, são consideradas classes de suporte para a classe
pública e têm a visibilidade padrão.
Visibilidade da Classe e seus Membros
Um atributo público de uma classe pode ser diretamente acessado e manipulado por
objetos de outras classes. Um método público de uma classe pode ser aplicado a um
objeto dessa classe a partir de qualquer outro objeto de outra classe. O conjunto de
métodos públicos de uma classe determina o que pode ser feito com objetos da classe, ou
seja, determina o seu comportamento. A palavra-chave protected restringe a visibilidade
do membro modificado, atributo ou método, apenas à própria classe e àquelas derivada
desta. A palavra-chave private restringe a visibilidade do membro modificado, método ou
atributo, exclusivamente a objetos da própria classe que contém sua definição.
Classes Derivadas
Sendo uma linguagem de programação orientada a objetos, Java oferece mecanismos para
definir classes derivadas a partir de classes existentes. É fundamental que se tenha uma
boa compreensão sobre como objetos de classes derivadas são criados e manipulados,
assim como das restrições de acesso que podem se aplicar a membros de classes
derivadas. Também importante para uma completa compreensão da utilização desse
mecanismo em Java é entender como relacionam-se interfaces e herança. A forma básica
de herança em Java é a extensão simples entre uma superclasse e sua classe derivada. Para
tanto, utiliza-se na definição da classe derivada a palavra-chave extends seguida pelo
nome da superclasse.
Classes Derivadas
A hierarquia de classes de Java tem como raiz uma classe básica, Object. Quando não for
especificada uma superclasse na definição de uma classe, o compilador assume que a
superclasse é Object. Assim, definir a classe Ponto2D como em

class Ponto2D {

// ...

é equivalente a defini-la como

class Ponto2D extends Object {

// ...

}
Classes Derivadas
É por esse motivo que todos os objetos podem invocar os métodos da classe Object, tais
como equals() e toString(). O método equals permite comparar objetos por seus
conteúdos. A implementação padrão desse método realiza uma comparação de conteúdo
bit a bit; se um comportamento distinto for desejado para uma classe definida pelo
programador, o método deve ser redefinido. O método toString() permite converter uma
representação interna do objeto em uma string que pode ser apresentada ao usuário.
Outros métodos da classe Object incluem clone(), um método protegido que permite
criar uma duplicata de um objeto, e getClass(), que retorna um objeto que representa a
classe à qual o objeto pertence. Esse objeto será da classe Class; para obter o nome da
classe, pode-se usar o seu método estático getName(), que retorna uma string.
Exemplo - Classes Derivadas
public class Ponto3D extends Ponto2D {
private int z;
public Ponto3D(int x, int y, int z) {
super(x, y);
this.z= z;
}
public int getZ() {
return z;
}
public void setZ(int z) {
this.z = z;
}
public static void main(String[] args) {
Ponto2D p1 = new Ponto2D(1,2);
Ponto3D p2 = new Ponto3D(1,2,3);
p2.setZ(10);
System.out.println("Distancia: " + p2.getZ());
}
}
Encapsulamento
Conceitua-se encapsulamento como sendo o processo utilizado para proteger os campos
e operações de uma classe (atributos e métodos), permitindo que apenas os membros
públicos - em Java métodos Get / Set - sejam acessados pelos usuários de determinada
classe.

É uma forma eficiente de proteger os dados manipulados dentro da classe, além de


determinar onde esta classe poderá ser manipulada. Usamos o nível de acesso mais
restritivo, private, que faça sentido para um membro particular. Sempre usamos private, a
menos que tenhamos um bom motivo para deixá-lo com outro nível de acesso.
Exemplo
public class Pessoa{
private String nome;
private String sobrenome;

public String getNome(){


return nome;
}
public void setNome(String n){
nome = n;
}
public String getSobrenome(){
return sobrenome;
}
public void setSobrenome(String s){
sobrenome = s;
}
Herança
O conceito de encapsular estrutura e comportamento em um tipo não é exclusivo da
orientação a objetos; particularmente, a programação por tipos abstratos de dados segue
esse mesmo conceito. O que torna a orientação a objetos única é o conceito de herança.
Herança é um mecanismo que permite que características comuns a diversas classes
sejam fatoradas em uma classe base, ou superclasse. A partir de uma classe base, outras
classes podem ser especificadas. Cada classe derivada ou subclasse apresenta as
características (estrutura e métodos) da classe base e acrescenta a elas o que for definido
de particularidade para ela.
Herança
Por exemplo, Imagine que dentro de uma organização empresarial, o sistema de RH
tenha que trabalhar com os diferentes níveis hierárquicos da empresa, desde o
funcionário de baixo escalão até o seu presidente. Todos são funcionários da empresa,
porém cada um com um cargo diferente. Mesmo a secretária, o pessoal da limpeza, o
diretor e o presidente possuem um número de identificação, além de salário e outras
características em comum. Essas características em comum podem ser reunidas em um
tipo de classe em comum, e cada nível da hierarquia ser tratado como um novo tipo, mas
aproveitando-se dos tipos já criados, através da herança. Os subtipos, além de herdarem
todas as características de seus supertipos, também podem adicionar mais
características, seja na forma de variáveis e/ou métodos adicionais, bem como reescrever
métodos já existentes na superclasse, polimorfismo.
Exemplo - Herança
public class Pessoa{

public String nome;

public int idade;

public class Aluno extends Pessoa{

public String matricula;

}
Exemplo - Herança
public class Estudos{

public static void main(String args[]){

Aluno aluno = new Aluno();

aluno.nome = "Aluno Esforçado";

aluno.idade = 20;

aluno.matricula = "XXXX99999“;

System.out.println("Nome: " + aluno.nome + "\n" "Idade: " + aluno.idade + "\n" +

"Matrícula: " + aluno.matricula);

}
Classes Abstratas e Finais
Uma classe abstrata não pode ser instanciada, ou seja, não há objetos que possam ser
construídos diretamente de sua definição. Por exemplo, a compilação do seguinte trecho
de código:

abstract class AbsClass {

public static void main(String[] args) {

AbsClass obj = new AbsClass();

}
Classes Abstratas e Finais
geraria a seguinte mensagem de erro:
AbsClass.java:3: class AbsClass is an abstract class.
It can’t be instantiated.
AbsClass obj = new AbsClass();
1 error

Em geral, classes abstratas definem um conjunto de funcionalidades das quais pelo


menos uma está especificada mas não está definida — ou seja, contém pelo menos um
método abstrato, como em

abstract class AbsClass {

public abstract int umMetodo();

}
Classes Abstratas e Finais
Pode-se dizer que as classes abstratas servem como “modelo” para outras classes que dela
herdem, não podendo ser instanciada por si só. Para ter um objeto de uma classe abstrata
é necessário criar uma classe mais especializada herdando dela e então instanciar essa
nova classe. Os métodos da classe abstrata devem então serem sobrescritos nas classes
filhas.
Classes Abstratas e Finais
Por exemplo, é definido que a classe “Animal” seja herdada pelas subclasses “Gato”, “Cachorro”, “Cavalo”,
mas ela mesma nunca pode ser instanciada.

abstract class Conta {

private double saldo;

public void setSaldo(double saldo) {

this.saldo = saldo;

public double getSaldo() {

return saldo;

public abstract void imprimeExtrato();

}
Classes Abstratas e Finais
import java.text.SimpleDateFormat;
import java.util.Date;

public class ContaPoupanca extends Conta {

@Override
public void imprimeExtrato() {
System.out.println("### Extrato da Conta ###");
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/aaaa HH:mm:ss");
Date date = new Date();
System.out.println("Saldo: "+this.getSaldo());
System.out.println("Data: "+sdf.format(date));
}
}
Classes Abstratas e Finais
public class TestaConta {
public static void main(String[] args) {
Conta cp = new ContaPoupanca();
cp.setSaldo(2121);
cp.imprimeExtrato();
}
}
Classes Abstratas e Finais
Uma classe final, por outro lado, indica uma classe que não pode ser estendida.
A palavra-chave final pode também ser aplicada a métodos e a atributos de uma classe.
Um método final não pode ser redefinido em classes derivadas. Um atributo final não
pode ter seu valor modificado, ou seja, define valores constantes. Apenas valores de tipos
primitivos podem ser utilizados para definir constantes. O valor do atributo deve ser
definido no momento da declaração, pois não é permitida nenhuma atribuição em outro
momento.
Classes Abstratas e Finais
1 - Abstract: quando uma Classe é abstrata, a mesma não pode ser instanciada em tempo
de execução. Nenhum objeto pode ser criado.

2 - Final: quando uma classe é final, a mesma não pode ser herdada. Não pode possuir
sub-classes.
Classes Abstratas e Finais
1 - Abstract: quando uma Classe é abstrata, a mesma não pode ser instanciada em tempo
de execução. Nenhum objeto pode ser criado.

2 - Final: quando uma classe é final, a mesma não pode ser herdada. Não pode possuir
sub-classes.
Classes Abstratas e Finais
Um método que é definido como final em uma classe não pode ser redefinido em classes derivadas.
Considere o seguinte exemplo:

class ComFinal {

final int f() {

return 1;

public class ExtComFinal extends ComFinal {

int f() {

return 0;

}
Exercícios
1. Crie uma classe calculadora. Esta classe deve ser abstrata e implementar as operações
básicas (soma, subtração, divisão e multiplicação). Utilizando o conceito de herança crie
uma calculadora cientifica que implementa os seguintes cálculos: raiz quadrada e a
potência. Dica utilize a classe Math do pacote java.lang.

2. Utilizando os conhecimentos adquiridos durante a aula, resolva a hierarquia abaixo.


Obrigado!!!

Você também pode gostar