Lendo uma String?


public static void main(String[] args) {

        int op;
        Veiculo v = null;
        Scanner scn = new Scanner(System.in);

        for (;;) {
                op = menu();
                
                if (op == 1) {
                	System.out.print("Informe a cilindrada: ");
            		v = new Moto(scn.nextInt()); // Não entendi essa parte, pq eu tenho q passar isso dentro do contrutor, 
                }      // e se eu fazer isso =  v = new Moto(), v.setMarca não funciona ???  
                else if (op == 2) {
            		System.out.print("Informe o nº de portas: ");
            		v = new Carro(scn.nextInt());
                }
                else if (op == 3) {
                    System.out.print("Informe o nº de eixos: ");
                    v = new Caminhao(scn.nextInt());
                }
                else break;

                System.out.print("Informe marca: ");
                v.setMarca(scn.next());
                
                System.out.print("Informe placa: ");
                v.setPlaca(scn.next());
                
                System.out.print("Informe cor: ");
                v.setCor(scn.nextInt());

                v.calculaPedagio();
                System.out.printf("R$ %.2f\n\n", v.getValor());
    	}
	}

}

nextInt, pede para vc ler um int… um inteiro, um numero…

cade o construtor?

[quote]
e se eu fazer isso = v = new Moto()[/quote]

é para um construtor vazio, padrao. inicializa um objeto novo, de moto, sem parametros
o setMarca é independente , só que o v está sendo usado para marca e moto…
mais ou menos isso aí… tem que ver o código todo … no mais…

ajudei? que deu?

Fica difícil ajudar sem a definição da classe Moto…
mas aqui vai o que sei a respeito dos métodos da classe Scanner:
nextInt() retorna o inteiro digitado pelo usuário.
nextFloat() retorna o float digitado
(…) e assim para todo tipo primitivo
next() retorna uma String com tudo o que foi digitado pelo usuário até ele apertar enter
Note que é necessário usar um try/catch pra garantir que o usuário realmente digitou um inteiro quando você usou um nextInt() e assim por diante.
No caso o seu código tá dizendo que um dos construtores da classe Moto tem como parâmetro a cilindrada da moto, que é do tipo inteiro.
E setMarca() não deixa de funcionar por causa disso.

CLASSE MOTO


public class Moto extends Veiculo {
	
	private int cilindrada;

	public Moto(int cilindrada) {
		this.cilindrada = cilindrada;
	}

	@Override
	public void calculaPedagio() {
		valor = 2.1F;
	}

}

CLASSE VEICULO


public abstract class Veiculo {
	
	protected String marca, placa;
	protected int cor;
	protected float valor;
	
	public void setMarca(String marca) {
		this.marca = marca;
	}
	public void setPlaca(String placa) {
		this.placa = placa;
	}
	public void setCor(int cor) {
		this.cor = cor;
	}
	public float getValor() {
		return valor;
	}
	public String getMarca() {
		return marca;
	}
	public String getPlaca() {
		return placa;
	}
	public int getCor() {
		return cor;
	}
	
	public abstract void calculaPedagio();
}

Esse programa está fazendo polimorfismo, e é abstract…
Quando eu tento instanciar a classe Veiculo, ele não deixa…

Ok, o construtor da classe moto só permite que você instancie passando uma cilindrada (que é um inteiro)
e no seu código está usando

v = new Moto(scn.nextInt()); 

que é um objeto da classe Scanner utilizando o método nextInt() que retorna o inteiro digitado pelo usuário.
Não tem a ver com string no caso, e não há motivos para o método setMarca() parar de funcionar.
setMarca() continua funcionando porque é um método que vem lá da classe Veiculo, e modifica um atributo protected
da própria.
Quanto à classe ser abstrata, a pessoa que criou o código decidiu que não faz sentido um objeto dessa classe
existir, mas sim apenas suas filhas (no caso Moto).

Let me know if that helped you
=]