Java e Orientação a Objetos

Todo aplicativo nativo para Plataforma Android é desenvolvido na Linguagem de Programação Java e com padrão de programação Orientado a Objetos.

Por isso resolvemos escrever este Post, apresentando alguns conceitos sobre Orientação a Objetos e aplicando-os, em exemplos práticos utilizando a Linguagem de Programação Java.

JAVA

Criado a partir de um projeto da Sun Microsystems voltado para dispositivos portáteis inteligentes, o Java foi lançado em 1995 como uma alternativa para construção de aplicações web e tornou-se um sucesso acadêmico e corporativo devido suas características.

Java é formado por uma extensa biblioteca de classe 100% Orientada a Objetos, independente da plataforma, segura e de ótima performance. Java é independente de plataforma porque seus programas são compilados em um formato neutro, os Bytecodes, armazenados em um arquivo de classe .class. O Java possui a sua Maquina Virtual, a JVM (Java Virtual Machine). A JVM interpreta os Bytecodes como código nativo do sistema, usando os serviços oferecidos pelo Sistema Operacional.

Um programa Java compõe de um ou mais arquivos fonte onde cada um pode conter:

  • Uma declaração de pacote (package)
  • Uma ou mais diretivas de importação (import)
  • Uma ou mais interações de classes (class)
  • Uma ou mais declarações de interfaces (interface)

O inicio de todo programa Java é constituído de uma classe na qual existe um método main, o método principal de uma classe. Abaixo um programa simples em Java onde uma String esta sendo impressa no console.

public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}

ORIENTAÇÃO A OBJETOS

Orientado a Objetos é uma técnica de programação que se baseia na construção e utilização de objetos. Objetos combinam dados e operações especificas, delimitando um conjunto particular de funcionalidades ou responsabilidades.

Um sistema Orientado a Objetos é um conjunto de objetos que se inter-relacionam para produzir os resultados desejados. A construção de sistema através da Orientação a Objetos se mostra eficiente, devido à característica dos objetos poderem ser reutilizados, simplificando por exemplo, a manutenção.

CONCEITOS PROGRAMAÇÃO ORIENTADA A OBJETOS

CLASSES

Todo objeto é um tipo especifico, e para utilizar um objeto é preciso ter um modelo para descrevê-lo. Uma classe é um modelo para um novo tipo de objeto, que possui todas as funcionalidades e características de um objeto.

public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
}
class ClasseInterna{}
}
class ClasseExterna{}

Saída:
Hello Wolrd!

OBJETOS

Objeto é a instancia de uma classe, na qual se fabricam N objetos deste tipo. O objeto ira possuir as mesmas características da classe.

public class Main {
public static void main(String[] args) {
System.out.println("Hello World!");
ObjetoCD cdRock=new ObjetoCD();
ObjetoCD cdPunk=new ObjetoCD();
ObjetoCD cdPop=new ObjetoCD();
}
}
class ObjetoCD{}

Saída:
Hello Wolrd!

CONSTRUTORES

São métodos especiais destinados ao preparo de novos objetos durante sua instanciação. Os construtores possuem o mesmo nome das classes. Os construtores são iniciados antes de qualquer coisa quando sua classe é instancia.

public class Main {
public static void main(String[] args) {
ObjetoCD cdRock=new ObjetoCD("Rock");
ObjetoCD cdPunk=new ObjetoCD("Punk");
ObjetoCD cdPop=new ObjetoCD("Pop");
}
}
class ObjetoCD{
public ObjetoCD(String estilo) {
// TODO Auto-generated constructor stub
System.out.println("cd:"+estilo);
}
}

Saída:
cd: Rock
cd: Punk
cd: Pop

Toda classe possui um Construtor Padrão, e sempre que iniciarmos um Objeto, uma chamada implícita é realizada a este construtor padrão. O construtor padrão possui a seguinte estrutura:

class ObjetoCD{
public ObjetoCD() {
// TODO Auto-generated constructor stub
}
}

Construtor é como um método, porem sem retorno e pode conter ou não parâmetros.

Nada impede de declaramos este construtor, deixando-o explicito. Lembre-se toda classe possui um construtor padrão que é iniciado antes de qualquer outro código, veja o exemplo abaixo, e acompanhe a saída:

public class Main {
public static void main(String[] args) {
ObjetoCD cdRock=new ObjetoCD();
cdRock.metodo();
}
}
class ObjetoCD{
public ObjetoCD() {
// TODO Auto-generated constructor stub
System.out.println("Construtor");
}
public void metodo() {
System.out.println("Método");
}
}

Saída:
Construtor
Método

VARIÁVEIS

