Como chamar metodo (Sou iniciante)

Saudações galera,

Venho aqui solicitar a ajuda de vcs para um exercicio. O problema é que estou com dificuldade.

Para facilitar irei colocar o enunciado e o codifo que eu já fiz.

Implemente as seguintes classes:

a) Implemente uma classe Equipamento com o atributo ligado (tipo boolean) e com os métodos liga e desliga. O método liga torna o atributo ligado true e o método desliga torna o atributo ligado false.

b) Implemente uma classe EquipamentoSonoro que herda as características de Equipamento e que possui os atributos volume (tipo short) que varia de 0 a 10 e stereo (tipo boolean). A classe ainda deve possuir métodos para ler e alterar o volume (getter e setter), além dos métodos mono e stereo. O método mono torna o atributo stereo falso e o método stereo torna o atributo stereo verdadeiro. Ao ligar o EquipamentoSonoro através do método liga, seu volume é automaticamente ajustado para 5.

[code]package Exercicio;

public class Equipamento {

//Atributo
private boolean ligado;

//Metodo liga
public boolean liga(){
	return ligado == true;
	
}


//Metodo desliga
public boolean desliga(){
	return ligado == false;
	
	
}

}[/code]

[code]package Exercicio;

public class EquipamentoSonoro extends Equipamento{

//Atributos
private short volume;
private boolean stereo;

//Métodos para ler e alterar o volume (getter e setter)
public short getVolume() {
	return volume;
}

public void setVolume(short volume) {
	this.volume = volume;
}
	

//Metodo mono
public boolean mono(boolean falso){
	return stereo == falso;//O método mono torna o atributo stereo falso		
	
}
//Metodo stereo
public boolean stereo(){
	return stereo == true;//O método stereo torna o atributo stereo verdadeiro
	
	
}
	
//Metodo principal
public static void main(String[] args) {
	// TODO Auto-generated method stub


/*ligar o EquipamentoSonoro através do método liga, seu volume é automaticamente 
ajustado para 5.
*/
	
	//Objeto para chamar o metodo liga da classe equipamento.
	Equipamento l = new Equipamento();
	
	//chamar o metodo liga da classe Equipamento
	
	Equipamento.liga();
	

if(liga() == true){
	
	System.out.println("Ligado");
	
	//Instanciando um objeto, criando o objeto "volume"	
	EquipamentoSonoro v = new EquipamentoSonoro();
	
	//Ajuste do volume
	v.setVolume((short) 5);
	
	//imprime volume do equipamento sonoro 
    System.out.println("Volume "+v.getVolume());
	
	
	
}


	
}

}[/code]

Eu não estou conseguindo chamar o metodo liga da classe Equipamento.
Procurei até no google … o que entendi é que eu deveria criar um objeto e em seguida criar um metodo com a seguinte teoria: NomeDaClasseQueQuerChamar.Metodo();

Na linha 45 e 48 da classe EquipamentoSonoro está com o sinal de erro no canto. Não sei porque …

Na linha 48 estou com a ideia de que ao chamar o metodo liga() e a variavel estiver como true, ele apresenta a mensagem na console “ligado” e define o valor do volume.

Bom galera, espero não estar pedido muito … mas se puderem verificar as duas classes de acordo com o enunciado do exercicio e me indicar os erros, o que eu devo fazer e porque eu ficaria agradecido.

É muita duvida né!!! É que sou iniciante e se alguem puder me explicar o que estou fazendo de errado vai me ajudar muito.

Ahhh … se estiver tudo errado me avisem tambem vlw rsrs.

[code]//Objeto para chamar o metodo liga da classe equipamento.
Equipamento l = new Equipamento();

//chamar o metodo liga da classe Equipamento
l.liga();[/code]

Equipamento l = new Equipamento();

tem q fazer assim l.ligar(); não Equipamento.ligar(); se ligar() fosse um metodo static, vc consegueria fazer Equipamento.ligar();

outra coisa.

seu metodo

public boolean ligar(){
   return ligado == true;
}

