Interfaces

Esta não é uma dúvida, é só uma observação sobre um aspecto da linguagem. Acho que o exame é cheio de "pegadinhas", espero que não sejamos obrigados a conhecer todos os caprichos do compilador:



Os códigos abaixo são equivalentes porque as interfaces são implicitamente públicas:



arquivo: T1.java

interface XYZ {}



arquivo: T1.java

public interface XYZ {}



no entanto, o segundo arquivo gera um erro de compilação dizendo que a classe XYZ é pública e deveria ser declarada no arquivo XYZ.java. E no primeiro caso? a interface também é implicitamente pública, não deveria dar o mesmo erro? estou me preocupando demais com aspectos "curiosos" da linguagem que certamente não caem no exame?

Segundo o livro Thinking In Java, as interfaces não são implicitamente públicas, e sim tem aquele acesso do pacote:



"To create an interface, use the interface keyword instead of the class keyword. Like a class, you can add the public keyword before the interface keyword (but only if that interface is defined in a file of the same name) or leave it off to give package access, so that it is only usable within the same package."



Qual a fonte dessa informação de que elas são publicas?

Acho que você confundiu as interfaces serem públicas com na verdade os membros da interface serem públicos.



"9.1.4 Access to Interface Member Names

All interface members are implicitly public. They are accessible outside the package where the interface is declared if the interface is also declared public or protected, in accordance with the rules of §6.6."



Fonte: Java Language Specification

E neste item 6.6:



A member (class, interface, field, or method) of a reference (class, interface, or array) type or a constructor of a class type is accessible only if the type is accessible and the member or constructor is declared to permit access:

- If the member or constructor is declared public, then access is permitted. All members of interfaces are implicitly public.

- Otherwise, if the member or constructor is declared protected, then access is permitted only when one of the following is true:

* Access to the member or constructor occurs from within the package containing the class in which the protected member or constructor is declared.

* Access is correct as described in §6.6.2.

- Otherwise, if the member or constructor is declared private, then access is permitted if and only if it occurs within the body of the top level class (§7.6) that encloses the declaration of the member.

- Otherwise, we say there is default access, which is permitted only when the access occurs from within the package in which the type is declared.

foi isso mesmo, não lembro onde eu lí, mas certamente dizia que todos os membros da interface são implicitamente públicos, e não a interface em sí. Acho que eu generalizei o negócio, desculpem :slight_smile:

Olá! Acabei de me lembrar onde foi que eu ví que uma interface é somente pública. Eu uso tantas fontes para estudo que nunca sei onde foi que eu lí o quê. No livro "Programmer´s Guide to Java Certification: A Comprehensive Primer (Khalid Azim Mughal and Rolf W. Rasmussen)", no capítulo 7 (Inner Classes), há uma tabela no início do capítulo (pág. 225 Table 7.1) que indica que o modificador de acesso permitido para uma interface é "public only". Na mesma tabela, o modificador de acesso para uma classe é citado como "public or default". É isso mesmo? A tabela é que está errada ou eu é que interpretei errado?

Essa tabela deve ter algum contexto em que essas informações são verdadeiras…

Falando genericamente, não me parece estar correto…

este capítulo do livro está disponível na web no endereço:



http://developer.java.sun.com/developer/Books/certification/certbook.pdf



acho que o contexto é mesmo geral, (top level classes e interfaces)

Na tabela citada, na coluna "declaration context" está especificado no item "interface" -> "as package member os static class member". Se a interface for declarada dentro de uma classe (static class member) ela só pode ser declarada como public e se for omitida a palavra chave public, mesmo assim ela será implicitamente pública. No caso de "package member", trata-se de uma "top level interface" que pode ser declarada como public ou default, portanto, o livro está errado!?

O que está escrito nesta tabela é meio diferente do que está escrito no capítulo de "Interfaces & Inner Classes" do Thinking In Java.

E como no Thinking In Java o autor inclusive dá exemplos de código com interfaces privadas, eu acreditaria mais nele.

Mas para fins de exame, o ideal é você ler o Java Language Specification e tirar suas conclusões a partir de lá, afinal esta é a opinião da Sun sobre como o Java é.

ok! obrigado.