Como iniciar método automaticamente dentro da classe assim que instanciada? [RESOLVIDO]

#Update 2, o erro era de lógica, esta resolvido no meu post mais abaixo.

#Update gente. Mudei o titulo pois agora entendi o erro.
Meu professor me mandou um email após ver o código.
ele disse que esta ok o que acontece é que o método calculaSalarioBruto() só é chamado la embaixo no método calculaSalarioLiquido()
Agora eu gostaria de saber se é possível fazer com que esse método calcule o valor ja quando o objeto é instanciado, pois eu passo os parâmetros necessários por teclado antes de instanciar… Tem como fazer o método apenas executar assim que o objeto é instanciado? Lembrando que ele é private e eu não consigo chamar ele no main.

Boa noite. Esta é a primeira vez que recorro a algum fórum para solicitar ajuda com java, eu costumo ler muito antes, mas dessa vez ta difícil pra mim.
O app calcula pagamento de colaboradores, deve retornar salario bruto, impostos, salario liquido, etc.
Quando eu utilizo um valor baixo para valor/hora e até 160 de quantidade de horas, ou seja, quando o valor liquido vai ser baixo, esta retornando o valor liquido certo, apenas o valor liquido, os impostos não, nem o bruto. Quando o valor do salario é muito alto, retorna tudo zerado.

Segue abaixo o código:

Aplicação:

[code]package Aplicacoes;
import Modelos.*;

public class ATPS {

public static void main(String[] args) 
{
    //Menu Principal
    
    System.out.println("Selecione o tipo de colaborador para calculo de pagamento:");
    System.out.println("Digite 1 para Celetista");
    System.out.println("Digite 2 para Pessoa Juridica");
    System.out.println("Digite 0 para Sair");
    try{
        int x = Keyboard.readInt();
        if(x == 1){
            //preenchendo os dados de Celetistas
            System.out.println("Digite o NOME");
            String n = Keyboard.readString();
            
            System.out.println("Digite o ENDEREÇO");
            String e = Keyboard.readString();
            
            System.out.println("Digite o TELEFONE");
            int tel = Keyboard.readInt();
            
            System.out.println("Digite o RG");
            int rg = Keyboard.readInt();
            
            System.out.println("Digite o CPF");
            String cpf = Keyboard.readString();
            
            System.out.println("Digite o VALOR/HORA");
            float valorH = Keyboard.readFloat();
            
            System.out.println("Digite a quantidade de HORAS TRABALHADAS");
            int hrs = Keyboard.readInt();
            
            Celetistas c1 = new Celetistas(n, e, tel, rg, cpf, valorH, hrs);
                                       
            System.out.println(c1.toString());
        }
          
    }catch(RuntimeException e){
        System.out.println("Escolha uma opção válida (1,2 ou 0)");
        
    }
}

}[/code]

Abaixo a classe colaboradores:

[code]package Modelos;

public class Colaboradores
{
public static String nome;
public static String endereco;
public static int telefone;

public Colaboradores(String n, String e, int tel)
{
    nome = n;
    endereco = e;
    telefone = tel;
}

public void setNome(String valor)
{
    nome=valor;
}

public void setEndereco(String valor)
{
    endereco=valor;
}

public void setTelefone(int valor)
{
    telefone=valor;
}

public String toString()
{
    String colaborador = "Dados do colaborador: \nNome: "+nome+"\nEndereço: "+endereco+"\nTelefone: "+telefone;
    return colaborador;
}

}[/code]

e abaixo a classe celetistas:

[code]package Modelos;

