Classe MAIN nao compila

Ola Pessoal!

Eu sou iniciante em java e estou tendo um problema pra compilar minha classe main.

Eu primeiramente fiz uma classe publica chamada Carro, que contem os metodos set e get, depois elaborei uma classe main chamada Carro2 que iria chamar a classe feita anteriormente. Porém, a minha classe main aponta alguns erros logo no inicio, quando “chamo” a classe aterior, mas nao consigo identificar esses 3 erros que o depurador me aponta.

Carro.java

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

   public void setano(int a)
   {
    ano = a;
   }
   public int getano()
   {
    return ano;
   }
   public void setvalor(double v)
   {
    valor = v;
   }
   public double getvalor()
   {
    return valor;
   }
   public void setmodelo(String m)
   {
    modelo = m;
   }
   public String getmodelo()
   {
    return modelo;
   }
    public Carro(int a,double v,String m)
   {
    ano = a;
    valor = v;
    modelo = m;
   }
 }

Carro2.java

public class Carro2
{
 public static void main(String args[])
 {
  Carro mAno = new Carro("2009");
  Carro mValor = new Carro("1.700");
  Carro mModelo = new Carro("Celta");

  System.out.printf("Modelo do Carro:%s", mModelo.getmodelo());
  System.out.println("");
  System.out.printf("Ano do carro:%s", mAno.getano());
  System.out.println("");
  System.out.printf("Valor do carro:%s", mValor.getvalor());
  System.out.println("");
 }
}

Os erros apontados pelo depurador sao referentes a essa ultima classe, naquelas linhas que contem mAno,mValor e mModelo. Nao consigo compilar a classe main e nem identificar esses erros.

Me ajudem por favor.

Grato desde já!

[quote=Rumblefish]Ola Pessoal!

Eu sou iniciante em java e estou tendo um problema pra compilar minha classe main.

Eu primeiramente fiz uma classe publica chamada Carro, que contem os metodos set e get, depois elaborei uma classe main chamada Carro2 que iria chamar a classe feita anteriormente. Porém, a minha classe main aponta alguns erros logo no inicio, quando “chamo” a classe aterior, mas nao consigo identificar esses 3 erros que o depurador me aponta.

Carro.java

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

   public void setano(int a)
   {
    ano = a;
   }
   public int getano()
   {
    return ano;
   }
   public void setvalor(double v)
   {
    valor = v;
   }
   public double getvalor()
   {
    return valor;
   }
   public void setmodelo(String m)
   {
    modelo = m;
   }
   public String getmodelo()
   {
    return modelo;
   }
    public Carro(int a,double v,String m)
   {
    ano = a;
    valor = v;
    modelo = m;
   }
 }

Carro2.java

public class Carro2
{
 public static void main(String args[])
 {
  Carro mAno = new Carro("2009");
  Carro mValor = new Carro("1.700");
  Carro mModelo = new Carro("Celta");

  System.out.printf("Modelo do Carro:%s", mModelo.getmodelo());
  System.out.println("");
  System.out.printf("Ano do carro:%s", mAno.getano());
  System.out.println("");
  System.out.printf("Valor do carro:%s", mValor.getvalor());
  System.out.println("");
 }
}

Os erros apontados pelo depurador sao referentes a essa ultima classe, naquelas linhas que contem mAno,mValor e mModelo. Nao consigo compilar a classe main e nem identificar esses erros.

Me ajudem por favor.

Grato desde já![/quote]

Rumblefish,

o problema está no momento da instaciação da classe Carro:

Carro mAno = new Carro(“2009”);
Carro mValor = new Carro(“1.700”);
Carro mModelo = new Carro(“Celta”);

Quando você instância a classe Carro, o construtor dela é chamado. E como se pode ver no código-fonte, o construtor tem de receber 3 valores (ano, valor, modelo) no momento de instaciar a classe Carro. E como é visto na classe Carro2, você só está passando 1 valor (parâmetro) na chamada do construtor.

Tente com este trecho:
Carro carro1 = new Carro(2009, 1.700, “Celta”);

Ao invés de:

Carro mAno = new Carro(“2009”);
Carro mValor = new Carro(“1.700”);
Carro mModelo = new Carro(“Celta”);

Abraços!

Rumblefish,