ele vai retornar true, somente se ligado for igual true. Vc não está atribuindo um valor a variavel ligado, vc está comparando.

ligado == true;

acho que poderia ser assim ligado = true

primeiro, vamos corrigir Equipamento, ok? Troquei o == (teste de igualdade) por = (operador de atribuição)

[code]package Exercicio;

public class Equipamento {

//Atributo  
private boolean ligado;  
  
//Metodo liga  
public boolean liga(){  
    return ligado = true;  
      
}  
  
  
//Metodo desliga  
public boolean desliga(){  
    return ligado = false;  
      
      
}  

} [/code]

Agora vamos corrigir algumas coisas na classe EquipamentoSonoro, ok?

1 - Usei sobrescrita do método liga para ajustar o volume para 5, conforme especificado.
2 - Simplifiquei o método main para o que realmente era necessário para executar o seu teste.

[code]
package Exercicio;

public class EquipamentoSonoro extends Equipamento{

//Atributos  
private short volume;  
private boolean stereo;  
  
//Métodos para ler e alterar o volume (getter e setter)  
public short getVolume() {  
    return volume;  
}  

public void setVolume(short volume) {  
    this.volume = volume;  
}  
      
  
//Metodo mono  
public void mono(boolean falso){  
    stereo = falso;//O método mono torna o atributo stereo falso          
      
}  
//Metodo stereo  
public voidstereo(){  
    stereo = true;//O método stereo torna o atributo stereo verdadeiro  
      
      
}  
      
//Metodo liga    
public boolean liga(){    
    setVolume(5);
    super.liga();    
        
}  


//Metodo principal  
public static void main(String[] args) {  
    /*ligar o EquipamentoSonoro através do método liga, seu volume é automaticamente  
        ajustado para 5. */  
      
    //Instanciando um objeto, criando o objeto "volume"   
    EquipamentoSonoro v = new EquipamentoSonoro();  
      
    v.liga(); 
      
    //imprime volume do equipamento sonoro   
    System.out.println("Volume "+v.getVolume());  
}  

} [/code]

Então galera,

Nem sei como agradecer a atenção de vcs … vlw mesmo.

Vou tentar explicar o que eu entendi …

[quote=billcaio]Equipamento l = new Equipamento();

tem q fazer assim l.ligar(); não Equipamento.ligar(); se ligar() fosse um metodo static, vc consegueria fazer Equipamento.ligar();

outra coisa.

seu metodo

public boolean ligar(){
   return ligado == true;
}

ele vai retornar true, somente se ligado for igual true. Vc não está atribuindo um valor a variavel ligado, vc está comparando.

ligado == true;

acho que poderia ser assim ligado = true
[/quote]

Como o metodo ligar não é static, devo criar um objeto na classe main para poder chamar o metodo de uma outra classe certo? Porem se o metodo ligar for static tambem posso criar um objeto e chama-lo que tambem da certo é isso mesmo? se sim … é viavel? Acho que não, pois já que não teria a necessidade de criar um objeto só para chamar um metodo … para que cria-ló né?

É verdade … eu estava comparando. Acredito que tenha sido falta de atenção, foi mals …
Mais vlw … acabei de corrigir aqui.

============================================

[quote=robertol]primeiro, vamos corrigir Equipamento, ok? Troquei o == (teste de igualdade) por = (operador de atribuição)

[code]package Exercicio;

public class Equipamento {

//Atributo  
private boolean ligado;  
  
//Metodo liga  
public boolean liga(){  
    return ligado = true;  
      
}  
  
  
//Metodo desliga  
public boolean desliga(){  
    return ligado = false;  
      
      
}  

} [/code]

Agora vamos corrigir algumas coisas na classe EquipamentoSonoro, ok?

1 - Usei sobrescrita do método liga para ajustar o volume para 5, conforme especificado.
2 - Simplifiquei o método main para o que realmente era necessário para executar o seu teste.

package Exercicio;  
  
public class EquipamentoSonoro extends Equipamento{  
  
