Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Dificuldade de mostrar data de forma privada. Java

Boa tarde a todos.

Estou com dificuldade de mostrar a data de forma privada, o código abaixo está bem errado nisso, e não estou sabendo o que fazer.

package testefuncionario;

class Funcionario{
    private String nome;
    private double salario;
    private Data dataDeEntrada;

    public Funcionario(String nome, double salario, Data dataDeEntrada){
        this.nome = nome;
        this.salario = salario;
        this.dataDeEntrada = dataDeEntrada; 
    }

    public Funcionario(double salario){
    this.salario = salario;
    }

    public Funcionario(){

    }

    public void aumento (double recebeAumento){
        this.salario += recebeAumento;
    }

    public double getGanhoAnual() {
        return this.salario * 12;
    }

    public void mostra(){
        System.out.println("Salário atual: " + this.nome + " = " + this.salario);
        System.out.println("Salário anual: " + this.getGanhoAnual());

    }

    public String getNome(){
        return this.nome;
    }

    public void setNome (String nome){
        this.nome = nome;
    }

    public Data getDataDeEntrada(){
        return this.dataDeEntrada;
    }

    public void setDataDeEntrada (String Data){
        this.dataDeEntrada = dataDeEntrada;
    }

    public double getSalario(){
        return this.salario;
    }
    public void setSalario (double salario){
        this.salario = salario;
    }
}

class Empresa {
    private String Funcinario;
    private Funcionario[] empregados;


    public Funcionario getFuncionario (int posicao) {
        return this.empregados[posicao];
    }
}

class Data {
    int dia;
    int mes;
    int ano;

    void dataDeEntrada (int dia, int mes, int ano){
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }    

    String getFormatada (){
        return this.dataDeEntrada.dia + "/" + this.dataDeEntrada.mes + 
                "/" + this.dataDeEntrada.ano;
    }
}

public class TesteFuncionario {

    public static void main(String[] args) {
    Funcionario f1 = new Funcionario (1000.0);
    Data dataDeEntrada = new Data();
    f1.setNome("Pedro Manuel");
    f1.setSalario(1000.0);  
    f1.dataDeEntrada.getFormatada(1,9,2016);

    f1.aumento(100);

    f1.mostra();

    }
}
7 respostas

Oi Renato,

Quando você cria uma nova Data, você deveria passar a informação do dia, mes e ano direto no construtor da classe Data pois uma data não poderia ser criada sem estas informações.

A primeira coisa a fazer, é criar o construtor na classe Data. Você tem um método bem parecido com o que seria o construtor, o método dataDeEntrada, então você poderia substituí-lo pelo construtor.

Depois é só modificar a forma com que você cria o objeto do tipo Data passando as informações necessárias. No seu código estas informações estão sendo passadas por parâmetro do método getFormatada porém este método não recebe parâmetros em sua declaração.

Este método só deve ser utilizado para retornar a data formatada e o retorno dele pode ser impresso dentro de um System.out.println.

Tente fazer estas modificações e qualquer dúvida é só falar.

Abraço!

Voce tambem pode fazer da seguinte forma, usando Date diretamente. Sem a necessidade da funcao dataEntrada

Abaixo o exemplo

// Funcao para Formatar a data estilo (dia/mes/ano).
private static DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");

Voce faz a leitura da data usando String

String data = JOptionPane.showInputDialog(null, "Informe a data Ex: dd/mm/aaaa: )");

Ai pra fazer a conversao do tipo String para data voce usa a seguinte linha de codigo:

Date dataInicioConvertida = dateFormat.parse(dataIncio);

Apos isto é so passar para o seu contrutor a dataInicioConvertida.

Oi Julio,

A ideia do exercício é criar uma classe de Data mesmo, não usar uma pronta :D

Abraço!

Ah desculpa =/ Achei que ele estava com duvida relacionado a utilização da data (DATE) dentro do java :D. E nao havia percebido que era relacionado ao exercício.

Obrigado pelas resposta gente, mas eu estou com muita dificuldade nessa área mesmo. Estou re-assistindo todas as aulas para ver aonde eu me perdi, e depois tentar resolver esse exercício.

solução!

Renato, imagino que você esteja com erros de compilação, certo? Percebi alguns equívocos no seu código, vou passar por cada um.

Na classe Data existe um problema:

class Data {
    int dia;
    int mes;
    int ano;

    void dataDeEntrada (int dia, int mes, int ano){
        this.dia = dia;
        this.mes = mes;
        this.ano = ano;
    }    

    String getFormatada (){
        return this.dataDeEntrada.dia + "/" + this.dataDeEntrada.mes + 
                "/" + this.dataDeEntrada.ano;
    }
}

Os atributos dia, mes e ano pertencem à classe Data, certo? Porém, no método, você está fazendo chamadas assim:

this.dataDeEntrada.dia

O erro ocorre pois a classe Data não tem um atributo chamado dataDeEntada, que é o que você está tentando acessar. Mais detalhadamente, a palavra this representa a instancia atual da classe Data. o acesso .dataDeEntrada tenta acessar o atributo, mas ele não existe. A confusão deve ter ocorrido ao declarar o método dataDeEntrada, que atribui os valores ao dia, mes e ano.

No caso, não é necessário passar pelo método, basta ir direto ao atributo, assim:

    String getFormatada (){
        return this.dia + "/" + this.mes + "/" + this.ano;
    }

Outra coisa, na classe Funcionario foi declarado um atributo private Data dataDeEntrada. Portanto, para acessá-lo você precisa utilizar o getter e o setter criados. Porém, existe um erro no setter: o nome do parâmetro está errado. Precisa ser o mesmo nome que você insere no atributo, assim:

public void setDataDeEntrada(Data dataDeEntrada) {
  this.dataDeEntrada = dataDeEntrada;
}

Enfim, no seu TesteFuncionario, você manipula a data assim:

public class TesteFuncionario {
  public static void main(String[] args) {
    Funcionario f1 = new Funcionario (1000.0);
    Data dataDeEntrada = new Data();
    f1.setNome("Pedro Manuel");
    f1.setSalario(1000.0);  
    f1.dataDeEntrada.getFormatada(1,9,2016);
    f1.aumento(100);
    f1.mostra();
  }
}

O código new Data() retorna uma data com atributos vazios. Tente criar um construtor, que nem fez com o Funcionario, que já recebe dia, mes e ano. A chamada seria new Data(1,9,2016).

Você também não atribuiu a data criada ao funcionário. Precisa ser feito usando o setter, assim f1.setDataDeEntrada(dataDeEntrada);.

A chamada f1.dataDeEntrada está tentando acessar o atributo diretamente. Como ele é privado, é preciso usar o getter, então ficaria f1.getDataDeEntrada().

Já o método getFormatada() não recebe parâmetros, pois você usa os atributos internos da classe. a chamada completa então ficaria f1.getDataDeEntrada().getFormatada();, resultando no seguinte TesteFuncionario:

public class TesteFuncionario {
  public static void main(String[] args) {
    Funcionario f1 = new Funcionario (1000.0);
    Data dataDeEntrada = new Data(1,9,2016);
    f1.setNome("Pedro Manuel");
    f1.setSalario(1000.0);  
    f1.getDataDeEntrada().getFormatada();
    f1.aumento(100);
    f1.mostra();
  }
}

Muitíssimo obrigado Marcos, você me ajudou muito. Vou tentar refazer todo o código com o que você disse, para entender melhor. E muito obrigado a todos que responderam.