ArrayList dentro de um contrutor

public Motor(int potencia, Eixo eixo, BombaCombustivel bomba,Pistao pistao){ this.potencia=potencia; this.eixo=eixo; this.bomba=bomba; for(int i=0 ; i<(int)(4 + Math.random() * 3);i++){ Pistao pista = new Pistao(); pistao.setDiametro((int)(4 + Math.random() * 4)); pistao.setTempoVida((int)(4 + Math.random() * 8)); pist.add(pistao); } }

Pessoal que inserir de 4 a 6 pistoes no motor e depois imprimir quantos pistoes ele tem, mas no caso ele mostra 0 , alguem sabe qual o problema disso?

fjucks,

em primeiro lugar, repare que você está passando uma variável pistao para o método add e essa variável está vindo na assinatura do construtor. Você está inserindo várias vezes o mesmo objeto. Acredito que você queira, na verdade, dar um add da variável local pista.

Outro ponto é que não está mostrado no trecho de código que você colocou, como a variável pist é instanciada e nem como você está verificando quantos elementos existem dentro dela. Coloca o resto do código pra gente verificar.

E, por último, não é uma boa prática construir o for do jeito que você fez. Perceba que a condição de parada muda a cada instante e isso não é bom por diversos motivos (desde legibilidade, performance do otimizador, características determinísticas e outras).
O melhor é você instanciar uma variável antes do for com um valor de parada e depois comparar lá dentro. Algo como

int j = (int)(4 + Math.random() * 3);
for (int i=0; i<j; i++) {etc}

Mas, uma sugestão melhor em termos de design e testabilidade de código é: ao invés de fazer como eu coloquei acima, receber no construtor a quantidade de pistões que você quer criar e deixar para quem chama o construtor a responsabilidade de decidir quantos ele quer. Dessa forma, você pode até colocar os seus valores aleatórios como você quer, como também colocar um valor fixo pra testar se está funcionando corretamente.

[code]import java.util.ArrayList;

public class Motor {
ArrayList pist = new ArrayList();
int potencia=(int)(4 + Math.random() * 12);
Eixo eixo = new Eixo();
BombaCombustivel bomba = new BombaCombustivel();
int qtd_pistao = (int)(4 + Math.random() * 3);

public Motor(){}

public Motor(int potencia, Eixo eixo, BombaCombustivel bomba,Pistao pistao){
    this.potencia=potencia;
    this.eixo=eixo;
    this.bomba=bomba;
    
    
    for(int i=0 ; i<qtd_pistao;i++){
        new Pistao();
        pistao.setDiametro((int)(4 + Math.random() * 4));
        pistao.setTempoVida((int)(4 + Math.random() * 8));
        pist.add(pistao);
    }
}

}[/code]

Arrumei alguns pontos que vc falou, na parte que vc diz que insiro o mesmo objeto, instanciei um novo motor em cima dai ele cria outro certo?

O for ficou melhor.

Quanto ao motor, o problema não é com o motor e sim com o pistão. Você tá inserindo o mesmo pistão.

No lugar que você faz new Pistao(), você tem que atribuir para uma variável e, então, colocar essa variável na sua lista.

Algo como
for(int i=0 ; i<qtd_pistao;i++){
Pistao pistao = new Pistao();
// etc
pist.add(pistao);
}

Com essa modificações, a variável pistão que você tá passando no construtor, não serve pra nada.

E você também não postou a parte do código que você vê quantos pistões existem, ou seja, como você sabe que tá sempre com zero?

[code]public class Pistao {
private int diametro;
public int tempoVida;

public Pistao(){}

public Pistao(int qtd){}

public Pistao(int diametro,int tempoVida){
    this.diametro=diametro;
    this.tempoVida=tempoVida;
}

public int getDiametro() {
    return diametro;
}

public void setDiametro(int diametro) {
    this.diametro = diametro;
}

public int getTempoVida() {
    return tempoVida;
}

public void setTempoVida(int tempoVida) {
    this.tempoVida = tempoVida;
}[/code]
System.out.println("Quantidade de Pistão..: " + car.getQtdPistao() );

e de onde veio esse car?
E como é a classe dele?

[/code][code]public class Carro extends Veiculo{
Motor motor = new Motor();
protected int quilometragem = (int) (1 +Math.random() * 2000);
public Proprietario p = new Proprietario();

public String getCor(){
return pintura.cor;
}
//Metalico
public boolean isMetalico(){
return pintura.isMetalico();
}
//potencia
public int getPotencia(){
return motor.potencia;
}
//Quantidade de pistoes
public int getQtdPistao(){
return motor.qtd_pistao;
}
//pistao
public Pistao getPistao(int id){
return motor.pist.get(id);
}
//quilometragem
public int getQuilometragem() {
return quilometragem;
}
//Nome do proprietario
public String getNomeProprietario(){
return p.getNome();
}
@Override
public int getAno(){
return super.getAno();

}

o motor do seu carro está sendo instanciado com o construtor default. Esse construtor default nao é aquele que tem o for. Esse construtor default nao faz nada. Por isso fica sempre 0