Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

sobre void não retornar valor

não ta fazendo sentido pra mim o uso de void não retornar valor, porque por exemplo:

void exibeFichaTecnica(){
            System.out.println("Nome do filme:" + nome);
            System.out.println("Ano de lançamento:" + anoDeLancamento);
        }

quando vc chama meuFilme.exibeFichaTecnica(); ele literalmente retorna o nome do filme e o ano de lançamento, então qual o sentido de ser sem retorno ? ou é algum outro tipo de retorno, porque eu só conheço retorno no sentido de "me entregar algo" e me parece que literalmente codigo está me retornando o que tem em void...

enquanto que nos ultimos casos


        void avalia(double nota) {
            somaDasAvaliacoes += nota;
        }

double pegaMedia(){
    return somaDasAvaliacoes / totalDeAvaliacoes;
}

é dito que em pegaMedia não seria usado o "void" por que ia querer um valor tal retornado, porém quando é chamado, meuFilme.avaliacoes e meuFilme.totalDeAvaliacoes a gente também tem um valor retornado ao reproduzir o codigo, então, tipo, qual a diferença? talvez meu cerebro esteja derretido

//eu sei que está escrito return, em pegaMedia que quer dizer retorno, porém em void avalia(double nota) não esta escrito return, e ainda assim me retorna o valor de somaDasAvaliacoes += nota;

então... O que especificamente, o void NÃO ESTÁ retornando enquanto que o pegaMedia ESTÁ? uma vez que ambos me devolvem o valor contido neles quando executados?

8 respostas

O método void serve para indicar que o método não retorna nenhum valor mas ele pode altera os valores dos atributos, no seu caso você apenas chamou o método exibeFichaTecnica onde este método apenas vai imprimir os valores do nome do filme e o ano do lançamentos sem retornar um valor, o que o seu método faz não é considerado um tipo de retorno e sim uma tratativa. Um exemplo de um retorno utilizando esse mesmo método seu:

String exibeFichaTecnica(){
              String dados = "Nome do filme: " + nome + "\n";
             dados += "Ano de lançamento:" + anoDeLancamento;
            return dados;
        }

aqui eu não fiz apenas uma tratativa eu fiz a tratativa e retornei o valor da tratativa dentro na variável dados para usar o metodo principal mas eu poderia usar o método void e ao inves do return dados eu poderia colocar o System.out.println(dados)

String exibeFichaTecnica(){
              String dados = "Nome do filme: " + nome + "\n";
             dados += "Ano de lançamento:" + anoDeLancamento;
            System.out.println(dados);
        }

E sobre o método avalia ele não mostra nada pois o Método é void, e ele foi feito apenas para atualizar o valor da variável para utilizar no método pegaMedia

Não sei que expliquei muito bem, não sou muito forte em "ensinar" por texto, se tiver com duvida é só entra no discord da Alura que eu te mostro por código como isso funciona, pois sou melhor ensinando assim, ainda mais utilizando o debugger, fora isso espero ter ajudado

"O método void serve para indicar que o método não retorna nenhum valor mas ele pode altera os valores dos atributos"

então eu poderia dizer que dentro de um tipo void, eu só posso ter "ideias" e não "valores"?

por exemplo se a linha abaixo

