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

Construtor com this(...);

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        

}

Sobre o código acima, eu não estou conseguindo identificar a função desse this(), não entendi porque ele passa 3 argumentos, se no construtor só tem 2, o que exatamente ele faz?

Java OO: entendendo a Orientação a Objetos Java OO, tópico 7: entendendo a Orientação a Objetos Para saber mais: reaproveitamento entre construtores.

2 respostas
solução!

É o mesmo que utilizar um valor default pro primeiro parâmetro do construtor que utiliza todos os atributos da classe (ano, modelo, preco). Criando um segundo construtor com 2 parâmetros, mas passando no lugar do parâmetro omitido um valor fixo, automaticamente você estará usando o primeiro construtor criado, mas passando um valor fixo para um atributo, e 2 parâmetros variáveis para o restante. Inclusive se você trocar a ordem dos parâmetros no novo construtor, por exemplo: this(modelo, preco, 2017); o código não vai funcionar. Ou se você deixar o construtor novo como está, mas lá no primeiro construtor você colocar o ano como terceiro ao invés de primeiro parâmetro, novamente não vai funcionar.

Ahhhhhhh!!! Agora eu acho que eu entendi, então como falasse, esse segundo construtor está usando o primeiro mas utilizando um valor como default, o ano. Aí se eu criar instanciar assim : Carro carro = new Carro("modelo","preço"); o ano desse carro fica 2017, pois estaria usando esse segundo construtor. É, muito obrigado pela ajuda.