public class Celetistas extends Colaboradores
{
private int RG;
private String CPF;
private float valorHora;
private double salario;
private double salarioLiquido;
private int horas;
private double irrf;
private double inss;

public Celetistas(String n, String e, int tel, int rg, String cpf, float valorH, int hrs)
{
    super(n, e, tel); // atributos da classe pai
    RG = rg;
    CPF = cpf;
    valorHora = valorH;
    horas = hrs;
}

public void setValorHora(int valorH)
{
    valorHora=valorH;
}

public void setSalario(double valor) // set para modificar o valor do salario bruto mensal
{
    salario=valor;
}

private double calculaSalarioBruto() //calculo do salario com ou sem hora extra
{
    if(horas <= 160){ //até 160 horas o salario é o valor bruto
        salario = horas * valorHora;
    }
    else if(horas >= 161){ // horas excedentes de 160 tem valor extra (valor do salario / 160 * total de horas trabalhadas
        salario = (salario/160) * horas;
    }
    return salario;
}       
        
public double getSalarioBruto() // get para pegar o salario bruto
{
    double salarioBruto = salario;
    return salarioBruto;
}

private double calculaIRRF() //calculo do IRRF/IRPF - Imposto retido pela fonte
{
    if(salario <= 1495.15){
        
        irrf=0; //imposto isento
    }
    else if(salario >= 1495.16 && salario <= 2246.75){
        
        irrf=salario*(7.5/100)-112.43; //imposto de 7,5%, dedução de 112,43
    }
    else if(salario >= 2246.76 && salario <= 2995.70){
    
        irrf=salario*(15/100)-280.94; //imposto de 15%, dedução de 280,94
    }
    else if(salario >= 2995.71 && salario <= 3743.19){
        
        irrf=salario*(22.5/100)-505.62; //imposto de 22,5%, dedução de 505,62
    }
    else if(salario >= 3743.20){
        
        irrf=salario*(27.5/100)-672.78; //imposto de 27,5%, dedução de 327,78
    }
    return irrf;
}

private double calculaINSS() //metodo calcula o INSS
{
    if(salario < 965.67){
        
        inss=salario*(8/100);
    }
    else if(salario >= 965.68 && salario <= 1609.45){
        
        inss=salario*(9/100);
    }
    else if(salario > 1609.45){
        
        inss=salario*(11/100);
        
        if(inss > 354.08){ //se o INSS passar de 354.08, definir com esse valor pois não pode ser maior.
            
            inss=354.08;
        }
    }
    return inss;
}

private double calculaSalarioLiquido()// metodo calcula o salario liquido
{
    salarioLiquido = (calculaSalarioBruto())-(calculaIRRF())-(calculaINSS());
    return salarioLiquido;
}

public String getImpostos() // get dos impostos
{
        String showImpostos = "O valor do IRRF é de: R$"+irrf+"\n"
        +"O valor do INSS é de: R$"+inss;
   return showImpostos;
}

public String toString() // toString geral, mostra todas as informações para o pagamento
{
    String resumo = super.toString()+"\nCPF: "+CPF+"\nRG: "+RG
            +"\nSalário bruto: R$"+getSalarioBruto()
            +"\nImpostos:\n"+getImpostos()
            +"\nSalario Liquido: R$"+calculaSalarioLiquido();
    return resumo;
}

}[/code]

Obs.: eu ainda não fiz todo o código, então só funciona se eu escolher a opção 1 no aplicativo, que entra para o calculo dos celetistas que foi o que eu tentei implementar, mas ajustando esse o outro é bem parecido os métodos, então se eu enxergar meu erro aí eu consigo corrigir no outro também.

Coloquei o app em anexo, caso alguém queira testar, eu utilizo o NetBeans para estudar.

Se alguém puder me ajudar, agradeço.

Não analisei com detalhe mas há uma coisa que deves saber: a divisão de dois inteiros, dá um inteiro.

(...)
irrf=salario*(15/100)-280.94; //imposto de 15%, dedução de 280,94  
(...)
inss=salario*(8/100);  
(...)
 inss=salario*(9/100);  
(...)
 inss=salario*(11/100);  
(...)

O que tens entre parêntesis dá sempre 0, uma vez que o valor inteiro da divisão é 0. Deves colocar um dos números como decimal para teres o resultado esperado. Para isso, basta colocares .0.

Ex:

inss=salario*(8.0/100);  

