Gostaria da ajuda de vocês para tentar mudar algumas coisas nesse código.
Estou tentando fazer esse exercício de Java
Escreva uma classe para representar uma lâmpada. Desenvolva
métodos para ligar, desligar a lâmpada.
Main.java
publicclassMain{publicstaticvoidmain(String[]args){//cria o objeto lampadaLampadaestadoLampada=newLampada();//ligar a lampadaestadoLampada.setEstado(true);System.out.println("Lampada ligada.");//desliga a lampadaestadoLampada.setEstado(false);System.out.println("Lampada desligada.");}}
Quando compilo o programa Main.java com javac Main.java aparece Main.class
Lampada.java
publicclassLampada{privatebooleanestado;//ligado ou nãopublicLampada(){//a lampada comeca desligadathis.estado=false;}//metodo que seta o estado da lampadapublicvoidsetEstado(booleanestado){this.estado=estado;}//metodo que retorna o estado atual da lampadapublicbooleangetEstado(){returnthis.estado;}}
Quando compilo o programa Lampada.java com javac Lampada.java aparece Main.class
Mas, quando o programa é executado com java Main.java. Mostra como resultado:
Lampada ligada, Lampada desligada.
Gostaria que quando o programa for executado com java Main.java
Basta fazer um teste (if) de estado atual e inverter (usar o operador negação !).
1
111aaa
Algo como
publicclassLampada{//a lampada comeca desligadapublicLampada(){this.estado=false;}//metodo que seta o estado da lampadapublicvoidsetEstado(booleanestado){this.estado=estado;}//metodo que retorna o estado atual da lampadapublicbooleangetEstado(){returnthis.estado;}//ligado ou nãopublicbooleanestado(Objectmostrarestado){//a lampada comeca desligadaif(this.estado==mostrarestado)returnfalse;//metodo que seta o estado da lampadaif(mostrarestado==true)returntrue;//metodo que retorna o estado atual da lampadaif(setEstado()!=mostrarestado.setEstado())returntrue;// Check os valores}}
?
I
Iohannes1 like
Na verdade, na minha resposta anterior, eu falei bobagem. Prestando mais atenção à sua questão percebi a execução do mesmo arquivo e não de arquivos diferentes à cada chamada da JVM. A única forma de modificar as propriedades de um objeto é recompilando-o com um novo estado (definindo novos valores iniciais no código-fonte) - o que não é nada produtivo (exceto em cados de correção do código-fonte) - ou, em tempo de execução passando parâmetros para a interface pública do objeto (um método público de configuração, ou seja, um método setter conveniente). Nesse caso, as modificações ocorrem em tempo de execução. Como se chama a JVM a cada momento, o estado do objeto é redefinido para o estado inicial (conforme o determinado no código-fonte). Logo, qualquer alteração no estado do objeto não será mantida. Com efeito, assumindo que eu esteja certo, não há como fazer essas atualizações de estado do objeto lampada à cada chamada da JVM. O certo seria manter o programa rodando e alterar o estado do objeto pelo método setEstado(). Caso alguém saiba uma forma de contornar isso, ou, explicar de forma alternativa, caso eu esteja errado, por favor, não me deixe expor informações erradas impune.
1
111aaa
Como posso contornar esse problema? Gostaria de chamar um “printf” cada vez que o a linha
java Main.java
for chamada.
Exemplo,
java Main.java
System.out.println(“Lampada desligada.”);
java Main.java
System.out.println(“Lampada ligada.”);
I
Iohannes1 like
Fases de um programa Java:
1 - Edição/Codificação (implementação do algoritmo segundo a sintaxe a semântica do Java) - o programador cria um ou mais arquivos de extensão .java;
2 - Compilação - o compilador do Java transforma o arquivo .java em .class convertendo as declarações e expressões do código-fonte em código bytecode. Isso acontece com a invocação do compilador Java por meio do comando javac;
3 - Carga - o carregador Java lê os arquivos de bytecodes (.class) e os carrega na memória principal do computador (RAM);
4 - Verificação - verifica a validade dos bytecodes carregados;
5 - Execução - transforma os bytecodes em linguagem de máquina sob demanda, ou seja, à medida que é preciso (JIT). Isso é feito pela Máquina Virtual do Java (JVM) por meio do comando java.
Logo, quando tu chama a JVM, a compilação já foi feita. Chamadas sucessivas não irão alterar o estado inicial do objeto, seja ele do tipo Main ou Lampada a menos que tu mande uma mensagem para redefinir o estado, ou seja, que você passe parâmetros de configuração das propriedades (atributos) do objeto - use um método setter conveniente.
Obs.: o certo é java Main, sem a extensão .java para chamar a JVM.
1
111aaa
Como posso mandar uma mensagem para redefinir o estado, ou seja, que passe parâmetros de configuração das propriedades (atributos) do objeto - use um método setter conveniente?
I
Solucao aceita
Iohannes2 likes
Creio que não me fiz entender. Tu compila o código (javac -encoding UTF-8 Main.java); depois tu chama a JVM (java Main). Nesse caso, tu pode solicitar que o usuário ligue ou desligue a lâmpada.
Exemplo:
publicclassLampada{privatebooleanligada=false;/* * Métodos acessores e modificadores */publicvoidsetLigada(booleanalteraEstado){if(isLigada()!=alteraEstado)this.ligada=alteraEstado;}publicbooleanisLigada(){returnligada;}}importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){charopcao='s';Scannerleitor=newScanner(System.in);Lampadalampada=newLampada();System.out.print("Ligar a lâmpada?[S/N]: ");opcao=leitor.next().charAt(0);if(opcao=='s'||opcao=='S')lampada.setLigada(true);elseif(opcao=='n'||opcao=='N')lampada.setLigada(false);if(lampada.isLigada())System.out.println("\nLigando a lâmpada...");elseSystem.out.println("\nDesligando a lâmpada...");}}
Rodando…
1
111aaa
Valeu pela resposta.
1
111aaa
deu erro
Main.java:15: error: not a statement
I
Iohannes1 like
Na compilação ou na execução?
1
111aaa
Compilação
1
111aaa
É possível usar String em vez de, char?
I
Iohannes1 like
Então tu está fazendo alguma coisa errada. Sobre usar String em vez de char, sem problema, desde que, evidentemente, tu faça as adaptações necessárias.
1
111aaa
Estou tentando e pensando em uma solução diferente
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Stringcomando="ligar";Scannersc=newScanner(System.in);Lampadalampada=newLampada();intestadoAtual;System.out.print("Use o comando 'ligar' para ( ligar a lampada ) ou 'desligar' para ( desligar a lampada).");comando=sc.nextInt();switch(estadoAtual){case1:comando=="ligar"if(lampada.isLigada())if(comando.equals("ligar"))System.out.println("lampada ligada.");lampada.setLigada(true);break;case2:comando=="desligar"if(comando.equals("desligar"))if(lampada.isDesligada())System.out.println("lampada desligada.");lampada.setLigada(false);break;default:System.out.println("lampada desligada.");lampada.setLigada(false);}}}
I
Iohannes1 like
Se são Strings, é mais interessante usar o método equals() para fazer as comparações, como por exemplo: if(comando.equals("ligar")). O erro persiste?
Poderia dizer antes de acessar esse link se esse software é gratuito ou pago ou se esse software aberto ou é fechado?
1
111aaa
Fiz deste modo
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Stringcomando="ligar";Scannersc=newScanner(System.in);Lampadalampada=newLampada();intestadoAtual;System.out.println("\n\n\nUse o comando 'ligar' para ( ligar a lampada ) ou 'desligar' para ( desligar a lampada).\n\n\n");comando=sc.nextLine();switch(comando){case"ligar":if(comando.equals("\n\n\n ligar"))// if(lampada.isLigada())System.out.println("\n\n\n lampada ligada.");lampada.setLigada(true);break;case"desligar":if(comando.equals("\n\n\n desligar"))// if(lampada.isDesligada())System.out.println("\n\n\n lampada desligada.");lampada.setLigada(true);break;default:System.out.println("lampada desligada.");lampada.setLigada(false);}}}
O que você acha? Estou tentando ser criativo, original