- Em Java, todos os métodos são virtuais, ou seja, o código que será realmente executado só é determinado em tempo de execução.
- Assim sendo, cada chamada a um método em Java envolve a busca pela localização do código do método (ou mesmo a determinação de se o método é suportado ou não pelo objeto);
- Amarração dinâmica é menos eficiente;no entanto, é ela que permite o polimorfismo;
- Java usa sempre amarração dinâmica;
quarta-feira, 28 de novembro de 2007
Amarração dinâmica
Gerenciamento automático de memória
•Em Java não existem primitivas para alocação e desalocação de memória (Ex: malloc e free no C, new e delete no C++, new e dispose no Pascal).
•A memória utilizada por objetos que não são mais utilizados é recuperada por um mecanismo de coleta de lixo sobre o qual a aplicação não exerce nenhum controle.
•O resultado é maior consumo de memória (pois ela demora mais a ser liberada) e maior overhead de processamento, em troca de uma menor quantidade de bugs de programação:
•A memória utilizada por objetos que não são mais utilizados é recuperada por um mecanismo de coleta de lixo sobre o qual a aplicação não exerce nenhum controle.
•O resultado é maior consumo de memória (pois ela demora mais a ser liberada) e maior overhead de processamento, em troca de uma menor quantidade de bugs de programação:
•Eliminação dos memory leaks – vazamento de memória, ocorre quando uma porção de memória, alocada para uma determinada operação, não é liberada quando não é mais necessária.
•Eliminação dos buffer overflows - estouro de pilha ou transbordamento de dados, ocorre quando o tamanho de uma região de memória ultrapassa sua capacidade máxima de armazenamento.
Sobrescrita e sobrecarga
O Java permite que você tenha métodos com o mesmo nome, mas com assinaturas diferentes, isto chama-se sobrecarga. O interpretador determinará qual método deve ser invocado pelo tipo de parâmetro passado. Os trecho abaixo é válido para uma compilação Java.
...
public void print( int i ) { ... }
public void print( float f ) { ... }
public void print( String s) { ... }
...
Quando você escreve o código para chamar um desses métodos, a chamada deverá coincidir com tipos de dados da lista de parâmetros de algum dos métodos. Diferente da sobrecarga, a sobrescrita acontece quando um método existe em uma classe pai e é reescrito na classe filha para alterar o comportamento. A assinatura do método deve ser igual na classe pai e na classe filha.
...
public void print( int i ) { ... }
public void print( float f ) { ... }
public void print( String s) { ... }
...
Quando você escreve o código para chamar um desses métodos, a chamada deverá coincidir com tipos de dados da lista de parâmetros de algum dos métodos. Diferente da sobrecarga, a sobrescrita acontece quando um método existe em uma classe pai e é reescrito na classe filha para alterar o comportamento. A assinatura do método deve ser igual na classe pai e na classe filha.
this e super
Estas duas palavras-chave da linguagem são aplicadas a métodos não estáticos, ou seja, de instância. A this é utilizada para referenciar variáveis ou métodos da instância atual e o super é utilizada para associar a métodos da classe pai.
Por exemplo:
public class Pai {
public int lançar(int numero) {
return 6 \% numero;
}
}
public class Filho extends Pai {
private int numero;
...
public int lançar(int numero) {
if (numero == 0) {
return this.numero; // retorna o atributo da classe
}
super.lançar(numero); // Chave o lançar da classe pai.
}
}
A classe Pai possui um método lançar retornando um inteiro. A classe filho, que estende de Pai foi criada para tratar uma divisão por zero que poderá ocorrer na classe Pai. Portanto, se for zero, retorna um número predefinido como atributo na classe Filho, caso contrário retorna o resultado do cálculo da classe Pai. Este é um excelente exemplo de polimorfismo e sobrescrita de métodos que veremos a seguir.
O Java associa automaticamente a todas as variáveis e métodos referenciados com a palavra this. Por isso, na maioria dos casos torna-se redundante o uso em todas as variáveis da palavra this. Existem casos em se faz necessário o uso da palavra this. Por exemplo, você pode necessitar chamar apenas uma parte do método passando uma instância do argumento do objeto. (Chamar um classe de forma localizada);
Por exemplo:
public class Pai {
public int lançar(int numero) {
return 6 \% numero;
}
}
public class Filho extends Pai {
private int numero;
...
public int lançar(int numero) {
if (numero == 0) {
return this.numero; // retorna o atributo da classe
}
super.lançar(numero); // Chave o lançar da classe pai.
}
}
A classe Pai possui um método lançar retornando um inteiro. A classe filho, que estende de Pai foi criada para tratar uma divisão por zero que poderá ocorrer na classe Pai. Portanto, se for zero, retorna um número predefinido como atributo na classe Filho, caso contrário retorna o resultado do cálculo da classe Pai. Este é um excelente exemplo de polimorfismo e sobrescrita de métodos que veremos a seguir.
O Java associa automaticamente a todas as variáveis e métodos referenciados com a palavra this. Por isso, na maioria dos casos torna-se redundante o uso em todas as variáveis da palavra this. Existem casos em se faz necessário o uso da palavra this. Por exemplo, você pode necessitar chamar apenas uma parte do método passando uma instância do argumento do objeto. (Chamar um classe de forma localizada);
Interfaces
Interfaces foram concebidas para criar um modelo de implementação aumentando o baixo acoplamento entre determinadas partes de um software. Uma interface não pode possuir atributos de instância e nem métodos com implementação, mas pode possuir atributos de estáticos (de classe) e cabeçalhos de métodos que deverão ser desenvolvidos nas classes que implementarão a interface.
Muitas vezes as interfaces representam ações ou papéis para as classes. Um exemplo comum de interface é a Serializable que se encontra dentro do pacote java.io e é muito utilizada em aplicações corporativas. Quando uma classe implementa Serializable ela não precisa implementar nenhum método definido na interface, mas com esta ação o programador indica ao java que a classe pode ser serializada, transformada em um conjunto de bits para serem armazenados ou transmitidos. A serialização de uma instância armazena todos os seus dados e consegue criar um objeto semelhante na desserialização.
Muitas vezes as interfaces representam ações ou papéis para as classes. Um exemplo comum de interface é a Serializable que se encontra dentro do pacote java.io e é muito utilizada em aplicações corporativas. Quando uma classe implementa Serializable ela não precisa implementar nenhum método definido na interface, mas com esta ação o programador indica ao java que a classe pode ser serializada, transformada em um conjunto de bits para serem armazenados ou transmitidos. A serialização de uma instância armazena todos os seus dados e consegue criar um objeto semelhante na desserialização.
Resumo de orientação a objetos em Java
Java é uma linguagem orientada a objetos e, com isso, não é possível desenvolver nenhum programa sem seguir tal paradigma. Um sistema orientado a objetos é composto por um conjunto de classes e objetos bem definidos que interagem entre si, de modo a gerar o resultado esperado.
A Orientação à Objetos modela o mundo real com classes e instâncias. Cada classe é a estrutura de uma variável, ou seja, um tipo de dado. Nela, são declarados atributos e métodos que poderão ser executados ou acessados nas instâncias da mesma classe. As classes possuem uma função muito importante na modelagem orientada a objetos, elas dividem o problema, modularizam a aplicação e baixam o nível de acoplamento do software.
Variáveis de uma classe são chamadas de instâncias de classe. Por exemplo: Se existe uma classe Pessoa existe a instância (variável) pessoa que é do tipo Pessoa. Um Objeto, ou instância, é uma entidade cujas informações podem incluir desde suas características até suas atividades, ou seja, uma abstração de um domínio de um problema.
Abaixo há uma série de definições sobre a arquitetura de orientação a objetos em Java.
Pacote: Conjunto de classes e demais arquivos que possuem interesses comuns ou atuam com dependências entre si. Fisicamente são pastas do sistema operacional.
Instância, objeto: Uma variável do tipo de uma classe.
Construtor: Responsável por iniciar a criação e inicialização de uma instância de classe.
Método: Funções referenciados aquela classe.
Modificador de acesso: Descreve que outras classes podem ter acesso a classe que está se criando. Também é usado para indicar que uma classe pode ser acessada de fora de seu pacote.
Hierarquia de classes: Um grupo de classes que estão relacionadas por herança.
Superclasse: É a classe que é estendida por uma determinada classe.
Subclasse: É a classe que estende determinada classe.
Classe base: A classe de determinada hierarquia que é uma superclasse de todas as outras classes. A classe pai de todas.
A Orientação à Objetos modela o mundo real com classes e instâncias. Cada classe é a estrutura de uma variável, ou seja, um tipo de dado. Nela, são declarados atributos e métodos que poderão ser executados ou acessados nas instâncias da mesma classe. As classes possuem uma função muito importante na modelagem orientada a objetos, elas dividem o problema, modularizam a aplicação e baixam o nível de acoplamento do software.
Variáveis de uma classe são chamadas de instâncias de classe. Por exemplo: Se existe uma classe Pessoa existe a instância (variável) pessoa que é do tipo Pessoa. Um Objeto, ou instância, é uma entidade cujas informações podem incluir desde suas características até suas atividades, ou seja, uma abstração de um domínio de um problema.
Abaixo há uma série de definições sobre a arquitetura de orientação a objetos em Java.
Pacote: Conjunto de classes e demais arquivos que possuem interesses comuns ou atuam com dependências entre si. Fisicamente são pastas do sistema operacional.
Instância, objeto: Uma variável do tipo de uma classe.
Construtor: Responsável por iniciar a criação e inicialização de uma instância de classe.
Método: Funções referenciados aquela classe.
Modificador de acesso: Descreve que outras classes podem ter acesso a classe que está se criando. Também é usado para indicar que uma classe pode ser acessada de fora de seu pacote.
Hierarquia de classes: Um grupo de classes que estão relacionadas por herança.
Superclasse: É a classe que é estendida por uma determinada classe.
Subclasse: É a classe que estende determinada classe.
Classe base: A classe de determinada hierarquia que é uma superclasse de todas as outras classes. A classe pai de todas.
Palavras chave de Java
Java possui 49 palavras chave, todas elas são escritas em minúsculas:
byte - short - int - long - char - boolean - double - float - public - private - protected - static - abstract - final - strictfp - transient - synchronized - native - void - class - interface - implements - extends - if - else - do - default - switch - case - break - continue - assert - const - goto - throws - throw - new - catch - try - finally - return - this - package - import - instaceof - while - for - volatile - super
Possui três identificadores que são valores literais:
null, false, true
byte - short - int - long - char - boolean - double - float - public - private - protected - static - abstract - final - strictfp - transient - synchronized - native - void - class - interface - implements - extends - if - else - do - default - switch - case - break - continue - assert - const - goto - throws - throw - new - catch - try - finally - return - this - package - import - instaceof - while - for - volatile - super
Possui três identificadores que são valores literais:
null, false, true
Assinar:
Postagens (Atom)