Duvida como usar Scanner RESOLVIDO

Olá pessoal , sou totalmente iniciante em java e gostaria que me ajudassem com um simples problema…
tenho uma classe “quadrado” onde preciso calcular a area e o perimetro,e informo seus atributos por meio de métodos getters e setters.
mas eu quero inserir o valor pelo Scanner mas nao estou conseguindo

So pesso paciência de todos pq é um codico bem tosco mesmo eu sei…mas ninguem nasce sabendo

public class Quadrado {
    public int lado;
    public int perimetro;

 
    public Quadrado(){     
    }
    public Quadrado(int lado,int perimetro ){
      this.lado=lado;
      this.perimetro=perimetro;
    }    
    public void setlado(int lado){       
        this.lado=lado;
    }
    public int getlado(){
        return lado;
    }
    public void setperimetro(){
        this.perimetro=lado*4;
    }
    public int getperimetro(){
        return perimetro;
    }
    }

metodo main assim ele funciona

 //Quadrado= lado*lado
        Quadrado q1= new Quadrado();                    
        q1.setlado   (5)     ;
        q1.setperimetro();
          

assim da erro no
q1.setlado


 public static void main (String[]args){
        
        //Quadrado= lado*lado
        Quadrado q1= new Quadrado();
        Scanner valor= new Scanner (System.in);
        JOptionPane.showInputDialog("Digite um lado do quadrado");
        
        q1.setlado = valor.nextInt  ()     ;
        q1.setperimetro();
          
        JOptionPane.showMessageDialog(null," A área do quadrado é :\n"
                 + q1.getlado()*q1.getlado()+" m2 "+" "
                  + "\nPerimeto "+q1.getperimetro() );

Tem algo errado nesse teu código:

Primeiro, setlado é um método, então vc não pode atribuir e sim executar

Quadrado q1= new Quadrado();   
       Scanner valor= new Scanner (System.in);   
       JOptionPane.showInputDialog("Digite um lado do quadrado");   
         
       q1.setlado = valor.nextInt  ()     ;   

então deveria ser

q1.setlado(valor.nexInt());

além disso,

Voce ta ativando o Scanner e em seguida pedindo um JOptionPane.

Se você esta digitando nele não está digitando no Scanner.

Deveria ser algo assim:

Quadrado q1= new Quadrado();   
       System.out.println("Digite um lado do quadrado");
       Scanner valor= new Scanner (System.in);   
        
       q1.setlado(valor.nextInt  ());   

ou se nao precisa usar o Scanner, use só o InputDialog e pegue o valor de retorno dele
que é uma String e transforme para inteiro e use no set lado.

1 curtida

kaminari, beleza?

Então, vou tentar te dar uma ajuda básica não só com a parte do Scanner, mas também com a parte de atributos e métodos.

Seguinte, primeiro com relação aos construtores da sua classe Quadrado.

public Quadrado(){

}

public Quadrado(int lado, int parimetro){
    this.lado = lado;
    this.perimetro = perimetro;
}

Até aqui está certinho, entretanto seus atributos lado e perimetro são variáveis públicas o que é errado pois dessa forma qualquer um teria acesso a modificar o valor dessa variável por fora do seu código, altere o public que há antes de cada variável e coloque como private, assim você utilizará o segundo construtor da forma correta, pois só ele terá acesso direto a suas variáveis de instância.

Outra coisa, coloque dentro do segundo construtor:

public Quadrado(int lado){
    this.lado = lado;
    this.perimetro = this.lado * 4;
}

Assim o método setPerimetro() perde a razão de existência, já que você está atribuindo o valor do perímetro pelo construtor.

Com relação ao seu problema, você pode:

  1. Escolher o JOptionPane para receber entrada de dados do usuário, porém terá que converter a String retornada pelo método showInputDialog();
  2. Escolher o Scanner para receber a entrada de dados do usuário, sem a necessidade de conversão.

No seu caso a opção 2 é a correta, então faça:

public static void main(String [] args){
    Scanner inputScan = new Scanner(System.in);
    System.out.print("Digite um lado do quadrado: ");
    int lado = inputScan.nextInt();

    Quadrado quadrado = new Quadrado(lado);
    System.out.println("A área do quadrado é: " + quadrado.getLado() * quadrado.getLado() + " m2 " + " Perímetro: " + quadrado.getPerimetro());
}

Em seu lugar eu removeria os métodos set(), mas fica ao seu critério.

Espero ter ajudado!

;D

No começo do seu programa você esqueceu de importar a classe Scanner

coloque isso “import java.util.Scanner;” no começo do código antes da declaração de classe

E eu também não entendi o porque daquele método Quadrado() nas linhas 6 e 7 sem nada no seu bloco de instruções. Remova-o.

Quando você chama um método, o método retorna um valor ao seu chamador. Se você exigi um parâmetro para o método ser realizado então você deve passar o argumento devivo. ali voce atribiu o método q1.setlado ao que você digitou.

Método

public void setlado( parametro )

eu chamo o metodo na outra classe com: q1.setlado( passo o meu argumento aqui que no caso é o que eu vou digitar, ou seja)
q1.setlado( valor.nextInt() );

exatamente como nosso outro colega ai explicou.

Só uma pequena correção o código:

public Quadrado(){
    
}

Não é um método, é um construtor, ou seja, o que é executado quando você faz:

/*
* Aqui está sendo criado um objeto do tipo Quadrado na memória Heap, referenciado pela variável 'q'.
* Esse objeto terá as variáveis de instância inicializadas com valores padrão, ou seja, 0 para números
* null para referências e false para booleanos.
*/
Quadrado q = new Quadrado(); 

Dependendo da situação é altamente recomendável que você deixe em seu código um construtor em branco (como o que está nas linhas 6 e 7). Isso geralmente é utilizado quando se usa herança. Mas nesse caso específico, não está sendo útil ao código.

Espero ter ajudado ;D

Um construtor?

Desculpe se eu estiver errado no caso dele.

E aproveita e me responde. Um construtor num serve para inicializar as variaveis de instancia? Serve para mais outra coisa? No caso dele ali não vejo servir para nada.

Sim, um construtor, pois ele literalmente falando constrói o objeto a qual se refere.

Exatamente, um construtor serve para inicializar as variáveis privadas de instância de um objeto, mas essa não é sua única utilidade. Dependendo do caso, você poderá fazer validações antes de inicializar suas variáveis, fazer chamadas de métodos dentro do construtor e até chamar outro construtor para terminar a construção de um objeto.

Por exemplo, imagine que você tenha uma classe Conta, que possua a seguinte estrutura:

public class Conta{
    private int numero;
    private String titular;
}

Para capturar ou configurar as variáveis de instância de um objeto do tipo Conta, você precisará de métodos getters e setters:

public void setNumero(int numero){
    this.numero = numero;
}
public int getNumero(){
    return this.numero;
}
public void setTitular(String titular){
    this.titular = titular;
}
public String getTitular(){
    return this.titular;
}

Nesse caso, o construtor public Conta() está implicitamente definido, pois quando não criamos um construtor, a Java cria um construtor vazio para nós. Porém, podemos criar nossos próprios construtores de acordo com cada situação.

public Conta(){
    
}
public Conta(int numero){
    this.numero = numero;
}
public Conta(String titular){
    this.titular = titular;
}
public Conta(int numero, String titular){
    this.numero = numero;
    this.titular = titular;
}
public Conta(String titular, int numero){
    this.titular = titular;
    this.numero = numero;
}

Perceba que, temos 4 formas de criar um objeto do tipo Conta. Os mais completos sendo o 3º e o 4º construtor, pois eles constroem o objeto ao nosso gosto, ou seja, com os valores que passarmos para o construtor. Dessa forma também podemos remover os métodos setters, pois estamos iniciando as variáveis de instância através do construtor. Mas ainda podemos fazer com que um construtor, complete a criação do objeto chamando outro construtor:

public Conta(String titular){
    this.titular = titular;
}
public Conta(int numero){
    this.numero = numero;
}
public Conta(String titular, int numero){
    this(titular); //Aqui estamos invocando o construtor Conta(String titular), e depois terminamos a construção do objeto usando this.numero = numero;
    this.numero = numero;
}
public Conta(int numero, String titular){
    this(numero); //Aqui estamos invocando o construtor Conta(int numero), e depois terminamos a construção do objeto usando this.titular = titular;
    this.titular = titular;
}

Dessa forma além de remover o uso dos métodos setters, também estamos criando um objeto utilizando vários construtores. Com isso, torna-se uma classe mais compacta do que utilizando setters para tudo.

Espero ter ajudado ;D

Hmm…Pensei que construtores serviam apenas para isso. Estudo pelo livro da deitel somente e faço os exercícios, estou no cap 6, ele não tinha explicado tudo isso sobre construtores.

Não entendi muito bem. Pode me explicar melhor?

Quando não criamos um construtor o java cria implicitamente para a gente. Tá mais para que serve esse construtor invisivel criado?
E o 3 e 4 construtores setam as variaveis de instancia é isso? No caso ele retorna algum valor?

Não entendi muito bem essa última parte. E o construtor precisa ter o mesmo nome da classe? O que a instrução this faz? porque quando eu setava a variavel colocaria assim: titular = titular. Acredito que seja mesma coisa.

Esse construtor serve para que você consiga criar seus objetos, como não há nada declarado dentro dele, ele inicializará suas variáveis de instância com valores padrão.

Não eles não retornam, apenas atribuem os valores passados dentro do argumento do construtor à suas variáveis de instância.

Sim precisa, para que a Java identifique que é um Construtor e não um método, lembrando que para criar um construtor é preciso que ele tenha o mesmo nome da classe e não possua tipo de retorno.

A instrução this, informa que você está atribuindo ou invocando um método desse objeto, por exemplo:

public class Carro{
    private int chassi;

    public Carro(int chassi){
        this.chassi = chassi; 
        //O 'this', informa que você está atribuindo o valor passado pela 
        //variável local 'chassi' para a variável de instância 'chassi' desse objeto.
    }
}

o que você fez usando ‘titular = titular’ dá na mesma, mas conceitualmente falando, fica mais legível você utilizar o ‘this’ quando quiser diferenciar suas variáveis de instâncias de suas variáveis locais.

Espero ter ajudado! ;D

Entendi quase tudo. Obrigado pela paciência e explicação.

em:

O “this.chassi” é a variável que é passada como argumento para o construtor Carro?
E a variavel " = chassi" é a variável de instância?

Só quero ter certeza que entendi

No caso o meu construtor Carro seta a variavel chassi passada como argumento para o campo chassi. E se eu tiver uma outra classe por exemplo Verifica Carro

Como eu chamaria o construtor TODA VEZ que eu quisesse setar essa variavel chassi?
Eu criaria um objeto da classe Carro e como chamaria o construtor?

Obrigado, o tópico nem é meu e você está tirando minhas dúvidas.

[quote=lucas_guj]Entendi quase tudo. Obrigado pela paciência e explicação.

O “this.chassi” é a variável que é passada como argumento para o construtor Carro?
E a variavel " = chassi" é a variável de instância?

[/quote]
Na verdade o “this.chassi” é a variável de instância e a variável “chassi” passada como argumento do construtor é a variável local.

Na verdade se você precisasse alterar o valor da variável chassi diversas vezes (o que eu acho improvável nesse escopo, pois o número de registro do chassi de um Carro é único), então sua classe precisaria de um método setChassi(int chassi). Em alguns casos você conseguirá evitar a criação de métodos setters, em outros casos não. No escopo que você informou, que teria que alterar a variável chassi precisaria de uma método setChassi para efetuar as alterações através do ambiente externo.

Espero ter ajudado ;D

Agora entendi. Ajudou sim. Obrigado

Pessoal muito obrigado pela paciencia de todos que estao me ajudando …
demorei para responder devido a uns problemas por aqui…
vou testar todas opço~es citadas pra ver qual funciona…
t+ valeu