Criadas para armazenar valores, como por exemplo, uma instancia de uma classe, um valor de numero inteiro ou uma variável do tipo String que armazena um texto. Java é uma Linguagem fortemente tipificada, tendo vários tipos de variáveis, as quais, estão divididas em dois grupos, primitivos e de referencia.

  • Primitivos: uma vez declarada, seu tipo nunca mais será alterado, porem seu valores poderão ser alterados, na maioria dos casos. Existe ainda uma subdivisão entre os tipos primitivos, entre numéricos, inteiros e ponto flutuante.
  • Referencia: são variáveis que referenciam um objeto e contem um endereço. Seu tipo nunca mais poderá ser alterado depois de declarado.

Variáveis podem estar declaradas de forma global ou local. A diferença é que uma variável global pode ser vista pela classe inteira e ate por subclasse, já a variável local, no nosso caso, declarada dentro no método main, será acessada somente dentro do escopo onde foi criada.

public class Main {
int global;
public static void main(String[] args) {
int local;
}
}

ENCAPSULAMENTO

É um aspecto de extrema importância para Programação Orientada a Objetos, pois permite que o programa restrinja o uso de certos elementos da classe. Isso acontece quando ocultamos os atributos de uma classe com a palavra reservada private, fazendo com que a visualização deste atributo somente aconteça com a implementação de um método get, e a alteração do valor deste atributo aconteça com o método set. Um atributo somente e exclusivamente será encapsulado se ele for declarado como private, pelo contrario ele não esta encapsulado.

public class Main {
public static void main(String[] args) {
Pessoa angela=new Pessoa();
angela.setNome("Angela");
angela.setIdade(50);
angela.setAltura(1.60);
angela.setPeso(70.0);
System.out.println("Nome:"+angela.getNome());
System.out.println("Idade:"+angela.getIdade());
System.out.println("Altura:"+angela.getAltura());
System.out.println("Peso:"+angela.getPeso());
}
}
class Pessoa{
private String nome;
private int idade;
private double altura;
private double peso;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public int getIdade() {
return idade;
}
public void setIdade(int idade) {
this.idade = idade;
}
public double getAltura() {
return altura;
}
public void setAltura(double altura) {
this.altura = altura;
}
public double getPeso() {
return peso;
}
public void setPeso(double peso) {
this.peso = peso;
}
}

Saída:
Nome:Angela
Idade:50
Altura:1.6
Peso:70.0

MÉTODOS

Métodos ou Funções são sub-rotinas associadas às classes. Cada classe pode ter vários métodos, que são executados somente quando são invocados. Alguns métodos possuem parâmetros, valores que devem ser passados para o método, para que ele execute sua tarefa. Os métodos podem retornar valores ou não no final da sua execução. Métodos também podem lançar Exceções.

POLIMORFISMO

Polimorfismo consiste em quebrar o modo como se trabalha a Programação Orientada a Objetos. O polimorfismo é quando realizamos uma chamada a um método de nome X, porem que esta em duas classes, as quais estão relacionadas hierarquicamente, podendo produzir resultado diferentes. Todos os Objetos em Java são polimórficos. Toda Superclasse não pode se transformar em uma Subclasse, já uma Subclasse pode se transformar em uma Superclasse. Quando ocorre um polimorfismo, a Subclasse recebe uma promoção para  se transformar em Superclasse.

SOBRESCRITO / SOBREPOSIÇÃO

A sobreposição de métodos ocorre quando há herança entra classes, onde uma Superclasse possui métodos e uma Subclasse sobrescreve os métodos declarados na Superclasse. Para um método da Subclasse ser considerado sobreposição de um método da Superclasse, este método deve ter o mesmo nome, retorno, argumento e modificar de acesso, não podendo lançar uma exceção checada. Se o método da Superclasse for declarado como final, ele não poderá ser sobrescrito pela Subclasse.

public class Main {
public static void main(String[] args) {
Carro carro1=new Carro();
carro1.descricao();
Carro carro2=new Ferrari();
carro2.descricao();
Ferrari ferrari1=new Ferrari();
ferrari1.descricao();
Ferrari ferrari2=(Ferrari) new Carro();
ferrari2.descricao(); //Lança um Exception
}
}
class Carro{
public void descricao(){
System.out.println("Superclasse");
}
}
class Ferrari extends Carro{
public void descricao(){
System.out.println("Subclasse");
}
}

Saída:
Superclasse
Exception in thread “main” java.lang.ClassCastException: com.droidnew.java.post.javaoo.Carro cannot be cast to com.droidnew.java.post.javaoo.Ferrari at com.droidnew.java.post.javaoo.Main.main(Main.java:16)
Subclasse
Subclasse

SOBRECARGA

A sobrecarga de métodos é útil na Programação Orientada a Objetos porque permite a existência de vários métodos ou construtores com o mesmo nome, porem com parâmetros diferentes. Parâmetros podem ser chamados de assinaturas dos métodos. O tipo de retorno pode ser diferente ou não. Podem utilizar diferentes modificadores de acesso e lançar exceções. Um construtor pode ser sobrecarregado, porem não pode ser sobrescrito.

