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

Ordem das variáveis

class funcionario {
     String nome;
     String departamento;
     double salario;
     String rg;
     double valorano;
     void recebeaumento(double valoraumento){
        this.salario= salario+valoraumento;
        }

     void calculaano(){ 
        valorano=this.salario*12;
     }
     void mostra(){      // AQUI
         System.out.print(this.nome+"\n"+this.departamento+"\n"+this.salario+"\n"+this.data.dia+"\n"+this.data.mes+"\n"+this.data.ano+"\n"+this.rg+"\n");    
     }
}

class data {  //AQUI
    int dia;
    int mes;
    int ano;

}
class Programa{
    public static void main(String[] args) {

    funcionario vitor = new funcionario();
    data vitor = new data();
    vitor.nome = "vitor";
    vitor.departamento= "contas";
    vitor.salario= 1200.0;
    vitor.data.dia=13;
    vitor.data.mes=12;
    vitor.data.ano=1997;
    vitor.rg= "502450782";
    vitor.mostra();
    vitor.recebeaumento(100);
    System.out.println("Aplicando aumento"+"\n"+vitor.salario);

    vitor.calculaano();
    System.out.println(vitor.valorano);
}
}

Oi, tenho duas perguntas: Porque essa estrutura está errada? O java segue uma ordem de leitura, entao quer dizer que eu não posso colocar a função mostra() antes da class data porque ele não vai saber onde estão as variáveis data/mes/ano?

7 respostas
solução!

Marco, a estrutura não está errada...

Faltou você declarar um atributo do tipo Data (a recomendação é que as classes em Java [sua classe data] comece com letra maiúscula) na classe Funcionario (coloca maiúsculo também o f).

Assim:

class funcionario {
    String nome;
    String departamento;
    double salario;
    String rg;
    double valorano;
    Data data;
    // restante do código
}

Quanto à segunda dúvida, essas coisas ficarão mais claras quando você aprender sobres modificadores de acesso e encapsulamento, com uso de getter e setter.

Faz o teste aí e dá um retorno...

Abraço.

Entendi, se elas se relacionam eu preciso declarar na outra classe também. Agora com relação a o Data vitor = new Data(); ele diz variable vitor is already defined in method main ( string)

class Programa{
    public static void main(String[] args) {

    Funcionario vitor = new Funcionario();
    Data vitor = new Data();
    vitor.nome = "vitor";
    vitor.departamento= "contas";
    vitor.salario= 1200.0;
    vitor.data.dia=13;
    vitor.data.mes=12;
    vitor.data.ano=1997;
    vitor.rg= "502450782";
    vitor.mostra();
    vitor.recebeaumento(100);
    System.out.println("Aplicando aumento"+"\n"+vitor.salario);

Esse erro aí é porque você não pode ter dois atributos com o mesmo nome. Perceba que você já declarou um atributo vitor do tipo Funcionario. Daí, você não pode declarar outro atributo chamado vitor do tipo Data.

Faz assim (por exemplo):

Funcionario vitor = new Funcionario();
Data dataDeNascimento = new Data();
// restante do código

Nesse caso eu nao preciso mudar o vitor.data.dia etc? Agora ele compila mas dá: Exception in thread "main" java.lang.nullpointerexception. quando vou executar

Tá, pelo que parece como data tava declarado na class funcionário eu não posso colocar o Data dataDeNascimento como você disse, se eu colocar vitor.data = new data() ele funciona normalmente

Funcionario vitor = new Funcionario();
    vitor.data = new Data();
    vitor.nome = "vitor";
    vitor.departamento= "contas";
    vitor.salario= 1200.0;
    vitor.data.dia=13;
    vitor.data.mes=12;
    vitor.data.ano=1997;

Precisa sim, Marco!

Se você criar um atributo do tipo Data, chamado dataDeNascimento, você não terá mais o vitor.data.dia, por exemplo, você terá vitor.dataDeNascimento.dia. Entendeu?

Então, teu código terá que ficar assim:

vitor.dataDeNascimento.dia=13;
vitor.dataDeNascimento.mes=12;
vitor.dataDeNascimento.ano=1997;

Testa aí...

Ficou meio confuso porque usamos dois nomes para o atributo data.

class funcionario {
    String nome;
    String departamento;
    double salario;
    String rg;
    double valorano;
    Data dataDeNascimento = new Data();
    // restante do código
}

Daí, o seu main assim:

class Programa {
    public static void main(String[] args) {

    Funcionario vitor = new Funcionario(); // declarando e instanciando o objeto "vitor" do tipo "Funcionario"
    vitor.dataNascimento = new Data(); // instanciando o objeto "dataDeNascimento" do tipo "Data", dentro do objeto "vitor".

    vitor.nome = "vitor";
    vitor.departamento= "contas";
    vitor.salario= 1200.0;
    vitor.dataDeNascimento.dia=13;
    vitor.dataDeNascimento.mes=12;
    vitor.dataDeNascimento.ano=1997;
    vitor.rg= "502450782";
    // restante do código
}

Ficou mais claro assim?