void avalia(double nota) {
            somaDasAvaliacoes += nota;
            totalDeAvaliacoes++;
            

fosse escrita com qualquer valor dentro dela, ela não poderia ser do tipo void? por exemplo se fosse escrito como abaixo, estaria errado?

void avalia(double nota) {
            somaDasAvaliacoes += 1;
            totalDeAvaliacoes++;

Isso você pode alterar os valores dentro dele, os dois modos estão certos, pois eles estão apenas atualizandos os valores, no caso do primeiro:

void avalia(double nota) {
            somaDasAvaliacoes += nota;
            totalDeAvaliacoes++;
}

você atualizou o valor da varável somaDasAvaliacoes com a variável nota que você passsou como atributo. neste outro caso:

void avalia(double nota) {
            somaDasAvaliacoes += 1;
            totalDeAvaliacoes++;
}

você só está atualizando o valor da variável somaDasAvaliacoes com o valor 1. mas a variável nota não está sendo usada então a ide que você estiver usando vai apenas mostra que a variável nota não está sendo usada. então você poderia tirar ela e só deixar o

void avalia() {
            somaDasAvaliacoes += 1;
            totalDeAvaliacoes++;
}

tem um exemplo de um caso como o desse tipo void abaixo escrito errado? de forma que nao poderia ser void, e explicar o porque? ta realmente dificil eu entender :l

void avalia(double nota) {
            somaDasAvaliacoes += 1;
            totalDeAvaliacoes++;
}

no caso qual seria a usa duvida neste codigo? eu criri uma classe de teste e ela funcionou perfeitamenta, no caso eu não entendi a sua pergunta, seria a atualização do valor da variável?

acho que talvez meu problema seja não saber o que significa a palavra "Retorno" em programação :v

solução!

o retorno é mais utlizado para caso você queira retorna o valor para o escope principal e não apenas motras ele em um "escopo" secundário: Aqui temos a classe secundária: public class Secundaria {

private String nome;
private Integer anoDeLancamento;
private Double somaDasAvaliacoes;
private Integer totalDeAvaliacoes;

public Secundaria(String nome, Integer anoDeLancamento, Double somaDasAvaliacoes, Integer totalDeAvaliacoes) {]
    this.nome = nome;
    this.anoDeLancamento = anoDeLancamento;
    this.somaDasAvaliacoes = somaDasAvaliacoes;
    this.totalDeAvaliacoes = totalDeAvaliacoes;
}

public Secundaria() {
}

public Double getSomaDasAvaliacoes() {
    return somaDasAvaliacoes;
}

public void setSomaDasAvaliacoes(Double somaDasAvaliacoes) {
    this.somaDasAvaliacoes = somaDasAvaliacoes;
}

public Integer getTotalDeAvaliacoes() {
    return totalDeAvaliacoes;
}

public void setTotalDeAvaliacoes(Integer totalDeAvaliacoes) {
    this.totalDeAvaliacoes = totalDeAvaliacoes;
}

void avalia(double nota) {
    somaDasAvaliacoes += nota;
    totalDeAvaliacoes++;
}

double pegaMedia(){
    return somaDasAvaliacoes / totalDeAvaliacoes;
}
void exibeFichaTecnica(){
            System.out.println("Nome do filme:" + nome);
            System.out.println("Ano de lançamento:" + anoDeLancamento);
        }
}

que tem os construtores e os métodos. agora a principal:

public class Principal {

public static void main(String[] args) {

    Secundaria secundaria = new Secundaria();

    secundaria.setSomaDasAvaliacoes(45.0);
    secundaria.setTotalDeAvaliacoes(1);

    secundaria.avalia(15);

    System.out.println("A soma da avalição é: " + secundaria.getSomaDasAvaliacoes());
    System.out.println("O Total de avaliações é: " + secundaria.getTotalDeAvaliacoes());
    System.out.println("A média da avaliação é: " + secundaria.pegaMedia());
    
    secundaria.exibeFichaTecnica();
}

}

na principal eu declarei a classe secundaria e setei o valor 45.o na soma das avaliações e 1 no total da avaliação. aí eu chamei o método "avalia" da classe secundária que é void passando o valor 15 como nota: secundaria.avalia(15); que chama esse método:

  void avalia(double nota) {
        somaDasAvaliacoes += nota;
        totalDeAvaliacoes++;
    }

aqui ele apenas atualisou os valores, o atributo "somaDasAvaliacoes" que tinha o valor 45 foi atualizado para 60 e o atributo "totalDeAvaliacoes" foi atualizado para 2 acho que até aqui você já tenha entendido. aí eu pedi para a classe principal mostrar os valores dos atributos / variáveis da classe secundária:

System.out.println("A soma da avalição é: " + secundaria.getSomaDasAvaliacoes());
 System.out.println("O Total de avaliações é: " + secundaria.getTotalDeAvaliacoes());

que executa esses métodos na classe secundária:

  public Double getSomaDasAvaliacoes() {
        return somaDasAvaliacoes;
    }
  public Integer getTotalDeAvaliacoes() {
        return totalDeAvaliacoes;
    }

aqui utiliza o return pois eu quero que quando eu executar o método get o valor do atributo / variável da classe secundária passe dela para o princial, que no caso no método void não retornaria. que no fim executo o comando para imprimir e o método " secundaria.pegaMedia()" System.out.println("A média da avaliação é: " + secundaria.pegaMedia()); para também retorna o valor da média para o escopo principal. porem quando eu executo o comando "secundaria.exibeFichaTecnica()" que chama o método:

void exibeFichaTecnica(){
            System.out.println("Nome do filme:" + nome);
            System.out.println("Ano de lançamento:" + anoDeLancamento);
        }

eu não quero que o atributo / variavel nome e anoDeLancamento retorne para o escopo principal eu só quero que ele seja executado lá sem que me retorne nada para eu usar no principal, deu para entender?

com sua explicação e conforme fui terminando o curso fui entendendo melhor, valeu Daniel

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software