Dúvida com construtor Padrão

Olá Pessoal.

Estou estudando o livro Java como Programa da Deitel (8º ed.). Faço os exercícios propostos e depois procuro na internet resoluções para comparar com as minhas. Sempre que é solicitado a criação de um construtor, eu crio um construtor padrão para inicializar os campos com valores default ( como 0 para um int ou “” para uma String), só que olhando as resoluções de outros, vejo que já fazem os construtores inicializando as variáveis recebendo os parâmetros que serão usados no main. a questão é…

Isso não é um construtor parametrizado e não um construtor padrão? qual devo usar quando é solicitado apenas com a palavra “construtor”?

Obrigado!

Use da forma que melhor te atender.
Vc pode usar o construtor default:

public Construtor(){}

ou inicializando as variáveis:

public Construtor(){
this.nome = "";
}

ou recebendo parametrizado:

public Construtor(String nome){
this.nome =nome
}

Depende de sua necessidade. Imagine uma classe Carro. Existe um carro sem fabricante? Então isso já deve ser passado como parametro no construtor para que force, na criação do objeto, o preenchimento deste atributo:

[code]public class Carro {
private String fabricante;

public Carro(String meuFabricante){
    this.fabricante = meuFabricante;
}

}[/code]

Agora pense numa classe Bolso. (Estou abstraindo levando em consideração meu bolso mesmo!Rsrsrsrs). Existe bolso sem dinheiro não é?(meu caso. srsrsrs) Então não preciso iniciar o objeto setando o valor como anteriormente.

[code]public class Bolso{
private double valor;

public void setValor(double deposito){
     this.valor = deposito;
}

}[/code]
Entendeu?

No segundo caso, note que não declarei o construtor, o java assume um construtor padrão. Sem parametros.

auahuahuahu pode crer, sou uma instância dessa classe bolso ai também!

entendi sim cara, obrigado pela explicação.

Agora quanto a classe carro, por exemplo seria adequado eu iniciar com uma String “Sem Marca”, correto? Só para ver se eu entendi mesmo, pq por exemplo, iniciar com “Ferrari” não faria sentido pois todo carro tem uma marca, mas não necessáriamente Ferrari. É isso mesmo?

Brigadão!

Olá!

Neste caso, seria melhor não iniciar o fabricante. Deixe como null.

Uma coisa a se obersvar é que quando você cria um novo objeto, os atributos são inicializados com seus valores default. Isso quer dizer que você não precisa inicializa-los manualmente no seu construtor.


class Carro
{
    int ano;
}

terá o mesmo efeito de


class Carro
{
    int ano;
   
    public Carro()
    {
        int ano = 0;
    }
}

*Obs.: O default para String é null e não “” (vazio).

att,

[quote=Rafael T.]auahuahuahu pode crer, sou uma instância dessa classe bolso ai também!

entendi sim cara, obrigado pela explicação.

Agora quanto a classe carro, por exemplo seria adequado eu iniciar com uma String “Sem Marca”, correto? Só para ver se eu entendi mesmo, pq por exemplo, iniciar com “Ferrari” não faria sentido pois todo carro tem uma marca, mas não necessáriamente Ferrari. É isso mesmo?

Brigadão![/quote]
Ai já entra conceito e interpretação de abstração. Tudo depende de sua abstração. Nâo vejo sentido em criar um carro sem marca. Ele já nasce com marca. Vc já pensou um uno sendo instanciado e depois disso eu setar a marca dele como Ferrari? Não faz sentido. O uno já nasce FIAT.

Beleza então, sempre inicio com “” para não ficar null mesmo.

Obrigado à todos pela ajuda.

Muito cuidado com essa coisa de sempre iniciar variaveis com “null”, e depois testar se é “null” ou não, etc etc…dependendo do caso vira um bom POG. RSrs

Entendi o que você quis dizer, mas no caso é um construtor padrão certo? Que não é específico a carro nenhum, é genérico. Supondo que estou cadastrando carros em um estacionamento, quando eu instanciar um novo objeto da classe carro para um novo cadastro, eu irei inserir Marca, Modelo, ano, cor… Mas antes disso o carro não existia por isso não havia marca, entendeu o que eu quis dizer? Se estiver errado me corrija, é que eu pense dessa maneira.

Se Marca e Modelo são dependencias de Carro, eles devem existir antes do Carro existir, e também não terem dependências com os próprios carros, senão acaba num problema de dependência circular.

vixi cara, ainda não estudei isso…

[quote=Rafael T.]Olá Pessoal.

Estou estudando o livro Java como Programa da Deitel (8º ed.). Faço os exercícios propostos e depois procuro na internet resoluções para comparar com as minhas. Sempre que é solicitado a criação de um construtor, eu crio um construtor padrão para inicializar os campos com valores default ( como 0 para um int ou “” para uma String), só que olhando as resoluções de outros, vejo que já fazem os construtores inicializando as variáveis recebendo os parâmetros que serão usados no main. a questão é…

Isso não é um construtor parametrizado e não um construtor padrão? qual devo usar quando é solicitado apenas com a palavra “construtor”?
[/quote]

Primeiro, nomenclatura. O construtor padrão (em inglês “default constructor”) é aquele que não escrevemos e o java coloca para nós.
O contrutor assim


public class NomeDaClasse{

 public NomeDaClasse(){};

}

chama-se construtor sem argumentos.
É boa prática nunca usar o construtor padrão ( default), ou seja, é de bom tom sempre declarar o construtor.