Seria correto desta forma no momento da instanciação da classe carro:

Carro c1 = new Carro();

ao invés de :

Carro mAno = newCarro("2009");

Na parte em que descrevi abaixo, fica mais fácil para você setar os objetos :

[code]Carro c1 = new Carro();

c1.setAno(“2009”);
c1.setValor(1.700);
c1.setModelo(“celta”);
c1.setFabricante(“Toyota”);
c1.setVelocidadeMaxima(“30”);
[/code]

Isso mesmo…

Construtor sem parametros
e Utilize os Setter e Getter do objeto
para acessar os atributos…

Você criou 3 objetos carro.

Ou cria faz assim:

Carro carro = new Carro();

E depois altera atributo por atributo.

Ou cria ele de uma vez mandando o 3 parâmetros:

Carro carro = new Carro(a, b, c);

Javax2011,

Aprendi assim, cada um pensa de um jeito de programar, fiz desta forma…

package Teste;

import java.util.ArrayList;
import java.util.List;

public class TesteCarro {

	public static void main(String[] args) {

		List<Carro> listaCarro = new ArrayList<Carro>();

		// Declaração
		Carro carro1 = new Carro();
		Carro carro2 = new Carro();
		Carro carro3 = new Carro();
		Carro carro4 = new Carro();
		Carro carro5 = new Carro();
		Carro carro6 = new Carro();
		Carro carro7 = new Carro();

		// População
		carro1.setAno("2011");
		carro1.setFabricante("toyota");
		carro1.setValor(20.000);
		carro1.setModelo("civic");
		carro1.setVelocidadeMaxima("80");

		carro2.setAno("2011");
		carro2.setFabricante("Wolkswagen");
		carro2.setValor(20.000);
		carro2.setModelo("fusquinha");
		carro2.setVelocidadeMaxima("80");

		carro3.setAno("2011");
		carro3.setFabricante("Mitsubshi");
		carro3.setValor(20.000);
		carro3.setModelo("pajero");
		carro3.setVelocidadeMaxima("80");

		carro4.setAno("2011");
		carro4.setFabricante("hyundai");
		carro4.setValor(20.000);
		carro4.setModelo("hyundai");
		carro4.setVelocidadeMaxima("80");

		carro5.setAno("2011");
		carro5.setFabricante("Ford");
		carro5.setValor(20.000);
		carro5.setModelo("palio");
		carro5.setVelocidadeMaxima("80");

		carro6.setAno("2011");
		carro6.setFabricante("ferrari");
		carro6.setValor(20.000);
		carro6.setModelo("ferrari");
		carro6.setVelocidadeMaxima("80");

		carro7.setAno("2011");
		carro7.setFabricante("ford");
		carro7.setValor(20.000);
		carro7.setModelo("fiesta");
		carro7.setVelocidadeMaxima("80");

		// Adição na lista - Você poderia adicionar logo depois de criar também,
		// daí não esquece de adicionar nada ;)
		listaCarro.add(carro1);
		listaCarro.add(carro2);
		listaCarro.add(carro3);
		listaCarro.add(carro4);
		listaCarro.add(carro5);
		listaCarro.add(carro6);
		listaCarro.add(carro7);

		// Apresentação
		System.out.println("Ano: " + listaCarro.get(0).getAno());
		System.out.println("Fabricante: " + listaCarro.get(0).getFabricante());
		System.out.println("Modelo: " + listaCarro.get(0).getModelo());
		System.out.println("Valor: " + listaCarro.get(0).getValor());
		System.out.println("Velocidade Máxima: "
				+ listaCarro.get(0).getVelocidadeMaxima());
		System.out.println("---------------------------------------------------------------------");

		System.out.println("Ano: " + listaCarro.get(1).getAno());
		System.out.println("Fabricante: " + listaCarro.get(1).getFabricante());
		System.out.println("Modelo: " + listaCarro.get(1).getModelo());
		System.out.println("Valor: " + listaCarro.get(1).getValor());
		System.out.println("Velocidade Máxima: "
				+ listaCarro.get(1).getVelocidadeMaxima());
		System.out.println("---------------------------------------------------------------------");

		System.out.println("Ano: " + listaCarro.get(2).getAno());
		System.out.println("Fabricante: " + listaCarro.get(2).getFabricante());
		System.out.println("Modelo: " + listaCarro.get(2).getModelo());
		System.out.println("Valor: " + listaCarro.get(2).getValor());
		System.out.println("Velocidade Máxima: "
				+ listaCarro.get(2).getVelocidadeMaxima());
		System.out.println("---------------------------------------------------------------------");

		System.out.println("Ano: " + listaCarro.get(3).getAno());
		System.out.println("Fabricante: " + listaCarro.get(3).getFabricante());
		System.out.println("Modelo: " + listaCarro.get(3).getModelo());
		System.out.println("Valor: " + listaCarro.get(3).getValor());
		System.out.println("Velocidade Máxima: "
				+ listaCarro.get(3).getVelocidadeMaxima());
		System.out.println("---------------------------------------------------------------------");

		System.out.println("Ano: " + listaCarro.get(4).getAno());
		System.out.println("Fabricante: " + listaCarro.get(4).getFabricante());
		System.out.println("Modelo: " + listaCarro.get(4).getModelo());
		System.out.println("Valor: " + listaCarro.get(4).getValor());
		System.out.println("Velocidade Máxima: "
				+ listaCarro.get(4).getVelocidadeMaxima());
		System.out.println("---------------------------------------------------------------------");

		System.out.println("Ano: " + listaCarro.get(5).getAno());
		System.out.println("Fabricante: " + listaCarro.get(5).getFabricante());
		System.out.println("Modelo: " + listaCarro.get(5).getModelo());
		System.out.println("Valor: " + listaCarro.get(5).getValor());
		System.out.println("Velocidade Máxima: "
				+ listaCarro.get(5).getVelocidadeMaxima());
		System.out.println("---------------------------------------------------------------------");

		System.out.println("Ano: " + listaCarro.get(6).getAno());
		System.out.println("Fabricante: " + listaCarro.get(6).getFabricante());
		System.out.println("Modelo: " + listaCarro.get(6).getModelo());
		System.out.println("Valor: " + listaCarro.get(6).getValor());
		System.out.println("Velocidade Máxima: "
				+ listaCarro.get(6).getVelocidadeMaxima());
		System.out.println("---------------------------------------------------------------------");

		// Remova aqui
		listaCarro.remove(3);
		listaCarro.remove(5);

	}

}