class Carro{
public void metodo(){}
public void metodo(int preco){}
public void metodo(int preco, String modelo){}
public void metodo(Carro carro){}
}

Pelo fato de ter vários métodos sobrecarregados, com assinaturas, modificadores de acesso e retorno diferente, pode causar certa ambiguidade em relação a qual método o compilador deve invocar. Veja um exemplo no qual o compilador lança uma Exception por não saber qual método invocar, fazendo com que o código não compile.

public class Main {
public static void main(String[] args) {
Carro carro=new Carro();
carro.metodo(null);
}
}
class Carro{
public void metodo(String string){}
public void metodo(Integer integer){}
public void metodo(Boolean bool){}
public void metodo(Object object){}
}

HERANÇA

Mecanismo que permite uma classe herdar campos (variáveis) e métodos, ou seja, todas as características e funcionalidade de outra classe.

public class Main {
public static void main(String[] args) {
Ferrari ferrari=new Ferrari();
ferrari.cor="Vermelho";
ferrari.modelo="Formula 1";
ferrari.valor=1000000.0;
ferrari.taxa=0.20;
ferrari.desconto();
System.out.println(ferrari.descricao());
}
}
class Carro{
String cor;
String modelo;
double valor;
double taxa;
public double desconto(){
return valor*(taxa);
}
public String descricao(){
return "\nCor: "+cor+
"\nModelo: "+modelo+
"\nValor: "+valor+
"\nDesconto: "+desconto();
}
}
class Ferrari extends Carro{}

Saída:
Cor: Vermelho
Modelo: Formula 1
Valor: 1000000.0
Desconto: 200000.0

INTERFACE

Mecanismo que define um conjunto de operações, sem a necessidade de implementação, a interface estabelece um modelo de comportamento para outras classes que iram implementa-la. A interface possui métodos que serão implementados pelas outras classes. Interfaces podem ser implementadas ou estendidas e nunca poderá ser importada como uma classe. Toda classe que implementar uma interface, terá que implementar também seus métodos, a não ser que essa classe seja abstract. Todos os métodos declarados em uma interface são implicitamente public abstract.

public class Main {
public static void main(String[] args) {
Ferrari ferrari=new Ferrari();
ferrari.cor("Vermelho");
ferrari.velocidade(300.0);
ferrari.modelo("Formula 1");
System.out.println(ferrari.descricao());
Fusca fusca=new Fusca();
fusca.cor("Azul");
fusca.velocidade(30.0);
fusca.modelo("90");
System.out.println(fusca.descricao());
}
}
interface Carro {
void cor(String cor);
public void velocidade(double velocidade);
public abstract void modelo(String modelo);
public String descricao();
}
class Ferrari implements Carro{
private String cor;
private double velocidade;
private String modelo;
@Override
public void cor(String cor) {
// TODO Auto-generated method stub
this.cor=cor;
}
@Override
public void velocidade(double velocidade) {
// TODO Auto-generated method stub
this.velocidade=velocidade;
}
@Override
public void modelo(String modelo) {
// TODO Auto-generated method stub
this.modelo=modelo;
}
@Override
public String descricao() {
// TODO Auto-generated method stub
return "\nCor: "+cor+
"\nVelocidade: "+velocidade+
"\nModelo: "+modelo;
}
}
class Fusca implements Carro{
private String cor;
private double velocidade;
private String modelo;
@Override
public void cor(String cor) {
// TODO Auto-generated method stub
this.cor=cor;
}
@Override
public void velocidade(double velocidade) {
// TODO Auto-generated method stub
this.velocidade=velocidade;
}
@Override
public void modelo(String modelo) {
// TODO Auto-generated method stub
this.modelo=modelo;
}
@Override
public String descricao() {
// TODO Auto-generated method stub
return "\nCor: "+cor+
"\nVelocidade: "+velocidade+
"\nModelo: "+modelo;
}
}

Saída:
Cor: Vermelho
Velocidade: 300.0
Modelo: Formula 1
Cor: Azul
Velocidade: 30.0
Modelo: 90

ACOPLAMENTO E COESÃO

Um bom projeto Orientado a Objetos requer um baixo acoplamento e uma alta coesão. Baixo Acoplamento significar diminuir o relacionamento de uma classe com a outra, tendo classes com funções distintas umas das outras.  Alta coesão significar ter varias classes e cada uma com uma função especifica, ou seja, uma função distinta da outra classe. Isso torna o código do programa mais útil e aumenta a chance de reutilização de códigos.

Bom, com isso chegamos ao fim de mais um post, esperamos ter ajudado em apresentar alguns conhecimentos sobre Java e Orientação a Objetos neste post.

André Luiz

Links úteis para curiosidades, informações, downloads e muito mais:

Eclipse: http://www.eclipse.org/downloads/
Java JDK: http://www.oracle.com/technetwork/pt/java/javase/downloads/
Orientação a Objetos: http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s