Pergunta

Digamos que temos uma aula foo que tem uma variável de instância privada bar.

Agora vamos ter outra aula, baz, qual extends foo.Os métodos não estáticos podem baz acesso foovariável bar se não houver nenhum método acessador definido em foo?

A propósito, estou trabalhando em Java.

Foi útil?

Solução

Não, não de acordo com o Especificação de idiomas Java, 3ª edição:

6.6.8 Exemplo: Campos, métodos e construtores privados

Um membro ou construtor de classe privada é acessível apenas no corpo da classe de nível superior (§7.6) que envolve a declaração do membro ou construtor. Não é herdado por subclasses.

Mas independentemente dessa restrição de linguagem, você posso Acesse campos privados através da reflexão:

Field privateStringField = 
   MyClass.class.getDeclaredField("privateString");
privateStringField.setAccessible(true);

String fieldValue = (String) privateStringField.get(privateObject);
System.out.println("fieldValue = " + fieldValue);

Outras dicas

Não, para isso você deve usar protected.

Para dúvidas como essa, onde se encontra uma tabela no site aqui: http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html

Basicamente, você deseja que variáveis ​​públicas ou protegidas sejam declaradas em foo, pois essas são as variáveis ​​que as subclasses herdam de seus pais e, portanto, vistas em baz.

As aulas de crianças não podem acessar membros privados (que é o ponto principal do controle de acesso privado).

... Se não houver método de acessório definido no Foo?

Você precisa de acessores. Além disso, cuide da herança, esse VAR realmente deveria estar no pai? Lembre-se IS-A cheque ..

Você não pode acessar variáveis ​​privadas em classes descendentes.Normalmente você gostaria de usar o acesso de nível "protegido" ou "pacote" (o padrão) para isso.No entanto, se você quiser ser realmente complicado, você pode recorrer ao uso de reflexão e Objeto acessível para chegar lá.Eu não recomendaria fazer isso para código de produção, a menos que você esteja realmente em apuros;para testes, etc., tudo bem.

Para usar uma variável privada de uma super classe em uma sub -classe, é necessário um método de acessório. Caso contrário, use o modificador protegido em vez de privado.

As variáveis ​​privadas de uma classe invariavelmente têm um escopo dentro dessa classe.Caso tenha que ser compartilhado entre as subclasses, deverá ser declarado "protegido"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top