E por que o mValor foi setado como String?

Pois é…

estava setado para double…

Aqui você cria três objetos carro e só passa UM argumento para o construtor, sendo que o construtor pede TRÊS argumentos la na lista de parametros. Se você quer criar um objeto da classe carro, faça assim.

Carro meuCarro = new Carro( 2009, 1.700, "Celta" );

Outro erro seu foi ter passado os valores int e double como string. Voce os colocou entre aspas.
Se voce quisesse ter inicializado o construtor com somente um argumento voce deveria ter criado outro construtor na classe carro para tratar a entrade de um e/ou 2 argumentos e deixar os dados consistente.

Espero que eu tenha lhe ajudado. Abraços

é, digamos assim, elegante, deixar o construtor vazio e usar setters pra inicializar??

Apenas se os campos não forem obrigatórios.
Um construtor com campos é uma ótima forma de forçar o usuário da classe a fornecer os valores obrigatórios.

Apenas se os campos não forem obrigatórios.
Um construtor com campos é uma ótima forma de forçar o usuário da classe a fornecer os valores obrigatórios. [/quote]

Usaria construtor sem argumentos ou com argumentos, depende, mas normalmente usaria alguns argumentos, só para teste…

Tipo as vezes com overload de construtor, porém cada caso é um caso. Acho que sem parametro é melhor, acho que fica mais flexivel, não ? Posso estar enganada.

Eu acho que seria bom no princípio que diz que o código tem que ser aberto para as extensões e alguns fechados para modificação, tenho estudado princípios que rodeiam OO.

[]s

Não se tem uma regra que diz que o construtor deve ou não ter parametros. A regra é a SUA NECESSIDADE.
Como já foi dito acima se eu tiver algo que é obrigatorio para o meu objeto, vou utilizar um construtor com parametros.

De outra forma nada me impede de ja passar os parametros necessarios para o meu objeto pelo construtor, mesmo eles não sendo obrigatorios.

Editando:: O assunto ja foi pra um rumo totalmente diferente do topico…