mas o construtor não serve para inicializar os atributos com os seus valores iniciais, isso é feito directamente no atributo ,assim:


public class NomeDaClasse{
 
  String nome = "O meu nome";
  int quantos = 3;

  public NomeDaClasse(){};

}

O construtor só é usado quando precisamos de um valor para o atributo, mas quem vai escolher o valor é quem construir o objeto


public class NomeDaClasse{
 
  String nome = "O meu nome";
  int quantos;

  public NomeDaClasse(int quantos ){
         this.quantos  = quantos;
   };

}

Repare que não inicializo o atributo com nenhum valor, porque isso seria redundate. O valor seria logo substituido pelo argumento passado no construtor.

Quando se diz “crie um construtor para a classe” sem nenhum adjetivo , significa “cria 1 construtor que coloque o objeto num estado consistente”.
Se precisar de argumentos para isso, use-os.

Quando alguem diz “crie um construtor padrão para a classe” vc deve ele mandar estudar java, porque esse construtor não é o programador que cria.
Quando alguem diz “crie um construtor sem argumentos para a classe” vc tem a instrução clara de que não pode pedir argumentos, então tem que deixar o objeto consistente mas sem os pedir.

Acho que todos devemos estudar Java certo ?? É para isso que estamos aqui.
Agora qto a construtor padrão, vou exemplificar o que eu quis dizer…

public Employee(){
        nome = "";
        sobrenome = "";
        salario = 0.0;
    }

inicializar os campos para que não sejam usados com “null”.

quanto ao salário, eu inicio com 0.0 pq quando começei com c++ fui instruido a inicializar assim, mas no Java pelo que entendi aqui isso é redundante…

agora o que estou tentando entender e não entendi ainda, é por que inicializar assim:

public Employee(String nome, String sobrenome, double salario){
        this.nome = nome;
        this. sobrenome = sobrenome;
        this.salario = salario;
    }

se qdo se instancia um objeto da classe,naturalmente esses dados já serão setados.

o que você diz “consistência” seria isso? ou simplesmente inicializar evitando nulls por exemplo?

obrigado.

[quote=Rafael T.]Acho que todos devemos estudar Java certo ?? É para isso que estamos aqui.
Agora qto a construtor padrão, vou exemplificar o que eu quis dizer…

public Employee(){
        nome = "";
        sobrenome = "";
        salario = 0.0;
    }

inicializar os campos para que não sejam usados com “null”.

quanto ao salário, eu inicio com 0.0 pq quando começei com c++ fui instruido a inicializar assim, mas no Java pelo que entendi aqui isso é redundante…

agora o que estou tentando entender e não entendi ainda, é por que inicializar assim:

public Employee(String nome, String sobrenome, double salario){
        this.nome = nome;
        this. sobrenome = sobrenome;
        this.salario = salario;
    }

se qdo se instancia um objeto da classe,naturalmente esses dados já serão setados.

o que você diz “consistência” seria isso? ou simplesmente inicializar evitando nulls por exemplo?

obrigado.
[/quote]

É diferente por que quando instanciar sua classe teremos que passar o valor dos atributos de Employee:

Employee emp1 = new Employee("Jose", "Silva", 30);

Quanto a inicialização todo objeto é inicializado como null e os tipos primitivos são inicializados com o seu tipo padrão. Isso porque um tipo primitivo não pode ser nulo.

Valores padrão:

* byte = 0;  
* short = 0;  
* int = 0;  
* long = 0;  
* float = 0.0;  
* double = 0.0;  
* boolean = false;  
* char = ` \ u0000 ';  
* Object (qualquer objeto) = null; 

**complementando
Com esta forma:

public Employee(String nome, String sobrenome, double salario){
        this.nome = nome;
        this. sobrenome = sobrenome;
        this.salario = salario;
    }

voce está dizendo que um Employee não pode existir sem nome, sobrenome e salário, como o pessoal disse ai… o que no mundo real é verdade.

Agora entendi a “consistência” dita, muito boa sua resposta. resolvido pra mim.

Obrigado à todos.

Sim. consistencia é controlar os dados passados. Por exemplo, nomes não podem ser nulo nem vazio (apenas espaços).
Salario nao pode ser 0 ou negativo. Este tipo de coisas deve gerar uma IllegalArgumentException.

e aew Rafael blz?
Então eu também tenho estudado Java com o livro do Deitel, só que estou usando a 6º edição. Talvez a questão de utilizar o construtor default ou parametrizado seja uma responsabilidade sua, dependendo da situação você opta pela melhor escolha.
Mas na 6º edição no capítulo 8: classes e objetos um exame mais profundo, na seção que fala sobre construtor sobrecarregado, ele mostra uma boa alternativa quando você possuir uma situação na qual não esteja seguro de qual construtor utilizar.
Na página 263 ele faz um estudo da classe TIME.
Lá existem 3 variáveis de instância hour, minutes, second, e ele declara 5 construtores, o primeiro não recebe parâmetro e através do ponteiro this chama o construtor parametrizado, que inicializa todos os atributos com 0 no objeto, os próximo contemplam a opção de se inicializar apenas o atributo hour, próximo hour, minute, próximo contrutor hour, minute e second… Claro que não precisa fazer todos esses, mas utilizar a idéia de um default declarado e um parametrizado te dá uma maior flexibilidade na hora de implementar seu código, pois você pode ou não estância um objeto mandando valores, ou simplesmente com os valores default.
=D abraço