Métodos e encapsulamento

Utilizando o conceito de objectos e encapsulamento capture o nome , 4 notas do aluno e que ainda retorne a média e se o aluno passou ou reprovou, o aluno foi aprovado se tirar media maior ou igual a 6

package notaenome;

import java.util.Scanner;

public class NotaENome {

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    dadosAluno aluno = new dadosAluno();

    int i = 0;
    double nota = 0;
    String nome = "";
    System.out.println("Digite o nome do aluno");
    aluno.setNome(nome);
    System.out.println("Digite a nota do aluno");
    aluno.setNota(nota);
    
    while (i < 4) {
        System.out.println("Digite a nota do aluno");
        aluno.setNota(nota);
        i++;
    }

    System.out.println("A soma da nota é " + aluno.getNota());
}

}

package notaenome;

public class dadosAluno {

private String nome;
private double nota;


public dadosAluno() {

    nome = "";
    nota = 0;

}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    this.nome = nome;
}

public double getNota() {

    return nota;
}

public void setNota(double nota) {
    this.nota = nota;
}

private static double soma(double nota) {
    int contar;
    double soma = 0;
   
    for (contar = 0; contar <4;contar++) {
        soma = soma + nota;
    }
    return soma;
}
private static double media(double soma){
double medianota;
    medianota=soma/contar.length ;

return medianota;
}

}

Primeiramente NÃO DUPLIQUE O TÓPICO por estar com pressa. Se quiser se expressar melhor edite-o ou espere alguém responder.

Agora vamos ao problema… onde que está sendo feito a soma na classe NotaENome.java?
Tem dois setters um fora e outro dentro do laço while. Esse fora não precisa existir.

Outra coisa, como está pegando os valores se a classe Scanner não está sendo usada?

Outra coisa, na classe dadosAluno.java (nomenclatura em Java nome de classe sempre começa com letra maiúscula, isso não impede de a classe compilar, mas é um padrão a ser seguido) no método media(double soma) de onde tá vindo essa variável contar? Acredito que tenha um erro aí porque ela foi declarada em escopo local.

Não quero soar arrogante, mas recomendo fortemente dar uma estudada porque parece que você não tem uma base. Assiste essas aulas. A didática é boa e caso vá surgindo dúvidas vai perguntando aqui.

Aqui está como seria uma das formas de fazer isso. Mas, cara estude realmente. Copiar e colar no começo é interessante pra poder ir entendendo o que foi feito. Outra coisa, não espere código pronto sempre que tiver uma dúvida.

Veja o que foi feito no exemplo abaixo e o que tá faltando no seu código.


public class NotaENome {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        DadosAluno aluno = new DadosAluno();
        System.out.println("Digite o nome do aluno: ");
        aluno.setNome(sc.nextLine());
        int count = 1;
        double soma = 0;
        System.out.println("\nAluno: " + aluno.getNome());
        while (count <= 4) {
            System.out.println("Digite a " + count + "º nota do aluno: ");
            aluno.setNota(sc.nextDouble());
            soma += aluno.getNota();
            count++;
        }
        double media = soma/4;
        System.out.println("A média do aluno " + aluno.getNome() + " é: " + media);
    }
}

public class DadosAluno {

    private String nome;
    private double nota;

