Objeto[RESOLVIDO]

13 respostas
F

Fala galera. Queria pedir ajuda de vocês mais uma vez. Tenho experiencia zero em java e estou com uma dúvida que com certeza pra vocês é mt simples. Lá vai.(vou resumir)

tenho uma classe chamada “carro” com os seguntes atributos: ano, modelo e combustivel.

fiz esse método construtor:

public carro(int pAno, String pModelo, String pCombustivel){ ano = pAno; modelo = pModelo; combustivel = pCombustivel; }

e também tenho esse método: (Reparem que ele utiliza todos os atributos da classe)

public void eficienciaCarro(int ano, String mod, String comb){ //código do método }

Agora Quando vou instanciar a classe, preciso declarar seus atributos por conta do método construtor. certo? Por exemplo:

carro carro1 = new carro(2010, "gol", "gnv");

e quando vou chamar o método preciso declarar os atributos de novo? Exemplo:

carro1.eficienciaCarro(2010, "gol", "gnv");

Sei que isso não está certo. Queria pedir uma luz.

Desde já agradeço!!!

13 Respostas

jeffev

Esse seu segundo método não precisa receber tais parâmetros, pois a sua classe já possui os mesmo.
Dentro do método você pode acessar os atributos conforme abaixo:

this.ano// o que desejar fazer com o mesmo

Só será necessário passar algum atributo para o seu método caso ele seja diferente dos valores que a sua classe possui.
Segue um exemplo abaixo:

public boolean comparaAno (int a) { if (this.ano == a) return true; else return false; }

Monica_Ponciano

Usa referência [color=blue]this[/color]

public class Carro {

    //declara as variáveis ano, modelo, combustível

public carro(int pAno, String pModelo, String pCombustivel){
     this.ano = pAno;
     this.modelo = pModelo;
     this.combustivel = pCombustivel;
} 
public void eficienciaCarro(){
   //código do método
   //ex:ano = blablabla..
} 
}

da uma lida aqui: [url]http://www.tiexpert.net/programacao/java/this.php[/url]

F

Show de bola. Uma última dúvida. Se esse método for retornar algum valor, por exemplo:

public static float eficiencia(){

}

Se eu chamar este atributo do geito que você me explicou, ele dá erro. Dei uma lida sobre, mas não entendi mt bem. Pode, por favor, me dar um exemplo deste outro geito?

Obrigado

erico_kl

você não pode usar atributos da classe dentro de métodos estáticos, basicamente porque você não precisa instanciar a classe que contém o método estático para acessar ele, então como você acessaria um atributo dentro de um método estático se o atributo só existe na instância da mesma? (claro, se o atributo não for estático também)

para isso, tire o “static” do seu método, então você vai poder acessar os atributos normalmente, pois o método só será invocado a partir de uma instância de carro.

Monica_Ponciano

F?io Marques:
Show de bola. Uma última dúvida. Se esse método for retornar algum valor, por exemplo:

public static float eficiencia(){

}

Se eu chamar este atributo do geito que você me explicou, ele dá erro. Dei uma lida sobre, mas não entendi mt bem. Pode, por favor, me dar um exemplo deste outro geito?

Obrigado


dá erro porque o método que você tá criando é [color=darkblue]static[/color]…
dentro de métodos static somente é possível pode acessar outros métodos e variáveis que também sejam static

discorpio

Bom dia a todos.

Você pode também construir métodos que retorne o ano, modelo e o tipo de combustível do carro, e é para isso que servem os métodos getters (get), já os métodos setters (set), servem para atribuir os valores dos atributos, quando você faz o encapsulamento dos mesmos, ou seja, você encapsula os atributos com o modificador “private” e publica os métodos “getters” e “setters”, assim:

public class Carro {  
  
    // Declara as variáveis ano, modelo, combustível com o modificador private
    private int pAno;
    private String pModelo, PCombustivel;

    // Construtor recebendo parâmetros
    public Carro(int pAno, String pModelo, String pCombustivel) {  
         this.ano = pAno;  
         this.modelo = pModelo;  
         this.combustivel = pCombustivel;  
    }

    /* Construtor sobrecarregado sem parâmetros, 
        caso você necessite instanciar a classe sem parâmetros */
    public Carro() { }

    // Método getters que apanha os valores dos atributos
    public int getPAno() {
         return pAno;
    }

    public String getPModelo() {
         return pModelo;
    }

    public String getPCombustivel() {
         return pCombustivel;
    }

    // Métodos setters para atribuir valores aos atributos encapsulados
    public void setPAno(int pAno) {
        this.pAno = pAno;
    }
  
    public void setPModelo(String pModelo) {
        this.pModelo = pModelo;
    }

    public void setPCombustivel(String pCombustivel) {
        this.pCombustivel = pCombustivel;
    }

    /* O método eficienciaCarro tem que ser um método
        que retorne algum valor, algum nível, eis uma susgestão. */
    public int eficienciaCarro() {
        int nivel = 0;
        // fazendo cálculos usando a recursividade dos métodos getters
        switch (getPAno()) {
            case 1995: nivel = 1; break;
            case 2000: nivel = 5; break;
            ......
        }     
        if (getPCombustivel().equals("gasolina")) {
           nivel += 20;  //
        }
        // blablablabla

        return nivel;  
    }
}

Presumo que você já deva conhecer a técnica do encapsulamento, contudo estou reprisando este conceito para que você entenda a sua real necessidade na maioria dos casos, por exemplo, haverá partes da sua aplicação em que você terá que instanciar a classe carro sem a passagem dos parâmetros, como você construiu a classe com apenas um construtor, isto engessa e te obriga sempre a instanciar a classe com a passagem dos parâmetros, uma vez que, ao definir um construtor com a passagem de parâmetros, este construtor definido passa ser o único, e por isso eu implementei um outro construtor sobrecarregado vazio, para quando houver a necessidade de você instanciar a classe sem os parâmetros, você possa fazê-lo sem erros.

Mas como vou atribuir os valores aos atributos da classe se não passo os parâmetros ? É ai que entra os métodos “setters”, já os “getters” sevem para apanhar os valores armazenados nos atributos.

Eu tenho mesmo que usar o encapsulamento dos atributos ? Ou posso torná-los diretamente públicos e acessá-los diretamente na instância, como no exemplo abaixo ?

public class Carro {
        public String pModelo;
        .....
        .....
    }
    
    ....
    ....
    Carro car = new Carro()
    car.pModelo = "Marea";

Você pode fazer isto, porém você não está protegendo os dados dos seus atributos, suponhamos que você quer criar uma regra de validação de dados, você pode fazer isto dentro dos métodos “setters”, como no exemplo acima, suponhamos que você trabalhe numa concessionária Wolkswagen, obviamente o atributo pModelo não pode receber carros da Fiat como o Marea, logo você pode criar validações dentro dos métodos setters, onde você encapsulando (escondendo) os atributos da classe, você pode protegê-los, criando regras de validação dentro dos setters, sem que haja acesso direto a atributo, entendeu.

Espero ter ajudado.

F

Muito Obrigado. Clareou tudo.

Valeu nesmo galera!!!

discorpio

Só mais uma clareada.

F?io Marques:
Show de bola. Uma última dúvida. Se esse método for retornar algum valor, por exemplo:

public static float eficiencia(){

}

Se eu chamar este atributo do geito que você me explicou, ele dá erro. Dei uma lida sobre, mas não entendi mt bem. Pode, por favor, me dar um exemplo deste outro geito?

Obrigado

Métodos e atributos estáticos não são de escopo de instância e sim são de escopo de classe, ou seja você não precisa instanciar a classe Carro para acessar métodos e atributos estáticos, fazendo tão somente referência a eles com o nome da classe, exemplo:

public class Carro {
    ....
    ....
    ....
    public static float eficiencia() {
          float ef = 0.0
          ....
          ....
          return ef;
    }
}

.....
float efic = Carro.eficiencia();
....

É por isso que dentro de métodos estáticos, você só enxerga atributos estáticos.

Métodos e atributos estáticos são mais usados em constantes ou quando você precise definir valores em que devam ser acessados na maioria das classes, evitando assim que você crie várias instâncias de uma mesma classe e com valores diferentes para cada instância. Contudo, devo alertá-lo no sentido de que criar métodos e atributos estáticos, isto pois quando a sua aplicação inicia, todos eles são alocados em memória, não importando em que classe esteja, pois isto pode provocar uma queda de rendimento de performance por conta de uso de muita memória.

F

Maravilha. Muito obrigado pela ajuda!!!

Monica_Ponciano

viu, coloca sua pergunta como resolvida :wink:

F

Como faço pra fechar?

Monica_Ponciano

edita o 1º post, poe [RESOLVIDO]

F

F?io Marques:
Fala galera. Queria pedir ajuda de vocês mais uma vez. Tenho experiencia zero em java e estou com uma dúvida que com certeza pra vocês é mt simples. Lá vai.(vou resumir)

tenho uma classe chamada “carro” com os seguntes atributos: ano, modelo e combustivel.

fiz esse método construtor:

public carro(int pAno, String pModelo, String pCombustivel){ ano = pAno; modelo = pModelo; combustivel = pCombustivel; }

e também tenho esse método: (Reparem que ele utiliza todos os atributos da classe)

public void eficienciaCarro(int ano, String mod, String comb){ //código do método }

Agora Quando vou instanciar a classe, preciso declarar seus atributos por conta do método construtor. certo? Por exemplo:

carro carro1 = new carro(2010, "gol", "gnv");

e quando vou chamar o método preciso declarar os atributos de novo? Exemplo:

carro1.eficienciaCarro(2010, "gol", "gnv");

Sei que isso não está certo. Queria pedir uma luz.

Desde já agradeço!!!

Criado 15 de agosto de 2012
Ultima resposta 16 de ago. de 2012
Respostas 13
Participantes 5