Olá, Daniel!
Existe uma forma de acessar atributos privados através de outra classe em Java, muitos frameworks utilizam isto e tem curso aqui no Alura sobre a Reflection API. No entanto, entendo que não é o que você precisa neste caso.
Programaticamente, é possível que a classe Aluno
mude o atributo nota
se este atributo for dela e, se for privado, o Professor
só terá acesso através de um setter
ou um método qualquer (ex: receberNota(double nota)
) que permita a alteração deste atributo.
Agora, para impedir que o aluno mude, basta que você programador não escreva código que vai permitir isso, mas não vejo uma forma de impedir que seja feito de forma programática. As pessoas desenvolvedoras têm muitos truques e se quiserem vão conseguir fazer besteira no código. xD
Pensando em um caso onde Professor e Aluno são classes do sistema, mas são também usuários reais. Pode ser um pouco confuso, mas o design das suas classes nem sempre representa os atores ou usuários, mas sim o seu modelo de negócios.
Mas vale pensar mais sobre isso e dá pra viajar bastante hehe... Pensa assim, se o aluno não pode mudar a própria nota, talvez essa nota não seja dele e sim de um currículo acadêmico que ele só pode consultar, mas que o professor pode alterar. Como programador, é você quem determina se a Classe X pode mudar o atributo da Classe Y e o encapsulamento é uma forma de dizer a outros programadores e a você mesmo "Quem está de fora não pode mexer aqui", mas ele não impede que seja feito e funciona mais como um alerta para pessoas desenvolvedoras.