Uma operação de instância pode referir-se a uma variável (atributo) de classe. Entretanto, em um ambiente verdadeiramente orientado a objeto, uma operação de classe não pode, diretamente, referir-se a uma variável (atributo) de instância no interior de um objeto. Por que não? O que seria necessário para que uma operação de classe possa referir-se a um atributo de um objeto?
Seria porque em um ambiente orientado a objeto seria necessario o uso de encapsulamento?
Por “operação de classe” você está se referindo a método estáticos?
Métodos estáticos não fazem exatamente parte do contexto do objeto.
Por isso, se eles acessar o objeto diretamente, é como ter uma entidade externa violando o encapsulamento.
Isso tudo é muito purista, claro. Se você tiver um método fábrica dentro de sua própria classe, não vejo qual seja o grande mau de fazer acesso aos membros privados de seu objeto num método estático.
E
entanglement
gustavo.rotondo:
Uma operação de instância pode referir-se a uma variável (atributo) de classe. Entretanto, em um ambiente verdadeiramente orientado a objeto, uma operação de classe não pode, diretamente, referir-se a uma variável (atributo) de instância no interior de um objeto. Por que não? O que seria necessário para que uma operação de classe possa referir-se a um atributo de um objeto?
Hum… provavelmente quem formulou esta questão está pensando em algo parecido com isto:
classTeste{privateStringatributoDoObjeto;privatestaticStringatributoDaClasse;publicstaticvoidoperacaoDeClasse(){System.out.println(atributoDaClasse);// ele consegue referir-se a um atributo de classe...System.out.println(atributoDoObjeto);// <-- a que objeto ele está se referindo? Aqui vamos até ter um erro de compilação}publicvoidoperacaoDeInstancia(){System.out.println(atributoDaClasse);// ele consegue referir-se a um atributo de classe...System.out.println(atributoDoObjeto);// não há problemas porque o objeto ao qual a operação está se referindo é this}}
Para que uma operação de classe se refira a um atributo de um objeto, é necessário acessar um objeto, é claro:
classTeste{privateStringatributoDoObjeto;privatestaticStringatributoDaClasse;publicstaticvoidoperacaoDeClasse(Testeteste){System.out.println(teste.atributoDoObjeto);// Só assim ele consegue se referir a um atributo de objeto, mas passado explicitamente}}