Java Orientado a Objetos: Fields
No universo da programação orientada a objetos em Java, as variáveis que compõem uma classe são chamadas de fields, também conhecidas como campos ou atributos. Eles são fundamentais na definição das características e do estado de um objeto. Ao explorar o papel dos fields na prática, vamos entender como eles são definidos, acessados e manipulados dentro de uma estrutura de classe no Java.
Considere um exemplo prático onde temos duas classes distintas em um pacote chamado com.mycompany.demonstracaopoo
. A classe principal é DemonstracaoPoo.java
, e a outra é Funcionario.java
, representando um funcionário com seus respectivos atributos e comportamentos.
Conteudo Classe “DemonstracaoPoo”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com.mycompany.demonstracaopoo; public class DemonstracaoPoo { public static void main(String[] args) { Funcionario Funcionario1 = new Funcionario("Peter"); Funcionario1.sethorasTrabalhadas(160); int pay = Funcionario1.calculaPagamento(1000, 400); System.out.println("Pay = " + pay); /* Funcionario Funcionario2 = new Funcionario("Jane", "Lee"); Funcionario2.sethorasTrabalhadas(160); pay = Funcionario2.calculaPagamento(); System.out.println("Pay = " + pay); */ /* System.out.println("\n\nUpdating Jane's Horas Trabalhadas to -10"); Funcionario2.sethorasTrabalhadas(-10); System.out.println("\nHoras Trabalhadas = " + Funcionario2.gethorasTrabalhadas()); pay = Funcionario2.calculaPagamento(); System.out.println("Pay = " + pay); */ } } |
Conteudo Classe “Funcionario”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
package com.mycompany.demonstracaopoo; public class Funcionario { private String nomeDoFuncionario; private final int valorHora = 30; private int horasTrabalhadas; public void printMessage() { System.out.println("Calculando Pagamento…"); } public int calculaPagamento() { printMessage(); int pagamentoFuncionario; pagamentoFuncionario = horasTrabalhadas * valorHora ; if (horasTrabalhadas > 0) return pagamentoFuncionario; else return -1; } public int calculaPagamento(int bonus, int allowance) { printMessage(); if (horasTrabalhadas > 0) return horasTrabalhadas * valorHora + bonus + allowance; else return 0; } public void sethorasTrabalhadas(int hours) { if (hours>0) horasTrabalhadas = hours; else { System.out.println("Error: horasTrabalhadas Cannot be Smaller than Zero"); System.out.println("Error: horasTrabalhadas is not updated"); } } public int gethorasTrabalhadas() { return horasTrabalhadas; } public Funcionario(String name) { nomeDoFuncionario = name; System.out.println("\n" + nomeDoFuncionario); System.out.println("---------------------------"); } public Funcionario(String firstName, String lastName) { nomeDoFuncionario = firstName + " " + lastName; System.out.println("\n" + nomeDoFuncionario); System.out.println ("---------------------------"); } } |
O Papel dos Fields em uma Classe
Imagine um funcionário em uma empresa: ele tem um nome, uma quantidade de horas trabalhadas e um pagamento a receber. Cada um desses aspectos pode ser representado em uma classe Java como um field. A classe Funcionario
terá campos correspondentes a essas informações. O campo nomeDoFuncionario
armazena o nome, horasTrabalhadas
indica as horas de trabalho e um valor fixo por hora, valorHora
, que é utilizado para calcular o pagamento.
Definindo Fields de Classe
Os fields são declarados dentro de uma classe, mas fora de qualquer método ou construtor. Eles são definidos especificando o tipo de dado seguido pelo nome do campo. Por exemplo:
1 2 3 4 |
private String nomeDoFuncionario; private int horasTrabalhadas; |
Esses campos foram definidos como private
, o que significa que eles só podem ser acessados diretamente dentro da própria classe Funcionario
. Isso é uma prática de encapsulamento para proteger os dados do acesso externo direto.
Acessando e Modificando Fields
Embora os campos privados não possam ser acessados diretamente de fora da classe, eles podem ser modificados por métodos definidos na classe, conhecidos como getters e setters. Por exemplo, o método sethorasTrabalhadas
permite que o usuário defina o número de horas trabalhadas, desde que seja um valor positivo:
1 2 3 4 5 6 7 8 9 10 |
public void sethorasTrabalhadas(int hours) { if (hours > 0) horasTrabalhadas = hours; else { System.out.println("Error: horasTrabalhadas Cannot be Smaller than Zero"); System.out.println("Error: horasTrabalhadas is not updated"); } } |
O método gethorasTrabalhadas
, por sua vez, permite recuperar o valor do campo horasTrabalhadas
.
Construtores e Fields
Os construtores são usados para inicializar os objetos com valores específicos para seus fields. Na classe Funcionario
, há dois construtores. O primeiro recebe um único nome:
1 2 3 4 5 6 |
public Funcionario(String name) { nomeDoFuncionario = name; // ... } |
O segundo aceita um primeiro nome e um sobrenome, combinando-os para formar o nome completo do funcionário:
1 2 3 4 5 6 |
public Funcionario(String firstName, String lastName) { nomeDoFuncionario = firstName + " " + lastName; // ... } |
Calculando o Pagamento
Os métodos calculaPagamento
mostram a flexibilidade em Java para lidar com diferentes cenários. O primeiro não recebe argumentos e simplesmente calcula o pagamento multiplicando as horas trabalhadas pelo valor fixo por hora:
1 2 3 4 5 6 7 |
public int calculaPagamento() { // ... pagamentoFuncionario = horasTrabalhadas * valorHora; // ... } |
O segundo método aceita um bônus e um adicional (allowance) que são somados ao pagamento total:
1 2 3 4 5 6 7 |
public int calculaPagamento(int bonus, int allowance) { // ... return horasTrabalhadas * valorHora + bonus + allowance; // ... } |
Usando a Classe DemonstracaoPoo
A classe DemonstracaoPoo
serve como ponto de entrada para o nosso programa Java e interage com a classe Funcionario
. Ela cria um objeto Funcionario1
e utiliza os métodos da classe Funcionario
para definir as horas trabalhadas e calcular o pagamento.
1 2 3 4 5 6 |
Funcionario Funcionario1 = new Funcionario("Peter"); Funcionario1.sethorasTrabalhadas(160); int pay = Funcionario1.calculaPagamento(1000, 400); System.out.println("Pay = " + pay); |
Compreendendo a Saída do Programa
Quando o método sethorasTrabalhadas
é invocado com um valor negativo, o programa imprime mensagens de erro, porque a classe Funcionario
foi projetada para proteger a integridade do campo horasTrabalhadas
. Da mesma forma, o pagamento é calculado com base nas horas validadas.
Conclusão
Fields são uma parte integrante de qualquer classe em Java, fornecendo os meios pelos quais um objeto pode manter seu estado. A classe Funcionario
é um exemplo claro de como campos são usados em conjunto com construtores, métodos e a lógica de negócios para criar um objeto com características e comportamentos. Ao dominar o uso de fields, construtores e métodos, você está no caminho certo para se tornar proficiente em Java e programação orientada a objetos. A estrutura que aprendemos aqui com com.mycompany.demonstracaopoo.Funcionario
e com.mycompany.demonstracaopoo.DemonstracaoPoo
fornece uma base sólida para expandir seus conhecimentos e habilidades na criação de programas mais complexos e robustos.