Java
Criação de Classes e Objetos
Unidade de Aprendizado
Criação de classes e objetos
Você aprenderá nesta unidade
•
•
•
•
•
•
Métodos;
Classes e objetos;
Criação e uso de objetos
Variáveis e métodos de instância e de classe.
Construtores.
Referência this.
UA “Classes, Objetos e Encapsulamento” - Apresentação
Métodos
• Estrutura de um método;
• Chamadas a métodos;
• Regras aplicadas aos métodos;
• Sobrecarga de métodos;
UA “Classes, Objetos e Encapsulamento” - Teoria
Estrutura de um método
• Um método de uma classe tem a seguinte
estrutura genérica:
<visibilidade> <static> <tipo_retorno> <nome_metodo> (<parêmetros>) {
//corpo ou escopo do método. Fica entre chaves { }.
}
<visibilidade> - public, private, <package>, protected;
<static> - com a palavra static ou sem ela;
<tipo_retorno> - void, tipo primitivo ou classe;
<nome_método> - valem as convenções;
<parâmetros> - devem ser do mesmo tipo que os
argumentos enviados.
UA “Classes, Objetos e Encapsulamento” - Teoria
Demonstração 04
Estrutura de um método
//Exemplo de um método que não retorna valor - void
public class DesenhaPontosUsandoMetodo{
public static void main(String args[])
{
...
desenhaPontos(numPontos); //chamada do método
System.exit(0);
}
//Declaração do método desenhaPontos
public static void desenhaPontos(int num)
{
System.out.print(num + " pontos: \t" );
for (int i = 0; i <= num; i++){
System.out.print(".");
}
System.out.println();
}
}
UA “Classes, Objetos e Encapsulamento” - Teoria
Demonstração 05
Estrutura de um método
//Método com retorno de valores
public class AvaliaRandomico {
public static void main(String args[]){
while (i<=intIteracoes) {
a = intSorteado(inic,fin);
switch (a){
Chamada do método
case 1: i1++;break;
case 2: i2++;break; ...
}
i++;
}
System.out.println (intIteracoes + ..... ..... + .... intPonto);
System.out.println ("i1 - " + i1 + " \t" + strBarra(i1));
System.out.println ("i2 - " + i2 + " \t" + strBarra(i2));...
}
public static int intSorteado (int a, int b){
return ((int) (Math.random()*(b-a+1)) + a);
}
public static String strBarra(int a){
String strResult = "";
for (i = 0;i<=a;i+=intPonto){
Retorno do método
strResult += ".";
}
return strResult;
}
}
UA “Classes, Objetos e Encapsulamento” - Teoria
Chamadas a métodos
• Dentro da definição da classe
– nomeDoMetodo( )
• Chamados automaticamente
– main( ), init( ), paint( )
• Métodos de classe
– Integer.parseInt( ), Math.random( )
• Métodos de instância da classe
– aluno1.getNome( )
UA “Classes, Objetos e Encapsulamento” - Teoria
Regras aplicadas aos métodos
• Métodos retornam no máximo um valor;
• Se <tipo_retorno> não for void, o corpo do
método tem que ter um return;
• É um erro de sintaxe passar os argumentos com
tipos diferentes dos parâmetros recebidos;
• Um método não pode ser definido dentro de
outro método;
• Métodos devem ter sua função bem definida para
promover a reutilização de código.
UA “Classes, Objetos e Encapsulamento” - Teoria
Demonstrãção 06
Escopo de variáveis
public class EscopoDeVariavel {
static int x = 1;
// variável “global” da classe
public static void main(String args[]){
int x = 5;
// variable local do metodo main
System.out.println("x no inicio de main() eh " + x);
metodoA();
// metodoA tem uma variavel local de x
metodoB();
// metodoB usa a variavel de instancia
metodoA();
// metodoA reinicializa a variavel local x
metodoB();
// variavel de instancia x retem seu valor
}
public static void metodoA(){
int x = 25; // inicializa cada vez que for chamado
System.out.println("\n\nVariavel local x ao entrar no metodoA eh " + x);
++x;
System.out.println("Variavel local x antes de sair do metodoA eh " + x);
}
public static void metodoB(){
System.out.println("\n\nVariavel local x ao entrar no metodoB eh " + x);
x *= 10;
System.out.println("Variavel local x antes de sair do metodoA eh " + x);
}
}
UA “Classes, Objetos e Encapsulamento” - Teoria
Sobrecarga de métodos
overload definição
• Ocorre quando dentro da definição de uma
classe existem dois ou mais métodos com o
mesmo nome.
• Para que isso seja possível os métodos
devem ter assinaturas diferentes .
• Assinatura: formada pelo nome do método,
junto com o número e os tipos dos
parâmetros. O tipo de retorno NÃO é
levado em consideração.
UA “Classes, Objetos e Encapsulamento” - Teoria
Sobrecarga de métodos
public void defineCampo(int valor){
idade = valor;
}
public void defineCampo(String valor){
nome = valor;
}
public int defineCampo(int valor1, String valor2){
idade = valor1;
nome = valor2;
}
//Exemplo de chamada de método sobrecarregado
...
emp.defineCampo(32);
emp.defineCampo(“Maria”);
emp.defineCampo(40, “Roberto”);
...
emp.defineCampo(12f);
// Erro!!!!
UA “Classes, Objetos e Encapsulamento” - Teoria
Classe e Objeto
Definição
• Classe é uma descrição de alguma coisa
existente no domínio do problema. É usada
na criação de múltiplos objetos. Engloba
dados e comportamento de um objeto.
• Objeto (Instância de classe) é uma entidade
relevante ao domínio do problema. São
dinâmicos.
UA “Classes, Objetos e Encapsulamento” - Teoria
Operador new
• O operador new cria um objeto da classe
colocada à sua direita e retorna uma
referência.
• Sintaxe:
Empregado emp;//Declaração da variável emp do tipo Empregado
emp = new Empregado();//A referência é atribuída a emp
ou
Empregado emp = new Empregado();//2 passos numa única linha
UA “Classes, Objetos e Encapsulamento” - Teoria
Uso de objetos
• Uma vez criado o objeto, podemos usar
suas propriedades (atributos) e métodos
através de sua referência:
...
emp.defineIdade(22);
...
emp.idade = 66;
emp.nome = “Fernando Henrique”;
...
UA “Classes, Objetos e Encapsulamento” - Teoria
Modificadores de Visibilidade
Modificadores
private
<package> *
protected
public
package xyz
Mesma
classe
x
x
x
x
class Teste1 {
private int x;
int y;//*
protected int z;
public int w;
metodo m1( ){
x,y,z,w -> ok
}
}
class Teste2
x -> não
y -> ok
z -> ok
w -> ok
Mesmo
package
x
x
x
Subclasses
x
x
class Teste3
x -> não
y -> não
z -> não
w -> ok
Qualquer
lugar
x
package abc
class Teste4 extends teste1
z -> ok
w -> ok
UA “Classes, Objetos e Encapsulamento” - Teoria
Encapsulamento
• Manter dentro da classe seus métodos e
propriedades.
• Com o encapsulamento, não importa
quanto o sistema cresça ou se torne
complexo, a manutenção estará segura,
pois o código estará no lugar mais fácil de
ser encontrado, encapsulado na definição
do objeto.
UA “Classes, Objetos e Encapsulamento” - Teoria
Ocultamento
• Esconder como os objetos funcionam
internamente e o que eles sabem atrás de
uma interface.
• Através dos modificadores de visibilidade
temos como obter o encapsulamento e o
ocultamento.
• Regra básica: variáveis de instância private
e métodos de acesso public
UA “Classes, Objetos e Encapsulamento” - Teoria
Métodos Set e Get
• Utilizados para
atribuir ou retornar
os valores dos
atributos da classe.
• Garante o formato
de retorno e valida
valores inseridos.
public class Empregado {
private int idade;
private String nome;
public void setIdade(int valor){
idade = (valor<0)? 0 : valor;
}
public int getIdade(){
... }
public void setNome(String valor){
... }
public String getNome(){
... }
}
UA “Classes, Objetos e Encapsulamento” - Teoria
Variáveis de instância
• Variáveis de Instância são aquelas
declaradas dentro da definição da classe e
que todo objeto da classe possui um
próprio.
public class Empregado {
private int idade; //tipos primt. Numéricos são inicializado com zero
private boolean permiteEscrita; //tipos primit. booleanos com false
private String nome; //objetos são inicializados com null
...
}
UA “Classes, Objetos e Encapsulamento” - Teoria
Métodos de instância
• Métodos de Instância são aqueles
declarados dentro da definição da classe e
que todo objeto possui individualmente.
public class Empregado {...
public void defineIdade(int campo) {
idade = campo;
}
public int retornaIdade() {
return idade;
}
...
}
UA “Classes, Objetos e Encapsulamento” - Teoria
Demonstração 08
variáveis e métodos de instância
public class BarraHorizontal{
private int numPontos;
public void setNumPontos(int n){
if(n < 0) numPontos = 0;
else numPontos = n;
}
public void setNumPontos(){
numPontos = 0;
}
public int getNumPontos(){
return numPontos;
}
public class TestaBarraHorizontal{
public static void main(String args[]) {
//Declara b1 e atribui uma instância da classe
BarraHorizontal b1 = new BarraHorizontal ();
/*Pode-se operar com o objeto somente
com seus métodos de acesso*/
b1.setNumPontos(20);
b1.geraBarra();
//Como o objeto está num "estado consistente” ...
b1.setNumPontos(-30);
b1.geraBarra();
b1.setNumPontos( );
b1.geraBarra();
public void geraBarra(){
...
}
System.exit(0);
}
Variáveis private e
métodos public.
}
}
Não se tem acesso direto às variáveis. O encapsulamento permite manter o objeto em “estado consistente”.
UA “Classes, Objetos e Encapsulamento” - Teoria
Construtores
• São métodos especiais que as classes
possuem e que servem para inicializar seus
objetos, alocando a memória de que eles
precisarão.
• Devem obrigatoriamente ter o mesmo
nome que a classe a qual pertencem e não
possuem tipo de retorno.
• Usam o conceito de sobrecarga de método.
• Construtor padrão
UA “Classes, Objetos e Encapsulamento” - Teoria
Construtores
//Classe com dois construtores
public class Empregado{
//Construtor padrão. Neste caso deve existir //obrigatoriamente
para não gerar um erro
public Empregado() {
}
}
//Construtor para quando a classe receber um inteiro e
//um String.
public Empregado(int valor1, String valor2) {
idade = valor1;
nome = valor2;
}
...
UA “Classes, Objetos e Encapsulamento” - Teoria
Referência this
• Parâmetro implícito de todos os métodos de
instância. Se refere ao objeto atual sobre o qual o
método foi chamado.
• Obrigatório quando:
– o nome da variável é igual ao nome de um argumento
formal passado pelo método de instância;
– for necessário passar uma referência ao objeto atual
como parâmetro para outro método.
UA “Classes, Objetos e Encapsulamento” - Teoria
Exemplos de uso da Referência this
int idade;
String nome;
...
public Empregado(int idade, String nome) {
this.idade = idade;
this.nome = nome;
}
...
public Empregado(int valor1) {
idade = valor1;
}
public Empregado(int v1, String v2) {
this(v1);//chama o método que recebe um único inteiro
nome = valor2;
}
...
UA “Classes, Objetos e Encapsulamento” - Teoria
Variáveis e métodos de classe
• Variável de classe é aquela que pertence a
classe e é compartilhada por todas as
instâncias da mesma.
• Usa-se o inicializador static
public class Empregado {
private int idade;
//var. de instância
private String nome; //var. de instância
private static double ultimaMatricula = 8;//var. de classe
...
}
UA “Classes, Objetos e Encapsulamento” - Teoria
Variáveis e métodos de classe
• Inicializações complexas podem ser feitas
dentro de blocos de inicialização static
public class Empregado {
private int idade;
private String nome;
private static double ultimaMatricula = 8;
static {
ultimaMatricula = outroObjeto.recupera();
}
...
}
UA “Classes, Objetos e Encapsulamento” - Teoria
Variáveis e métodos de classe
• Método de classe é aquele que pertence a
classe e é compartilhada por todas as
instâncias da mesma.
public class Empregado {
...
public static void defineUltMatr(double valor) {
ultimaMatricula = valor;
}
...
}
Empregado.defineUltMatr(50);
UA “Classes, Objetos e Encapsulamento” - Teoria
Demonstração 11
variáveis e métodos de classe
//.. mesmo tipo (*, -, #, etc.. ...um contador
public class BarraHorizontal{
private int extensao; //var. de instância
private static int itens;
// var. de classe
private static char tipoBarra; //var. de classe
public BarraHorizontal(){
tipoBarra = '*';
itens++;//incrementa a variável estática }
public BarraHorizontal(int extensao){
this();
setExtensao(extensao); }
public void setExtensao(int extensao){
if(extensao < 0) this.extensao = 0;
else this.extensao = extensao; }
public static void setTipoBarra(char t){
tipoBarra = t; }
public static int getItens(){ return itens;}
public static char getBarra(){return
tipoBarra;}
public int getExtensao(){return extensao;}
BarraHorizontal b1, b2, b3;
b1 = new BarraHorizontal(20);
b1.setTipoBarra('#');
b2 = new BarraHorizontal(-30);
b3 = b2; //b3 é um outro objeto?
b2.setExtensao(15); //individual do objeto
//Setando todas as barras para tipo "-"
BarraHorizontal.setTipoBarra('-');
System.out.println(b1);
System.out.println(b2);
System.out.println(b3);
//Métodos de classe podem ser acessados pelo nome da classe
//ou pela referência de qualquer uma de suas instâncias
System.out.println("Total de barras: " + b1.getItens());
System.out.println("Total de barras: " +
BarraHorizontal.getItens());
System.out.println("Barra usada: " +
b1.getBarra());
System.exit(0);
private String geraBarra(){...;}
public String toString(){...;}}
UA “Classes, Objetos e Encapsulamento” - Teoria
Lab 06
Loja Virtual
Objetivo: Praticar o uso de variáveis de instância e
de classe.
Tarefas: Criar um projeto para uma loja virtual. É
Produto
um exemplo de “composição”,onde objetos são
usados como variáveis de instância de outras
classes.
Cliente
TestaLoja
-descricao: String
-nome: String
-preco: double
-desconto: double
+Produto(nome, descricao,
preco, desconto)
+getPreco() : double
+getDesconto(): double
+setDesconto(desc: double)
-nome: String
-endereco: String
-pedido: CestaCompras
+getNome(): String
+setPedido(CestaCompras)
+getPedido(): CestaCompras
CestaCompras
-produto: Produto[]
-total: double
+CestaCompras(quantidade)
+getQuantidade(): int
+adicionar(Produto): boolean
+getTotal(): double
+remover(Produto): boolean
+main(){
declara um cliente1;
constrói cliente1 “João Barone”
constrói produto1 e item1
associa item1 a cliente1
altera as quantidades de item1
imprime as propriedades de cliente1 e
do seu item
}
UA “Introdução a Java” - BCA “O que é a linguagem Java?” - Laboratório
Herança e Polimorfismo
Unidade de Aprendizado
UA “Classes, Interfaces e Arrays” - BCA “Herança”
Herança e Polimorfismo
•
•
•
•
•
•
Você aprenderá
Conceito de herança.
Classe Object e construtores.
Referência super.
Sobrescrita de métodos.
Polimorfismo.
Modificador final.
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Apresentação
Conceito de Herança
• É a possibilidade de se criar objetos a partir
de outros já existentes. Os objetos
derivados contêm todos os atributos e
métodos que o seu antecessor.
• Hierarquia de objetos.
Primata
Macaco
Humano
Homem
Mulher
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Herança
• Palavra chave extends.
• Hierarquia de objetos.
• Não é permitida herança múltipla, ou seja,
uma classe só pode estender uma e
somente uma outra.
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Herança
• Para criarmos um objeto filho ou descendente
usa-se extends
public class Humano extends Primata{}
• Humano contém todos os métodos e
propriedades de Primata.
• Construtores não são herdados.
Conceito de Herança
• Na definição da classe Humano
acrescentamos propriedades e métodos
próprios dos Humanos
public class Humano extends Primata {
private String nome;
private int idade;
private String profissao;
public void definirNome(String nome) {...}
public void definirIdade(int idade) {...}
public void definirProfissao(String profissao){...}
public String retornarNome() {...}
public int retornarIdade() {...}
public String retornarProfissao() {...}
}
Hierarquia de construtores
Homem fulano = new Homem();
• Chama o construtor padrão da classe
propriamente dita.
• Chama o construtor padrão da classe pai
até alcançar a classe Object.
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Referência super
• Usada para referenciar a classe pai.
• super() se refere, dentro de um construtor,
ao construtor existente na classe pai.
• Deve estar na primeira linha do construtor.
• Se não houver uma instrução super() ou
this() explícita em um construtor, Java
coloca uma chamada a super() implícita.
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Referência super
1
public class Humano extends Primata {
2
3
4
6
8
15
String nome;
int idade;
String profissao;
...
public Humano (){}
public Humano(String nome, int id, String prof)
public void setNome(String nome) {...}
...
{...}
33 }
public class Homem extends Humano {
String certMilitar;
public Homem(){ certMilitar = “000000”;}//super() implicito o que torna
//a linha 6 obrigatória
public Homem(String nome, int idade, String profissao, String ident) {
super(nome, idade, profissao);
certMilitar = ident;
}
}
Sobrescrita de métodos
overriding
• Consiste em definir, na classe filha, um
método com a mesma assinatura (ou seja,
mesmos argumentos) e mesmo tipo de
retorno de uma classe pai (não
necessariamente no primeiro nível de
herança).
• Podemos referenciar o método da classe
pai através da referência super em
qualquer lugar do método.
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Demonstração 12
sobrescrita de métodos
1
public class Humano extends Primata {
2
String nome;
3
int idade;
4
String profissao;
public class TestaHumano{
public static void main(String args[]){
Homem h1 = new Homem("Silvio Rodrigues", 39,
1
"Coordenador", "373-619" );
System.out.println(h1.getProfissao());
}
}
...
6
public Humano (){}
8
public Humano(String n, int i, String p){...
11
setProfissao(p);}
15
public void setNome(String nome) {...}
21
public void setProfissao(String prof){...}
...
4
5
6
Coordenador - contratado
Press any key to continue . . .
33 }
public class Homem extends Humano {
String certMilitar;
public Homem(){
certMilitar = "000000";
}
public Homem(String nome, int idade,
2
String profissao, String ident) {
super(nome, idade, profissao); 3
certMilitar = ident;
}
//Método sobreescreve o mesmo método da superclasse
public void setProfissao(String profissao){
6
this.profissao = profissao + " - contratado";
}
}
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Polimorfismo
• Permite que a linguagem consiga determinar, em
tempo de execução, qual método deverá ser
executado, dependendo do tipo do objeto.
boolean cadastrarUsuario(Humano pessoa) {
// esse método cadastra em um banco de dados
// informações referentes a uma pessoa, seja
// esta um homem ou uma mulher
String nome = pessoa.retornarNome();
...
}
• Com o polimorfismo, um grande programa fica
mais linear, com menos desvios de lógica.
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Polimorfismo
• Operador instanceof
• Retorna um valor booleano indicando se o
objeto é uma instância de uma
determinada classe.
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Modificador final
• Uma variável final é uma constante.
• Um método final não pode ser sobrescrito.
• Uma classe final não pode ter filhos.
public final PI = 3.1415f;
public final boolean verificaSenha(String senha) {
...
}
public final class String {
...
}
UA “Classes, Interfaces e Arrays” - BCA “Herança” - Teoria
Demonstração 13
herança e polimorfismo
Empregado
String primeiroNome;
String ultimoNome;
public class TestePolimorfismo{
static Empregado e_ref; //Só referência
public static void main(String args[]){
rendimentos( ){
return -1;
}
Chefe
PorPecaProduzida
double salarioSemanal;
double salarioPorProducao;
double quantidadeProduzida;
rendimentos( ){
return salarioSemanal;
}
//construído com salario semanal
Chefe ch1 = new Chefe("Al",
"Capone",80000.0);
e_ref = ch1;
relatorioDeSaida();
System.out.println(ch1.toString() +
ch1.rendimentos());
//Salário por produção e peças produzidas
PorPecaProduzida ppp = new PorPecaProduzida
("Jorge", "Silva", 20.0, 427);
e_ref = ppp;
relatorioDeSaida();
System.out.println(ppp.toString() +
ppp.rendimentos());
System.exit(0);
rendimentos( ){
return salarioPorProducao *
quantidadeProduzida;
}
}
(Chefe) Al Capone 80000.0
(Chefe) Al Capone 80000.0
(Funcionario por peca produzida) Jorge Silva 8540.0
(Funcionario por peca produzida) Jorge Silva 8540.0
Press any key to continue . . .
public static void relatorioDeSaida(){
System.out.println(e_ref.toString() +
e_ref.rendimentos());
}
}
Download

public class