    //Atributos  
    private short volume;  
    private boolean stereo;  
      
    //Métodos para ler e alterar o volume (getter e setter)  
    public short getVolume() {  
        return volume;  
    }  
  
    public void setVolume(short volume) {  
        this.volume = volume;  
    }  
          
      
    //Metodo mono  
    public void mono(boolean falso){  
        stereo = falso;//O método mono torna o atributo stereo falso          
          
    }  
    //Metodo stereo  
    public voidstereo(){  
        stereo = true;//O método stereo torna o atributo stereo verdadeiro  
          
          
    }  
          
    //Metodo liga    
    public boolean liga(){    
        setVolume(5);
        super.liga();    
            
    }  


    //Metodo principal  
    public static void main(String[] args) {  
        /*ligar o EquipamentoSonoro através do método liga, seu volume é automaticamente  
            ajustado para 5. */  
          
        //Instanciando um objeto, criando o objeto "volume"   
        EquipamentoSonoro v = new EquipamentoSonoro();  
          
        v.liga(); 
          
        //imprime volume do equipamento sonoro   
        System.out.println("Volume "+v.getVolume());  
    }  
}  [/code][/quote]


O que eu não entendi no que o robertol disse é ...
[code] //Metodo liga    
    public boolean liga(){    
        setVolume(5);
        super.liga();    [/code]
Porque este metodo, sendo que na classe equipamento já possui o metodo?
Estou perguntando isso pelo seguinte: 

Quando foi chamado o metodo
[code] v.liga(); [/code]
Ao chama-lo, poderia ser atribuido o valor na variavel (atributo) ... dentro do metodo apos chama-lo no main ... ou não é possivel??? É que eu não sei mesmo ... desculpe a ignorancia.

Para ficar mais facil de vcs entenderem a minha duvida ... vou colocar aqui as alterações que eu fiz apos a dica de vcs.


1º Tive que alterar o atributo para protected static. O porque eu nem sei ... no eclipse ele foi dando sugestões e as utilizei até chegar em alguma coisa ... chegou nisso ai rsrsr Se puderem me explicar o porque ... vai me ajudar a entender o que estou fazendo tambem.
2º Os dois metodos tiveram que ser static ... mesmo criando um objeto e chamando o metodo, o sinal de erro no eclipse só saiu depois que mudei os metodos para static ... tambem não sei porque. 
3º Alem do o == (teste de igualdade) por = (operador de atribuição).


[code]package Exercicio;

public class Equipamento {
	
	//Atributo
	protected static boolean ligado;
	
	//Metodo liga
	public static boolean liga(){
		return ligado = true;
		
	}
	
	
	//Metodo desliga
	public static boolean desliga(){
		return ligado = false;
		
		
	}
	
	
}[/code]


Agora a classe EquipamentoSonoro

1º Na linha 45 do codigo abaixo, foi chamado o metodo de acordo com o que eu entendi com as explicações de vcs.
2º Fiz uma condição desta vez usando "==", desta vez prestei atenção nisso srsrs. Se a o metodo for verdadeiro ele imprime "Ligado"+atributo(verdadeiro neste caso). Em seguida ele cria o objeto volume dando o valor 5 e imprimindo este valor ... ou seja ele só vai criar o objeto volume e dar valor se o atributo ligado for verdadeiro.

[code]package Exercicio;

public class EquipamentoSonoro extends Equipamento{

	//Atributos
	private short volume;
	private boolean stereo;
	
	//Métodos para ler e alterar o volume (getter e setter)
	public short getVolume() {
		return volume;
	}

	public void setVolume(short volume) {
		this.volume = volume;
	}
		
	
	//Metodo mono
	public boolean mono(boolean falso){
		return stereo == falso;//O método mono torna o atributo stereo falso		
		
	}
	//Metodo stereo
	public boolean stereo(){
		return stereo == true;//O método stereo torna o atributo stereo verdadeiro
		
		
	}
		
	//Metodo principal
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	
	/*ligar o EquipamentoSonoro através do método liga, seu volume é automaticamente 
	ajustado para 5.
	*/
		
		//Objeto para chamar o metodo liga da classe equipamento.
		Equipamento l = new Equipamento();
		
		
		//chamar o metodo liga da classe Equipamento
		l.liga();{
		
		if(liga() == true){
		
		System.out.println("Ligado "+ligado);
		
		//Instanciando um objeto, criando o objeto "volume"	
		EquipamentoSonoro v = new EquipamentoSonoro();
		
		//Ajuste do volume
		v.setVolume((short) 5);
		
		//imprime volume do equipamento sonoro 
	    System.out.println("Volume "+v.getVolume());
	    
		}
		
		else{
			System.out.println("Equipamento Desligado");
			
		}
	}
	
	
		
	}}	
	

Quantas duvidas né !!!

O codigo que eu fiz desta vez será que esta certo? Sera que estou usando uma maneira simples?
Caso não tenham entendido as minhas duvidas é só falar que eu tento explicar de outras maneiras.

E mais uma vez obrigado pela ajuda de vcs e pela simplicidade nas explicações … pois isso me ajuda muito a entender. Vlw mesmo

Bom, vamos por parte!

Eu coloquei o método em EquipamentoSonoro porque você disse que queria que quando um EquipamentoSonoro fosse ligado, o volume fosse alterado para 5. Então deste modo, usando sobrecarga, você não precisa se preocupar em implementar esta regra de outro modo, em outro método, como você fez no método main.

Não é correto criar os métodos como static para classes de entidades. Retorne os métodos para métodos de instâncias. Se você quer acessar o valor do atributo ligado crie um getter para tal atributo. Abaixo segue código refatorado e funcionando. (testei no eclipse).

package Exercicio;

public class Equipamento {
	
	// Atributo
	private boolean ligado;
	
	// Metodo liga
	public void liga() {
		ligado = true;
	}
	
	// Metodo desliga
	public void desliga() {
		ligado = false;
	}
	
	public boolean isLigado() {
		return ligado;
	}
}

[code]package Exercicio;

public class EquipamentoSonoro extends Equipamento {

// Atributos
private short volume;

private boolean stereo;

// Métodos para ler e alterar o volume (getter e setter)
public short getVolume() {
	return volume;
}

public void setVolume(short volume) {
	this.volume = volume;
}

// Metodo mono
public void mono(boolean falso) {
	stereo = falso;// O método mono torna o atributo stereo falso
}

// Metodo stereo
public void stereo() {
	stereo = true;// O método stereo torna o atributo stereo
	// verdadeiro
}

public boolean isStereo() {
	return stereo;
}

@Override
public void liga() {
	setVolume((short) 5);
	super.liga();
}

// Metodo principal
public static void main(String[] args) {
	/*
	 * ligar o EquipamentoSonoro através do método liga, seu volume é
	 * automaticamente ajustado para 5.
	 */

	// Instanciando um objeto, criando o objeto "volume"
	EquipamentoSonoro v = new EquipamentoSonoro();
	
	// Liga equipamento sonoro
	v.liga();
	
	// imprime volume do equipamento sonoro
	System.out.println("Volume " + v.getVolume());
}

}
[/code]

[quote=robertol]Bom, vamos por parte!

Eu coloquei o método em EquipamentoSonoro porque você disse que queria que quando um EquipamentoSonoro fosse ligado, o volume fosse alterado para 5. Então deste modo, usando sobrecarga, você não precisa se preocupar em implementar esta regra de outro modo, em outro método, como você fez no método main.

Não é correto criar os métodos como static para classes de entidades. Retorne os métodos para métodos de instâncias. Se você quer acessar o valor do atributo ligado crie um getter para tal atributo. Abaixo segue código refatorado e funcionando. (testei no eclipse).

package Exercicio;

public class Equipamento {
	
	// Atributo
	private boolean ligado;
	
	// Metodo liga
	public void liga() {
		ligado = true;
	}
	