    public DadosAluno() {
        nome = "";
        nota = 0;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public double getNota() {
        return nota;
    }

    public void setNota(double nota) {
        this.nota = nota;
    }
}

Lucas, obrigado pelas respostas dada. Estou estudando para que possa chegar ao nível aceitável. Por acaso só mesmo iniciante neste matéria. E pior ainda é pela primeira fez que uso o conceito de encapsulamento

1 curtida

Aproveito para deixar uma outra dica, a semântica é importante e, neste caso, a classe dado aluno, poderia se chamar “Aluno”, uma vez que, serve de modelo para todos os alunos. Fica mais claro, exemplo:

Aluno aluno=new Aluno();
aluno.setNota(2);
aluno.getNota();

A classe “DadosAluno” gera um entendimento de algo que resgata dados do aluno ou algo assim. Só exemplo, ok?

Abraço e bons estudos!

Só uma dicas

1 curtida

Somo nós. Me desculpa se sooei arrogante. Acompanha as aulas dessa playlist que te mandei e qualquer dúvida vai perguntando.

Seu código não esta encapsulado porque os atributos do objeto DadosAluno estão acessíveis.

Onde que tu tá vendo isso? Os atributos da classe que tu disse estão privados.

E?
Encapsulamento esta quebrado se você expos todos os atributos. Não importa se é via get ou atributo público.

Métodos getters/setters estão ai só pela burocracia da linguagem Java. Na prática não é um caso de encapsulamento mesmo.

O grande problema é que existem pouquíssimas referências que podemos utilizar que nos permitam uma visão diferente desse lugar comum do decoreba: bota private em tudo, gera getters/setters e está encapsulado.
Exemplo
Não me recordo de nenhum material que eu tenha visto na vida acadêmica ou posterior a ela que tenha abordado encapsulamento de maneira distinta da definição encontrada aí neste texto da devmedia.

1 curtida

Concordo. Outro grande problema que sempre vejo está relacionado ao uso de herança, e está neste mesmo link que voce passou!

1 curtida

getters/setters não tem lugar no design OO. Eles foram criados para serem usados pelas ferramentas visuais mas na prática isso nunca funcionou. Agora todo mundo usa como um sinal que seu código é OO. lol

Existem milhares de artigos na web sobre os problemas de getters e setters e porque eles violam o princípio do encapsulamento.

Sim, existem. Mas, o que eu me refiro é que, em geral, o que se ensina é diferente disso. Ensina-se a repetir que atributos privados e getters/setters garantem o encapsulamento para os campos.
Além disso, quando uma bibliografia ou site ou vídeo aborda o encapsulamento, inevitavelmente ruma para este mesmo lado.
Que é o mesmo que ocorre com herança/realização e o tão temido polimorfismo.

Tem um ótimo artigo, já antigo, no blog da caelum sobre o uso indiscriminado de get/set, só como exemplo.

Encapsulamento significa poder alterar a definição interna de um objeto sem que seja necessário alterar outras partes do programa, onde o objeto é usado.

Se você faz uma mudança relacionado a definição de um campo (tipo do atributo, por exemplo) que possui um getter/setter, vai precisar alterar seu programa em vários lugares onde o getter/setter é usado. Neste caso, não existe encapsulamento.

Hum, coesão e acoplamento são, apenas, sinônimos ou são termos utilizados para descrever coisas distintas disso?

Entendo que encapsulamento é algo como

Encapsulation is an Object Oriented Programming concept that binds together the data and functions that manipulate the data, and that keeps both safe from outside interference and misuse. Data encapsulation led to the important OOP concept of data hiding.

Tanto que, quando fazemos uso de uma interface, estamos, além do óbvio uso do conceito de realização (implementação), aplicando o encapsulamento num nivel maior, que abrange os objetos em si, como um todo e não as suas partes.
é neste aspecto que eu me refiro quando afirmo que todo o ensino é falho quando trata de conceitos de OO, principalmente encapsulamento, herança/realização e polimorfismo.
E, com certeza, por conta destas falhas que muitos não compreendem como refatorar e melhorar seu código.
Em tempo, a definição de encapsulamento eu tirei daqui

Não tem como declarar um atributo como propriedade no Java?

@property int nota;

Dessa maneira as ferramentas para criação de GUIs não precisariam se basear em métodos getter/setter para inferir a existência de um atributo.

Usar getter/setter viola o conceito de encapsulamento no sentido que não vai levar ao conceito de data hiding (ou data abstraction), que é expor apenas a interface e esconder os detalhes de implementação. Atributos não fazem parte da interface.

Podem começar retirando os getter/setter. Eles foram feitos para serem usados apenas por ferramentas de criação de GUIs e sua existência denuncia que o design não é OO.

Eu entendo isso, tanto que é o que estou colocando desde o começo.
Também entendo que isso não é um “benefício” apenas do Java. Em C# isso também é feito, por exemplo (de maneira diferente, mas, com a mesma razão).

Sugestão sobre como substituir os getters/setters?

Lembrando que não são apenas os geradores de GUI que fazem uso disso, boa parte dos frameworks (spring, hibernate, eclipselink, jsf, struts 2) fazem uso destes métodos (medonhos) em prol de seu funcionamento, tanto que muitos consideram tais métodos uma maneira padrão de desenvolver para java.
Não sei se o que escrevo a seguir ainda é assim, mas, era até alguns anos atrás:
O Spring framework não injeta uma instância de objeto numa variável se a mesma não possuir um setter e getter corretamente definidos. Usar o construtor? É uma opção.
Hibernate e EclipseLink idem. Precisam dos setters quando recuperam valores das tabelas e dos getters para fazer os inserts, updates, etc.

Não sei, mas no C# é direto na linguagem.