Dominando Java: Entendendo Objetos, Classes e Conceitos Fundamentais de POO
Java é uma Linguagem Orientada a Objetos. Como uma linguagem que possui o recurso Orientado a Objetos, Java suporta os seguintes conceitos fundamentais:
- Polimorfismo
- Herança
- Encapsulamento
- Abstração
- Classes
- Objetos
- Instância
- Método
- Passagem de Mensagem
Neste capítulo, veremos os conceitos - Classes e Objetos.
Objeto − Objetos têm estados e comportamentos. Exemplo: Um cachorro tem estados - cor, nome, raça, bem como comportamentos – abanar o rabo, latir, comer. Um objeto é uma instância de uma classe.
Classe − Uma classe pode ser definida como um modelo/blueprint que descreve o comportamento/estado que o objeto de seu tipo suporta.
Objetos em Java
Vamos agora olhar profundamente no que são objetos. Se considerarmos o mundo real, podemos encontrar muitos objetos ao nosso redor, carros, cachorros, humanos, etc. Todos esses objetos têm um estado e um comportamento.
Se considerarmos um cachorro, então seu estado é - nome, raça, cor, e o comportamento é - latir, abanar o rabo, correr.
Se você comparar o objeto de software com um objeto do mundo real, eles têm características muito similares.
Objetos de software também têm um estado e um comportamento. O estado de um objeto de software é armazenado em campos e o comportamento é mostrado via métodos.
Então no desenvolvimento de software, métodos operam no estado interno de um objeto e a comunicação objeto-a-objeto é feita via métodos.
Classes em Java
Uma classe é um blueprint a partir do qual objetos individuais são criados.
Seguindo está um exemplo de uma classe.
Exemplo
public class Dog {
String breed;
int age;
String color;
void barking() { }
void hungry() { }
void sleeping() { }
}
Uma classe pode conter qualquer dos seguintes tipos de variáveis.
Variáveis locais − Variáveis definidas dentro de métodos, construtores ou blocos são chamadas variáveis locais. A variável será declarada e inicializada dentro do método e a variável será destruída quando o método for completado.
Variáveis de instância − Variáveis de instância são variáveis dentro de uma classe mas fora de qualquer método. Estas variáveis são inicializadas quando a classe é instanciada. Variáveis de instância podem ser acessadas de dentro de qualquer método, construtor ou blocos daquela classe particular.
Variáveis de classe − Variáveis de classe são variáveis declaradas dentro de uma classe, fora de qualquer método, com a palavra-chave static.
Uma classe pode ter qualquer número de métodos para acessar o valor de vários tipos de métodos. No exemplo acima, barking(), hungry() e sleeping() são métodos.
Seguem alguns dos tópicos importantes que precisam ser discutidos ao olhar para classes da Linguagem Java.
Construtores
Quando discutindo sobre classes, um dos subtópicos mais importantes seria construtores. Toda classe tem um construtor. Se não escrevermos explicitamente um construtor para uma classe, o compilador Java constrói um construtor padrão para aquela classe.
Cada vez que um novo objeto é criado, pelo menos um construtor será invocado. A regra principal de construtores é que eles devem ter o mesmo nome da classe. Uma classe pode ter mais de um construtor.
Seguindo está um exemplo de um construtor:
Exemplo
public class Puppy {
public Puppy() { }
public Puppy(String name) {
// Este construtor tem um parâmetro, name.
}
}
Java também suporta Classes Singleton onde você seria capaz de criar apenas uma instância de uma classe.
Nota − Temos dois tipos diferentes de construtores. Vamos discutir construtores em detalhes nos capítulos subsequentes.
Criando um Objeto
Como mencionado anteriormente, uma classe fornece os blueprints para objetos. Então basicamente, um objeto é criado a partir de uma classe. Em Java, a palavra-chave new é usada para criar novos objetos.
Existem três passos ao criar um objeto a partir de uma classe:
Declaração − Uma declaração de variável com um nome de variável com um tipo de objeto.
Instanciação − A palavra-chave 'new' é usada para criar o objeto.
Inicialização − A palavra-chave 'new' é seguida por uma chamada a um construtor. Esta chamada inicializa o novo objeto.
Seguindo está um exemplo de criação de um objeto:
Exemplo
Demo Ao Vivo
public class Puppy {
public Puppy(String name) {
// Este construtor tem um parâmetro, name.
System.out.println("Nome Passado é :" + name );
}
public static void main(String []args) {
// A seguinte instrução criaria um objeto myPuppy
Puppy myPuppy = new Puppy( "tommy" );
}
}
Se compilarmos e executarmos o programa acima, então ele produzirá o seguinte resultado:
Saída
Nome Passado é :tommy
Acessando Variáveis de Instância e Métodos
Variáveis de instância e métodos são acessados via objetos criados. Para acessar uma variável de instância, seguindo está o caminho totalmente qualificado:
/* Primeiro crie um objeto */ ObjectReference = new Constructor(); /* Agora chame uma variável como segue */ ObjectReference.variableName; /* Agora você pode chamar um método de classe como segue */ ObjectReference.MethodName();
Exemplo
Este exemplo explica como acessar variáveis de instância e métodos de uma classe.
Demo Ao Vivo
public class Puppy {
int puppyAge;
public Puppy(String name) {
// Este construtor tem um parâmetro, name.
System.out.println("Nome Escolhido é :" + name );
}
public void setAge( int age ) {
puppyAge = age;
}
public int getAge( ) {
System.out.println("Idade do Filhote é :" + puppyAge );
return puppyAge;
}
public static void main(String []args) {
/* Criação do objeto */
Puppy myPuppy = new Puppy( "tommy" );
/* Chamar método da classe para definir idade do filhote */
myPuppy.setAge( 2 );
/* Chamar outro método da classe para obter idade do filhote */
myPuppy.getAge( );
/* Você pode acessar variável de instância como segue também */
System.out.println("Valor da Variável :" + myPuppy.puppyAge );
}
}
Se compilarmos e executarmos o programa acima, então ele produzirá o seguinte resultado:
Saída
Nome Escolhido é :tommy Idade do Filhote é :2 Valor da Variável :2
Regras de Declaração de Arquivo Fonte
Como a última parte desta seção, vamos agora olhar para as regras de declaração de arquivo fonte. Estas regras são essenciais ao declarar classes, instruções import e package em um arquivo fonte.
Pode haver apenas uma classe pública por arquivo fonte.
Um arquivo fonte pode ter múltiplas classes não-públicas.
O nome da classe pública deve ser o nome do arquivo fonte também, que deve ser anexado por .java no final. Por exemplo: o nome da classe é public class Employee{} então o arquivo fonte deve ser Employee.java.
Se a classe é definida dentro de um pacote, então a instrução package deve ser a primeira instrução no arquivo fonte.
Se instruções import estão presentes, então elas devem ser escritas entre a instrução package e a declaração da classe. Se não há instruções package, então a instrução import deve ser a primeira linha no arquivo fonte.
Instruções Import e package implicarão a todas as classes presentes no arquivo fonte. Não é possível declarar diferentes instruções import e/ou package para diferentes classes no arquivo fonte.
Classes têm vários níveis de acesso e existem diferentes tipos de classes; classes abstratas, classes final, etc. Estaremos explicando sobre todos estes no capítulo de modificadores de acesso.
Além dos tipos de classes mencionados acima, Java também tem algumas classes especiais chamadas Classes Internas e Classes Anônimas.
Pacote Java
Em palavras simples, é uma forma de categorizar as classes e interfaces. Ao desenvolver aplicações em Java, centenas de classes e interfaces serão escritas, portanto categorizar estas classes é obrigatório assim como torna a vida muito mais fácil.
Instruções Import
Em Java, se um nome totalmente qualificado, que inclui o pacote e o nome da classe é dado, então o compilador pode facilmente localizar o código fonte ou classes. Instrução import é uma forma de dar a localização adequada para o compilador encontrar aquela classe particular.
Por exemplo, a seguinte linha pediria ao compilador para carregar todas as classes disponíveis no diretório java_installation/java/io:
import java.io.*;
Um Estudo de Caso Simples
Para nosso estudo de caso, criaremos duas classes. Elas são Employee e EmployeeTest.
Primeiro abra o bloco de notas e adicione o seguinte código. Lembre-se que esta é a classe Employee e a classe é uma classe pública. Agora, salve este arquivo fonte com o nome Employee.java.
A classe Employee tem quatro variáveis de instância - name, age, designation e salary. A classe tem um construtor explicitamente definido, que recebe um parâmetro.
Exemplo
import java.io.*;
public class Employee {
String name;
int age;
String designation;
double salary;
// Este é o construtor da classe Employee
public Employee(String name) {
this.name = name;
}
// Atribuir a idade do Employee à variável age.
public void empAge(int empAge) {
age = empAge;
}
/* Atribuir a designação à variável designation. */
public void empDesignation(String empDesig) {
designation = empDesig;
}
/* Atribuir o salário à variável salary. */
public void empSalary(double empSalary) {
salary = empSalary;
}
/* Imprimir detalhes do Employee */
public void printEmployee() {
System.out.println("Nome:"+ name );
System.out.println("Idade:" + age );
System.out.println("Designação:" + designation );
System.out.println("Salário:" + salary);
}
}
Como mencionado anteriormente neste tutorial, o processamento começa a partir do método main. Portanto, para que possamos executar esta classe Employee, deve haver um método main e objetos devem ser criados. Criaremos uma classe separada para estas tarefas.
Seguindo está a classe EmployeeTest, que cria duas instâncias da classe Employee e invoca os métodos para cada objeto para atribuir valores para cada variável.
Salve o seguinte código no arquivo EmployeeTest.java.
import java.io.*;
public class EmployeeTest {
public static void main(String args[]) {
/* Criar dois objetos usando construtor */
Employee empOne = new Employee("James Smith");
Employee empTwo = new Employee("Mary Anne");
// Invocando métodos para cada objeto criado
empOne.empAge(26);
empOne.empDesignation("Senior Software Engineer");
empOne.empSalary(1000);
empOne.printEmployee();
empTwo.empAge(21);
empTwo.empDesignation("Software Engineer");
empTwo.empSalary(500);
empTwo.printEmployee();
}
}
Agora, compile ambas as classes e então execute EmployeeTest para ver o resultado como segue:
Saída
C:\> javac Employee.java C:\> javac EmployeeTest.java C:\> java EmployeeTest Nome:James Smith Idade:26 Designação:Senior Software Engineer Salário:1000.0 Nome:Mary Anne Idade:21 Designação:Software Engineer Salário:500.0
O que Vem a Seguir?
Na próxima sessão, discutiremos os tipos de dados básicos em Java e como eles podem ser usados ao desenvolver aplicações Java.
Java
- Classes e Objetos em C#: Fundamentos para POO Robusta
- Classes e Objetos em C++: Guia Prático de Programação Orientada a Objetos
- Funções Amigas e Classes Amigas em C++: Dominando o Controle de Acesso
- Variáveis e Literais em Java: Guia Completo
- Classes e Objetos em Java: Guia Prático
- Entendendo a Palavra-chave final em Java: Variáveis, Métodos e Classes
- Operador instanceof em Java: Guia Completo
- Classes e Métodos Abstratos em Java: Guia Completo
- Dominando Classes Aninhadas e Internas em Java: Tipos, Exemplos e Boas Práticas
- Dominando Classes Internas Anônimas em Java: Definição, Sintaxe e Exemplos Práticos