Método get só retorna zero

Boa Noite

Estou fazendo um exercício do livro “Java Como Programar 8” e é pedido para criptografar um número inteiro de 4 dígitos. Para isso usei uma classe que fiz para separar os dígitos, fiz o esquema da criptografia e uni os dígitos novamente só que já criptografados.
O problema é que o resultado da criptografia só da 7777, porque a classe que separa os dígitos não está recebendo o valor que eu digito no programa de teste(main).
É esse o código que fiz:

// Programa que criptografa um inteiro de 4 dígitos

public class Criptografar
{    
    private int valor; // armazena o valor inicial
    
    public Criptografar( int valorInicial )
    {
        valor = valorInicial;
        
    }// Fim do construtor 
    
    int n1, n2, n3, n4; // armazenam os dígitos criptografados
    
    Separa sepCripto = new Separa( valor ); // separa os dígitos        
    
    public void setValor( int valorSet)
    {
        valor = valorSet;
    }// Fim do método serValor
    
    public int getValor()
    {
        return valor;
    }// Fim do método getValor
    
    //QUANDO ACESSO O MÉTODO ABAIXO ELE SÓ RETORNA ZERO
    public int getNumSepara()          
    {                                 
        return sepCripto.getNumero(); 
    } // Fim do método getNumSepara                                
    
    public int getCripFull() // criptografa e une os dígitos em um único inteiro
    {
        //Critografia
        n1 = (sepCripto.getNum1() + 7) % 10; 
        n2 = (sepCripto.getNum2() + 7) % 10;
        n3 = (sepCripto.getNum3() + 7) % 10;
        n4 = (sepCripto.getNum4() + 7) % 10; 
        
        // união dos dígitos
        return n1 * 1000 +
               n2 *  100 +
               n3 *   10 +
               n4 *    1; 
        
    }// Fim do método getCripFull  
}// Fim da classe Criptografar

Por favor alguém pode me ajudar?

Olá.

Por favor, não banalize tags informativas como [Resolvido] usando-as para postar o óbvio, como [Ajuda] ou [Dúvida].

Você não postou sua classe Separa. Sem ela, fica bem difícil te ajudar.

Aqui está a classe Separa:

//Programa que separa um número de 4 dígitos 

public class Separa
{
    private int number;
    private int num1, num2, num3, num4;
        
    public Separa(int valor4)// construtor da classe Separa
    {
        number = valor4;
        num1 = 0;
        num2 = 0;
        num3 = 0;
        num4 = 0;
    }// Fim do construtor    
    
    
    public void setNumero( int numS ) // configura o valor para ser separado
    {
        number = numS;
    }// Fim do método setNumero 
    
    public int getNumero() // retorna o valor do qual foi solicitada a separação de dígitos
    {
        return number;
    }// Fim do método getNumero
    
    public int getNum1() // obtém o primeiro dígito
    {
        num1 = number / 1000;          
            
        return num1;           
    
    }// Fim do método getNum1 
    
    public int getNum2() // obtém o segundo dígito
    {
        num2 = (number % 1000) / 100;
        
        return num2;
    }//Fim do método getNum2
    
    public int getNum3() // obtém o terceiro dígito
    {
        num3 = ((number % 1000) % 100) / 10;
        
        return num3;
    }//Fim do método getNum3
    
    public int getNum4() // obtém o quarto dígito
    {
        num4 = (((number % 1000) % 100)% 10)/1;
        
        return num4;
    }//Fim do método getNum4         
    

}//Fim da classe Separa

Desculpe pelo erro

A lógica está quase certa. Mas veja bem o que você está fazendo:

num3 = ((number % 1000) % 100) / 10;  

Número (exemplo):
1234

(number % 1000) = 234 (number % 1000) % 100) = 4 % 100 = 34 ((number % 1000) % 100) / 10 = 34 / 10 = 3

Creio que não fosse isso que você queria, certo?

Antes de eu te passar a solução, procure pensar um pouco sobre como seria o código correto.

Eu não entendi

Porque assim, vou copiar só a lógica que usei para separar os dígitos:

num1 = number / 1000;
num2 = (number % 1000) / 100;
num3 = ((number % 1000) % 100) / 10;
num4 = (((number % 1000) % 100)% 10)/1;

Eu testei essa classe várias vezes e funcionou certinho.

Não entendi o código que você postou, você poderia me explicar um pouco mais detalhadamente?

Ops. Acho que me confundi nas contas. Vou revisar aqui.

Achei seu erro.

Na linha 15 da classe Criptografar você fez:

Separa sepCripto = new Separa( valor ); // separa os dígitos  

Ocorre que esse código roda antes do construtor e, ali, o valor do atributo valor é o padrão, 0.
A posição que ele é declarado na classe não importa, pois toda inicialização de atributos, quando feita diretamente com igual dessa forma, roda quando o atributo é criado, ou seja, no momento em que a classe é criada, antes do construtor rodar.

Você deve inicializa-lo no construtor:

// Programa que criptografa um inteiro de 4 dígitos

public class Criptografar
{    
   //Para não dar confusão, vamos deixar os atributos juntos.
    private int valor; // armazena o valor inicial
    private int n1, n2, n3, n4; // armazenam os dígitos criptografados    
    private Separa sepCripto = null;
    
    public Criptografar( int valorInicial )
    {
        valor = valorInicial;
        sepCripto = new Separa( valor ); // Inicialização no local correto                
    }// Fim do construtor 
    
    public void setValor( int valorSet)
    {
        valor = valorSet;
    }// Fim do método serValor
    
    public int getValor()
    {
        return valor;
    }// Fim do método getValor
    
    public int getNumSepara()          
    {                                 
        return sepCripto.getNumero(); 
    } // Fim do método getNumSepara                                
    
    public int getCripFull() // criptografa e une os dígitos em um único inteiro
    {
        //Critografia
        n1 = (sepCripto.getNum1() + 7) % 10; 
        n2 = (sepCripto.getNum2() + 7) % 10;
        n3 = (sepCripto.getNum3() + 7) % 10;
        n4 = (sepCripto.getNum4() + 7) % 10; 
        
        // união dos dígitos
        return n1 * 1000 +
               n2 *  100 +
               n3 *   10 +
               n4 *    1; 
        
    }// Fim do método getCripFull  
}// Fim da classe Criptografar

Nossa, muito obrigado mesmo pela ajuda. Era isso mesmo o que estava acontecendo, eu não ia conseguir resolver isso sozinho. Obrigado pela força. :smiley: