Duvida com metodos Set e Construtor

14 respostas
cleyvison

Pessoal, boa tarde!
Mais uma vez vou “pressionar F1”,rsrsr

Seguinte recebi este codigo

package Tarefa03;

public class GradeBook{
    private String courseName; // nome do curso para esse GradeBook
 
    // construtor inicializa courseName com String fornecido como argumento
    public GradeBook( String name ){
         courseName = name; // inicializa courseName
     }
     // fim do construtor

     // método para configurar o nome do curso
     public void setCourseName( String name ){
         courseName = name; // armazena o nome do curso
     }
     // fim do método setCourseName

     // método para recuperar o nome do curso
     public String getCourseName(){
    	 return courseName;
     } 
     // fim do método getCourseName

     // exibe uma mensagem de boas-vindas para o usuário GradeBook
     public void displayMessage(){
    	 // essa instrução chama getCourseName para obter o
    	 // nome do curso que esse GradeBook representa
    	System.out.printf( "Welcome to the grade book for\n%s!\n",
    	getCourseName() );
     } 
     // fim do método displayMessage
} 
// fim da classe GradeBook

e a tarefa de modificá-lo (vejam parte comentada no proximo código)

/**
 * @author eu
 * 
 * 
 * 1) Modifique a classe GradeBook (Fig. 3.10  do  livro texto
 * ou slides 12 e 13 das aulas com áudio) como se segue:
 * a) Inclua um segundo atributo do tipo String que represente
 * o nome do instrutor do curso;
 * b) Crie um método set que modifique o valor do atributo que 
 * representa o nome do instrutor do curso e um método get que 
 * retorne esse valor;
 * c) Modifique o método construtor da classe para que  receba 
 * dois parâmetros ? um para o nome do curso e  outro  para  o 
 * nome do instrutor;
 * d) Modifique o método diplayMessage para que  ele  primeiro 
 * imprima uma mensagem de boas vindas e o nome  do  curso,  e 
 * então imprima ?Esse curso é apresentado por: ? seguido pelo
 * nome do instrutor. 
 * 
 */
package Tarefa03;

import java.util.Scanner;

public class Tarefa03 {
	
	static String nomeCurso;
	static String nomeInstrutor;
	static Scanner teclado = new Scanner(System.in);
			
	public static String getNomeCurso(){
		return nomeCurso;
	}

	public void setNomeCurso(String nomeCurso){
		this.nomeCurso = nomeCurso;
	}

	public static String getNomeInstrutor(){
		return nomeInstrutor;
	}

	public void setNomeInstrutor(String nomeInstrutor){
		this.nomeInstrutor = nomeInstrutor;
	}
	public static String displayMessage(){
		Tarefa03.getNomeInstrutor();
		Tarefa03.getNomeCurso();
		System.out.printf("Bem vindo ao curso de %s!\n", getNomeCurso());
		System.out.printf("Curso ministrado por %s!\n ",getNomeInstrutor() );
		return null;
	}
	public static void main(String[] args){		
		System.out.println("Digite o nome do curso: ");
		nomeCurso = teclado.next();
		nomeInstrutor = "Zezinho";
		Tarefa03.displayMessage();
	}
}

Até ai tudo bem, o código ta funcionando, mas eu não consegui fazer o metodo construtor e não entendi muito bem pq os “set’s” não estão funcionando, digo pq com ou sem eles a saida e sempre certa, no curso sai o que digito e no instrutor sei “zezinho”.

Alguem poderia me orientar em como implementar o metodo construtor e explicar pq não estão funcionado os metodos “set”?

14 Respostas

ViniGodoy

Livre-se da palavra Static e você obterá resultados muito melhores.

Lembre-se: Atributos static são da classe não do objeto. O que significa que todos os objetos compartilharão o mesmo valor.

A

Olá cleyvison,

Lembrando que métodos static não tem acesso a variáveis e métodos não estáticos.

Você poderia fazer desta forma:

import java.util.Scanner;  
  
public class Tarefa03 {  
      
    private String nomeCurso;  
    private String nomeInstrutor;  
    static Scanner teclado = new Scanner(System.in);  
             
    /**
    * c) Modifique o método construtor da classe para que  receba  
	* dois parâmetros ? um para o nome do curso e  outro  para  o  
	* nome do instrutor; 
	*/
	public Tarefa03(String nomeCurso, String nomeInstrutor) {
		super();
		this.nomeCurso = nomeCurso;
		this.nomeInstrutor = nomeInstrutor;
	}

	public String getNomeCurso(){  
        return nomeCurso;  
    }  
  
    public void setNomeCurso(String nomeCurso){  
        this.nomeCurso = nomeCurso;  
    }  
  
    public String getNomeInstrutor(){  
        return nomeInstrutor;  
    }  
  
    public void setNomeInstrutor(String nomeInstrutor){  
        this.nomeInstrutor = nomeInstrutor;  
    }  
    
    /**
    * d) Modifique o método diplayMessage para que  ele  primeiro  
    * imprima uma mensagem de boas vindas e o nome  do  curso,  e  
    * então imprima ?Esse curso é apresentado por: ? seguido pelo 
    * nome do instrutor.
    */  
    public void displayMessage(){  
        System.out.printf("Bem vindo ao curso de %s!\n", this.nomeCurso);  
        System.out.printf("Curso ministrado por %s!\n ", this.nomeInstrutor );  
    }  
    
    public static void main(String[] args){  
    	
    	System.out.println("Digite o nome do curso: ");  
        String nomeCurso = teclado.next();  
        String nomeInstrutor = "Zezinho";
    	
    	//Criando o objeto Tarefa03 para poder utilizar seus métodos
    	Tarefa03 tarefa03 = new Tarefa03(nomeCurso, nomeInstrutor);
        tarefa03.displayMessage();  

    }  
}
cleyvison

ViniGodoy:
Livre-se da palavra Static e você obterá resultados muito melhores.

Lembre-se: Atributos static são da classe não do objeto. O que significa que todos os objetos compartilharão o mesmo valor.

Segui seu conselho me livrei de todos os “static”, so que ai meu amigo, o “bicho” parou foi de vez, veja como ficou

package Tarefa03;

import java.util.Scanner;

public class Tarefa03 {
	String nomeCurso;
	String nomeInstrutor;
	Scanner teclado = new Scanner(System.in);
				
	public String getNomeCurso(){
		return nomeCurso;
	}

	public void setNomeCurso(String nomeCurso){
		this.nomeCurso = nomeCurso;
	}

	public String getNomeInstrutor(){
		return nomeInstrutor;
	}

	public void setNomeInstrutor(String nomeInstrutor){
		this.nomeInstrutor = nomeInstrutor;
	}
	public String displayMessage(){
		getNomeInstrutor();
		getNomeCurso();
		System.out.printf("Bem vindo ao curso de %s!\n", getNomeCurso());
		System.out.printf("Curso ministrado por %s!\n ",getNomeInstrutor() );
		return null;
	}
	public void main(String[] args){		
		System.out.println("Digite o nome do curso: ");
		nomeCurso = teclado.next();
		nomeInstrutor = "Zezinho";
		displayMessage();
	}
}

e apresenta o segunite erro: java.lang.NoSuchMethodError: main Exception in thread “main”

e agora?

cleyvison
ayrton lins:
import java.util.Scanner;  
  (..)
	public Tarefa03(String nomeCurso, String nomeInstrutor) {
		super(); 
		this.nomeCurso = nomeCurso;
		this.nomeInstrutor = nomeInstrutor;
	}
(...)

Não entendi o "super()" e nem pq this.nomeCuso

Poderia explicar?

A

O método main é um método de class ou “um método static”, ou seja, ele existe mesmo se nenhuma instância da class existir:

public static void main(String[] args){ 

}

E um método static não pode acessar variáveis de instância e métodos não static.

A

Todo construtor tem uma chamada a super implicitamente, ele chama o construtor da sua super class que nesse caso é Object.
O this. faz referência ao objeto que está sendo executado que no caso é Tarefa03.

cleyvison

ayrton lins:
Todo construtor tem uma chamada a super implicitamente, ele chama o construtor da sua super class que nesse caso é Object.
O this. faz referência ao objeto que está sendo executado que no caso é Tarefa03.

OK! o construtor eu entendi.

Agora é o seginte, se eu comentar o metodo set o programa continua exibindo o valor que eu digitar no teclado.
Neste caso não era pra dar erro ou ele me exibir null? Uma vez que não era pra estar sendo grando nada na variável devido ao fato do metodo que escreve nela estar desabilitado?

A

Não porque foi no construtor que os valores foram passados:

public static void main(String[] args){    
          
        System.out.println("Digite o nome do curso: ");    
        String nomeCurso = teclado.next();    
        String nomeInstrutor = "Zezinho";  
          
        //O nome do curso e o nome do Instrutor foram passados aqui no construtor.  
        Tarefa03 tarefa03 = new Tarefa03(nomeCurso, nomeInstrutor);  
        tarefa03.displayMessage();    
  
    }
cleyvison

ayrton lins:
Não porque foi no construtor que os valores foram passados:

public static void main(String[] args){    
          
        System.out.println("Digite o nome do curso: ");    
        String nomeCurso = teclado.next();    
        String nomeInstrutor = "Zezinho";  
          
        //O nome do curso e o nome do Instrutor foram passados aqui no construtor.  
        Tarefa03 tarefa03 = new Tarefa03(nomeCurso, nomeInstrutor);  
        tarefa03.displayMessage();    
  
    }

Então neste caso eu não precisaria dos metodos set e get?
Se for isso não atende ao que tenho que fazer, eu tenho que passar o atributo atraves do set e recuperá-lo atraves do get e não informar direto o valor.

A

Você pode fazer as seguintes alterações:

//Cria um construtor sem parâmetros 
   public Tarefa03() {

   }
    
    //Tarefa da letra c)
    public Tarefa03(String nomeCurso, String nomeInstrutor) {
		//super(); Implicitamente o construtor chama o método super().
		this.nomeCurso = nomeCurso;
		this.nomeInstrutor = nomeInstrutor;
	}
    
    public void displayMessage(){  
        System.out.printf("Bem vindo ao curso de %s!\n", getNomeCurso());  
        System.out.printf("Curso ministrado por %s!\n ", getNomeInstrutor());  
    }  
    
    public static void main(String[] args){  
    	
    	System.out.println("Digite o nome do curso: ");  
        String nomeCurso = teclado.next();  
        String nomeInstrutor = "Zezinho";
    	
    	//Criando o objeto Tarefa03 para poder utilizar seus métodos
    	Tarefa03 tarefa03 = new Tarefa03();
    	//Utilizando os métodos SETTERs
    	tarefa03.setNomeCurso(nomeCurso);
    	tarefa03.setNomeInstrutor(nomeInstrutor);
       
    	tarefa03.displayMessage();  
    
    }
cleyvison

ayrton lins:
Você pode fazer as seguintes alterações:

//Cria um construtor sem parâmetros 
   public Tarefa03() {

   }
    
    //Tarefa da letra c)
    public Tarefa03(String nomeCurso, String nomeInstrutor) {
		//super(); Implicitamente o construtor chama o método super().
		this.nomeCurso = nomeCurso;
		this.nomeInstrutor = nomeInstrutor;
	}
    
    public void displayMessage(){  
        System.out.printf("Bem vindo ao curso de %s!\n", getNomeCurso());  
        System.out.printf("Curso ministrado por %s!\n ", getNomeInstrutor());  
    }  
    
    public static void main(String[] args){  
    	
    	System.out.println("Digite o nome do curso: ");  
        String nomeCurso = teclado.next();  
        String nomeInstrutor = "Zezinho";
    	
    	//Criando o objeto Tarefa03 para poder utilizar seus métodos
    	Tarefa03 tarefa03 = new Tarefa03();
    	//Utilizando os métodos SETTERs
    	tarefa03.setNomeCurso(nomeCurso);
    	tarefa03.setNomeInstrutor(nomeInstrutor);
       
    	tarefa03.displayMessage();  
    
    }

Acho que estamos vivendo uma contradição, qdo o construtor ta funcionando os “get e set” não influenciam no funcionamento.
Agora que os “get e set” estão funcionando, as variável do construtor que não estão influenciando.

Outra duvida é pq as variaveis “nomeCurso e nomeInstrutor”, tiveram que ser declaradas novamente no metodo main?

edu_fernandes

Cleyvison.
Existe um conceito que se chama ‘escopo de variáveis’.
Isso significa que determinados parâmetros existem apenas em um método ou condição.
Vejamos.

for(int i=0;i<10;i++){}

A variável ‘i’ existe apenas enquanto o loop existir. Assim que ele termina ela também é apagada.
No caso do método, não é que as mesmas variáveis foram passadas novamente.
Na verdade ele usou dos mesmos nomes, porém elas estão enderaçadas em locais diferentes.
Se fosse assim também funcionária e seria a mesma coisa, apenas com nomes diferentes.

public Tarefa03(String nomeDoSaci, String nomeDaCuca) {
		//super(); Implicitamente o construtor chama o método super().
		this.nomeDoSaci = nomeDoSaci;
		this.nomeDaCuca = nomeDaCuca;
	}

Ele usou dos mesmos nomes pelo fato de facilitar o entendimento do código. Ao menos acredito que tenha sido por isso.
Espero ter ajudado.
Abraço e boa sorte com os projetos.

cleyvison

Ajudou Bastante…

Obrigado

cleyvison

Pessoal bom dia, a versão final ficou assim

/**
 * 1) Modifique a classe GradeBook (Fig. 3.10  do  livro texto
 * ou slides 12 e 13 das aulas com áudio) como se segue:
 * a) Inclua um segundo atributo do tipo String que represente
 * o nome do instrutor do curso;
 * b) Crie um método set que modifique o valor do atributo que 
 * representa o nome do instrutor do curso e um método get que 
 * retorne esse valor;
 * c) Modifique o método construtor da classe para que  receba 
 * dois parâmetros ? um para o nome do curso e  outro  para  o 
 * nome do instrutor;
 * d) Modifique o método diplayMessage para que  ele  primeiro 
 * imprima uma mensagem de boas vindas e o nome  do  curso,  e 
 * então imprima ?Esse curso é apresentado por: ? seguido pelo
 * nome do instrutor. 
 * 
 */
package Tarefa03;

import java.util.Scanner;

public class Tarefa03 {
	static String nomeCurso;
	static String nomeInstrutor; // (a)
	static Scanner teclado = new Scanner(System.in);
	
	// incio (c)
	public Tarefa03(String getNomeCurso, String getNomeInstrutor){
		Tarefa03.nomeCurso = getNomeCurso;
		Tarefa03.nomeInstrutor = getNomeInstrutor;
	}// fim (c)		
	
	public static String getNomeCurso(){
		return nomeCurso;
	}

	public void setNomeCurso(String nomeCurso){
		Tarefa03.nomeCurso = nomeCurso;
	}
	// inicio (b)
	public static String getNomeInstrutor(){
		return nomeInstrutor;
	}

	public void setNomeInstrutor(String nomeInstrutor){
		Tarefa03.nomeInstrutor = nomeInstrutor;
	}//fim (b)
	
	//inicio (d)
		public void displayMessage(){
		System.out.printf("Bem vindo ao curso de %s!\n", this.nomeCurso);//Aqui ficou o seguente alerta "The static field Tarefa03.nomeCurso should be accessed in a static way", mas o codigo ta funcionado

		System.out.printf("Esse curso é apresentado por: %s!\n ",this.nomeInstrutor);//Aqui ficou o seguente alerta "The static field Tarefa03.nomeInstrutor should be accessed in a static way", mas o codigo ta funcionado

	}//fim (d)
	
	public static void main(String[] args){		
		System.out.println("Digite o nome do Instrutor: ");
		String nomeInstrutor = teclado.next();
		String nomeCurso = "Java";
		Tarefa03 tarefa03 = new Tarefa03(getNomeCurso(), getNomeInstrutor());
		tarefa03.setNomeCurso(nomeCurso);
		tarefa03.setNomeInstrutor(nomeInstrutor);
		tarefa03.displayMessage();
	}
}

Ficou apenas um warnig, mas eu goataria de saber se posso ter algum problema devido a isso e se da pra melhorar o codigo, para que ele fique sem erros ou alertas?

Criado 20 de novembro de 2010
Ultima resposta 21 de nov. de 2010
Respostas 14
Participantes 4