Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Esclarecimento Construtor this()

Bom dia! Tudo bem?

Quando uso esse código abaixo e chamo o Construtor Carro(String modelo, double preco) quer dizer que sempre transformará em Carro(2017, String modelo, double preco)?

Outra dúvida ele chama o Construtor Carro(int ano, String modelo, double preco) porque chamei this(int ano, String modelo, double preco), correto?

Nunca poderei ter dois Construtor com os mesmo campos, correto? Ele sobre-escreve de cima para baixo?

public class Carro{
    private int ano;
    private String modelo;
    private double preco;

    public Carro(int ano, String modelo, double preco){
        if(ano >= 1891){
            this.ano = ano;
        }else{
            System.out.println("O ano informado está inválido. Por isso usaremos 2017!");
            this.ano = 2017;
        }

        if( modelo != null){
            this.modelo = modelo;
        }else{
            System.out.println("O modelo não foi informado. Por isso usaremos Gol!");
            this.modelo = "Gol";
        }

        if(preco > 0){
            this.preco = preco;
        }else{
            System.out.println("O preço não é válido. Por isso usaremos 40000.0!");
            this.preco = 40000.0;
        }        
    }

    //Novo construtor AQUI!
    public Carro(String modelo, double preco){
        this(2017, modelo, preco);
    }

    //getters e setters omitidos        

}
1 resposta
solução!

Opa, blz?

Cara, o construtor serve para entregar um objeto de um determinado jeito logo na sua criação. No teu exemplo isso significa que você pode criar um objeto de Carro e ele será entregue da seguinte maneira: ano, modelo e preço. Porém a construção disso pode acontecer de duas maneiras:

Passando apenas o modelo e o preço. Em seu código é assumido que caso não seja passado o ano por parâmetro para o construtor o ano assumido tem o valor 2017.

Mas caso passe o ano, o valor assumido no objeto depende do valor passado por parâmetro que pose ser 2017 ou qualquer um maior que que 1891.

O que acontece no seu exemplo é uma sobrecarga, não uma sobrescrita.

A sobrecarga pode ter o mesmo nome, na mesma classe mas assinatura e tipo de retorno diferentes.. Já a sobrescrita está ligada a herança, aonde pode-se ter um método com o mesmo nome, tipo de retorno mas com alguma alteração interna na classe filha, usando a anotação @Override ..

Sobre as dúvidas: Quando uso esse código abaixo e chamo o Construtor Carro(String modelo, double preco) quer dizer que sempre transformará em Carro(2017, String modelo, double preco)?

Neste código sim, nem conseguirá criar um Carro sem esses parâmetros. Uma opção é criar um construtor vazio:

Carro( ) {

}

assim poderá criar um Carro c = new Carro();

Outra dúvida ele chama o Construtor Carro(int ano, String modelo, double preco) porque chamei this(int ano, String modelo, double preco), correto?

Não, ele chama porque você fez:

Carro c = new Carro (1991, "Palio", 15000.0);

por exemplo. Mas também poderia fazer:

Carro c = new Carro ("Palio", 15000.0); 

e o segundo construtor seria chamado.

Nunca poderei ter dois Construtor com os mesmo campos, correto? Ele sobre-escreve de cima para baixo?

Não.. Os parâmetros são parte de assinatura de métodos e não podem se repetir no caso de construtores..