	// Metodo desliga
	public void desliga() {
		ligado = false;
	}
	
	public boolean isLigado() {
		return ligado;
	}
}

[code]package Exercicio;

public class EquipamentoSonoro extends Equipamento {

// Atributos
private short volume;

private boolean stereo;

// Métodos para ler e alterar o volume (getter e setter)
public short getVolume() {
	return volume;
}

public void setVolume(short volume) {
	this.volume = volume;
}

// Metodo mono
public void mono(boolean falso) {
	stereo = falso;// O método mono torna o atributo stereo falso
}

// Metodo stereo
public void stereo() {
	stereo = true;// O método stereo torna o atributo stereo
	// verdadeiro
}

public boolean isStereo() {
	return stereo;
}

@Override
public void liga() {
	setVolume((short) 5);
	super.liga();
}

// Metodo principal
public static void main(String[] args) {
	/*
	 * ligar o EquipamentoSonoro através do método liga, seu volume é
	 * automaticamente ajustado para 5.
	 */

	// Instanciando um objeto, criando o objeto "volume"
	EquipamentoSonoro v = new EquipamentoSonoro();
	
	// Liga equipamento sonoro
	v.liga();
	
	// imprime volume do equipamento sonoro
	System.out.println("Volume " + v.getVolume());
}

}
[/code]
[/quote]

Hummm …
Eu não tinha entendido o proposito de colocar o metodo em EquipamentoSonoro.
Mas agora eu consegui entender o que vc quiz me explicar e agradeço a aula … não sei nem como agradecer. Clariou a minha mente … rsrsrs

Obrigado pela atenção, ajuda e simplicidade nas explicações.

Vlw mesmo …

entendeu tudo mesmo?

qq coisa explicamos de novo! rs

Conseguiu fazer funcionar?

[quote=robertol]entendeu tudo mesmo?

qq coisa explicamos de novo! rs

Conseguiu fazer funcionar?[/quote]

Então robertol, entendi o que vc fez … vou tentar implementar o que vc ensinou em outro exercicio que eu tenho aqui, pois ele possui o mesmo conceito.
Qualquer duvida ou dificuldade que surgir eu posto aqui vlw.
Explicar melhor do que vc explicou acho dificil heim rsrs. Realmente esta de parabens pela simplicidade na explicação, paciencia e interesse em ajudar.

Consegui fazer funcionar sim, depois da aula que vc deu … segui o seu exemplo e deu certo.

Abraços.
Vlw.

hehe

Qualquer coisa, posta aí que a gente ajuda como puder! :wink:

Olá também sou iniciante em java e estou fazendo esse exercício hoje e consegui resolver tranquilamente até chegar na parte que fala que a classe EquipamentoSonoro " possui os atributos volume (tipo short) que varia de 0 a 10 ". Não vi neste código nenhum tratamento para este receber esse valor, tudo bem que mais adiante ele vai solicitar que ao ligar o equipamento automaticamente o volume receba o valor 5, mas e esta exigência do exercício? Desculpa-me se se estiver falando besteira mas quando fui fazer o exercício eu travei nessa parte. Antes de ver essa resolução e já tinha buscado resolver essa parte desta forma:

[code] public void setVolume(short volume){

    if(volume >= 0 & volume <= 10){
    this.volume = volume;
    }else{
        System.out.println("Volume inválido a escala de volume é de 0 a 10");
    }
} [/code] 

O que acham, está errado fazer dessa forma?
E outra, quando entro com o valor 5 no método liga() criado nessa mesma classe ele da erro porque entende que é int.

public boolean liga(){ setVolume(5); return super.liga(); }

[color=red]Galera consegui resolver o problema de ler o 5 como int. OBRIGADA.[/color]

Li_Al, a lógica da validação está correta sim. Eu teria lançado uma exceção, mas o que você fez é válido.

Sobre o problema do setVolume(5); isto é causado porque apesar de short ser um subtipo de inteiro, ele é menor e o java entende o 5 como inteiro. A solução é usar cast - (short)5