Entendi, então eu fiz o seguinte. Onde era (x/100) para ter a porcentagem eu troquei e fiz multiplicando por exemplo, x*(7.5/100) troquei por x*0.075. Ainda sim os valores de saída estão incorretos. O valor do salário liquido, mesmo quando é baixo e não deveria ter nenhum desconto, esta tendo. por exemplo com valor da hora a 5 e quantidade de horas a 160 = 800, era pra ser esse o liquido, mas esta saindo 736, não estou conseguindo visualizar o erro. E quando a quantidade de horas é maior que 160 ainda sai tudo zerado até o salario liquido. (Obs. até agora não consegui fazer calcular os impostos corretamente, sai sempre zerado os impostos.

Segue o código de celetistas alterado:

[code]package Modelos;

public class Celetistas extends Colaboradores
{
private int RG;
private String CPF;
private float valorHora;
private double salario;
private double salarioLiquido;
private int horas;
private double irrf;
private double inss;

public Celetistas(String n, String e, int tel, int rg, String cpf, float valorH, int hrs)
{
    super(n, e, tel); // atributos da classe pai
    RG = rg;
    CPF = cpf;
    valorHora = valorH;
    horas = hrs;
}

public void setValorHora(int valorH)
{
    valorHora=valorH;
}

public void setSalario(double valor) // set para modificar o valor do salario bruto mensal
{
    salario=valor;
}

private double calculaSalarioBruto() //calculo do salario com ou sem hora extra
{
    if(horas <= 160){ //até 160 horas o salario é o valor bruto
        salario = horas * valorHora;
    }
    else if(horas >= 161){ // horas excedentes de 160 tem valor extra (valor do salario / 160 * total de horas trabalhadas
        salario = ((salario*0.00625) * horas);
    }
    return salario;
}       
        
public double getSalarioBruto() // get para pegar o salario bruto
{
    double salarioBruto = salario;
    return salarioBruto;
}

private double calculaIRRF() //calculo do IRRF/IRPF - Imposto retido pela fonte
{
    if(salario <= 1495.15){
        
        irrf=0.0; //imposto isento
    }
    else if(salario >= 1495.16 && salario <= 2246.75){
        
        irrf=salario*0.075 - 112.43; //imposto de 7,5%, dedução de 112,43
    }
    else if(salario >= 2246.76 && salario <= 2995.70){
    
        irrf=salario*.15 - 280.94; //imposto de 15%, dedução de 280,94
    }
    else if(salario >= 2995.71 && salario <= 3743.19){
        
        irrf=salario*.225 - 505.62; //imposto de 22,5%, dedução de 505,62
    }
    else if(salario >= 3743.20){
        
        irrf=salario*.275 - 672.78; //imposto de 27,5%, dedução de 327,78
    }
    return irrf;
}

private double calculaINSS() //metodo calcula o INSS
{
    if(salario < 965.67){
        
        inss=salario*0.08;
    }
    else if(salario >= 965.68 && salario <= 1609.45){
        
        inss=salario*0.09;
    }
    else if(salario > 1609.45){
        
        inss=salario*0.11;
        
        if(inss > 354.08){ //se o INSS passar de 354.08, definir com esse valor pois não pode ser maior.
            
            inss=354.08;
        }
    }
    return inss;
}

private double calculaSalarioLiquido()// metodo calcula o salario liquido
{
    salarioLiquido = (calculaSalarioBruto())-(calculaIRRF())-(calculaINSS());
    return salarioLiquido;
}

public String getImpostos() // get dos impostos
{
        String showImpostos = "O valor do IRRF é de: R$"+calculaIRRF()+"\n"
        +"O valor do INSS é de: R$"+calculaINSS();
   return showImpostos;
}

public String toString() // toString getal, mostra todas as informações para o pagamento
{
    String resumo = super.toString()+"\nCPF: "+CPF+"\nRG: "+RG
            +"\nSalário bruto: R$"+getSalarioBruto()
            +"\nImpostos:\n"+getImpostos()
            +"\nSalario Liquido: R$"+calculaSalarioLiquido();
    return resumo;
}

}[/code]

Qual a fórmula de cálculo para o salário bruto quando horas for maior que 160? O seu cálculo resulta em zero pois salario está zerado.

[quote]#Update gente. Mudei o titulo pois agora entendi o erro.
Meu professor me mandou um email após ver o código.
ele disse que esta ok o que acontece é que o método calculaSalarioBruto() só é chamado la embaixo no método calculaSalarioLiquido()
Agora eu gostaria de saber se é possível fazer com que esse método calcule o valor ja quando o objeto é instanciado, pois eu passo os parâmetros necessários por teclado antes de instanciar… Tem como fazer o método apenas executar assim que o objeto é instanciado? Lembrando que ele é private e eu não consigo chamar ele no main. [/quote]

No enunciado diz assim. Caso o número de horas seja 161 ou mais, o calculo é o seguinte:
Calcule o valor de cada hora extra dividindo por o salário 160.
O valor bruto do salário será o número de horas trabalhadas no mês multiplicado pelo valor da hora calculado.

Eu entendi que fosse assim:

if(horas <= 160){ //até 160 horas o salario é o valor bruto salario = horas * valorHora; } else if(horas >= 161){ // horas excedentes de 160 tem valor extra (valor do salario / 160 * total de horas trabalhadas salario = ((salario*0.00625) * horas); } return salario;

Multipliquei por 0.00625 ao invés de dividir por 160, que teria que dar o mesmo resultado, certo? Na verdade fiz isso pra não dividir pelo número inteiro 160.
Mas de qualquer forma, os impostos nunca estão sendo processados, você consegue entender porque?
A partir do momento que eu instancio o objeto c1(de celetistas), passo o valor por hora e quantidade de horas e no final eu chamo o toString dele, esse toString pede o resultado do calculo dos métodos de calcular o imposto, mas o imposto vem zerado.
Eu estou errando na matemática?

Eu consegui resolver o problema.
Na verdade o meu calculaSalarioBruto() só estava sendo chamado no toString no final do código. Dessa forma os impostos que tinham que ser calculados com base no salario bruto estavam recebendo o salario com valor 0.
O que eu fiz foi alterar o construtor que estava assim:

public Celetistas(String n, String e, int tel, int rg, String cpf, float valorH, int hrs) { super(n, e, tel); // atributos da classe pai RG = rg; CPF = cpf; valorHora = valorH; horas = hrs; }

E adicionar o salario bruto nele, recebendo o método calculaSalarioBruto()… que ficou assim:

public Celetistas(String n, String e, int tel, int rg, String cpf, float valorH, int hrs) { super(n, e, tel); // atributos da classe pai RG = rg; CPF = cpf; valorHora = valorH; horas = hrs; salario = calculaSalarioBruto(); }

Agora todos os valores estão corretos.