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

5 respostas
S

#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:

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)");
            
        }
    }
    
}

Abaixo a classe colaboradores:

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;
    }
    
}

e abaixo a classe celetistas:

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;
    }
}

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.

5 Respostas

pmlm

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);
S

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:

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;
    }
}
A

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.

S

#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.

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?

S

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.

Criado 12 de outubro de 2015
Ultima resposta 13 de out. de 2015
Respostas 5
Participantes 3