Introdução
Introdução
Introdução
Orientada a Objetos
Introdução
Uma pilha resolve o problema! Para realizar a inversão, basta inserir, um a um,
os valores lidos na pilha e, em seguida, removê-los um a um.
Motivação
Problema: escrever um programa que leia uma sequência de valores inteiros, e
os imprima na ordem inversa à ordem de leitura.
Uma pilha resolve o problema! Para realizar a inversão, basta inserir, um a um,
os valores lidos na pilha e, em seguida, removê-los um a um.
Uma pilha resolve o problema! Para realizar a inversão, basta inserir, um a um,
os valores lidos na pilha e, em seguida, removê-los um a um.
Versão 3: criação de uma struct para representar o tipo Pilha. Bem melhor que as
versões anteriores, diminui ainda mais o conhecimento que o “usuário” tem que
ter a respeito do funcionamento da pilha. Mas o estado interno da pilha está
exposto para quem a manipula. Tal exposição é de fato necessária? Daria para
evitar?
Considerações sobre as implementações
O uso de orientação a objetos permite dar um passo além ao:
int values[100];
int free;
}
Esboço da classe Stack
classe Stack {
int free;
}
Esboço da classe Stack
classe Stack {
int free;
void push(int value) { ... } // que poderão ser chamados em cada objeto
}
Esboço do novo programa principal
main() {
int value;
while( ... ) {
...
Esboço do novo programa principal
...
// imprime value
} // fim main
Esboço do novo programa principal
...
// imprime value
System.out.println("Hello, World!");
}
Hello World em Java
class HelloWorld {
System.out.println("Hello, World!");
}
Hello World em Java
class HelloWorld {
System.out.println("Hello, World!");
}
Hello World em Java
class HelloWorld {
System.out.println("Hello, World!");
}
Hello World em Java
class HelloWorld {
System.out.println("Hello, World!");
}
Hello World em Java
class HelloWorld {
System.out.println("Hello, World!");
}
Hello World em Java
class HelloWorld {
System.out.println("Hello, World!");
}
Hello World em Java
Para compilar:
E para rodar:
- Tipos primitivos: tipos mais elementares de dados (boolean, byte, char, int,
long, float, double). Equivalência razoável com tipos de dados nativos do
processador, e também da linguagem C.
- Objetos: tudo aquilo que é instância de uma classe. Strings e vetores (arrays)
de tipos primitivos também são objetos. Vetores possuem atributos e são
alocados com o new. A alocação de Strings pode ser implícita, mas possuem
diversos métodos.
Tipos primitivos e objetos
Por que é importante saber a diferença?
- Variáveis e atributos cujo tipo é uma classe, são na verdade são ponteiros
para as instâncias alocadas. No Java estes ponteiros são chamados de
referências.
- Saber esta diferença é especialmente importante para entender o que
acontece na passagem de parâmetros a métodos:
- Tipos primitivos são passados como cópia (parâmetro recebido é
uma cópia do valor passado na chamada).
- Objetos são passados como referência (na realidade, o parâmetro
recebido também é uma cópia do valor passado na chamada. Mas
como o valor representa um endereço, na prática o objeto que o
método manipula é o mesmo que foi passado para chamada).
Instanciação
O que acontece quando se executa a linha: Stack stack = new Stack()?
protected: atributos e métodos visíveis para código das classes que pertencem
ao mesmo pacote, e também para classes derivadas (mesmo que em pacotes
distintos)
<default>: atributos e métodos visíveis para código das classes que pertencem
ao mesmo pacote.
Mas em certas situações (que não devem ser a regra) queremos guardar algum
tipo de informação que não está vinculada a instâncias específicas, e que haja
apenas “uma cópia” desta informação. Para estes casos, podemos usar o
modificador static para declarar um atributo. Dizemos que este atributo é um
atributo da classe (ao contrário do padrão, que são atributos de instâncias).
Modificador static
Do mesmo modo, para métodos que implementam alguma funcionalidade que
independe da existência de um objeto sobre o qual irá atuar, podemos declarar
métodos static.
Quando se aprende Java sem ter muita bagagem dos conceitos de OO, podemos
ficar habituados a abusar do modificador static, programando em um estilo
procedural/imperativo ao invés de OO (vejam o exemplo Ex3b.java).
Por isso, o uso do static não deve ser algo frequente em um sistema OO bem
projetado.
Exemplos de uso razoável do static
- Classe Math
Resumo
Conceitos OO:
- classe e objeto
- atributos e métodos
- modificadores de acesso e encapsulamento
Java: