Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Não entendi a justificativa da resposta

No código abaixo:

a/A.java:

package a;
class A {
    b.B variavel;
}

a/C.java:

package a;
class C {
    b.B variavel;
}

a/b/B.java:

package a.b;
class B {
}

O exercício fornece esta resposta: O arquivo B compila pois é uma classe normal. O arquivo C não compila pois tenta acessar B, que está em outro pacote, mas lembre-se que devemos acessar os pacotes diretamente, não existe subpacote. O mesmo vale para A. Portanto, nem A nem C compilam.

Mas o correto não seria dizer que não compilou pelo fato de a classe B não ser pública?

3 respostas
solução

Bom dia Glauco, tudo bom?

Ambas as justificativas são verdadeiras, tanto a sua quanto a do instrutor. O problema que o instrutor quis lidar é o seguinte:

A classe B está no pacote a.b. Nas classes A e C, o código tenta acessar a classe B do digitando somente parte do pacote (b.B), quando deveria incluir o caminho completo (a.b.B).

Importar o conteúdo do pacote a (import a.b;) também não funcionaria, pelo mesmo motivo: você precisa acessar a classe diretamente (import a.b.B; e então B variavel;) OU utilizar o pacote completo desde a raiz (a.b.B variavel;).

Como você disse, nada disso funciona se a classe B não for pública. Porém só dá erro o de compilação de classe pública a seguir CASO o problema anterior seja resolvido.

error: B is not public in a.b; cannot be accessed from outside package

Dê uma olhada na compilação a seguir:

## sem pacote nenhum
>> javac a/A.java 
./a/A.java:5: error: cannot find symbol
    B attr;
    ^
  symbol:   class B
  location: class A
1 error

## com pacote parcial
>> javac a/A.java 
./a/A.java:5: error: package b does not exist
    b.B attr;
       ^
1 error

## com pacote completo
>> javac a/A.java 
./a/A.java:5: error: B is not public in a.b; cannot be accessed from outside package
    a.b.B attr;
             ^
1 error

Reparou que o compilador trava antes de chegar a conferir se a classe é pública? Isso ocorre pois ele não consegue nem identificar onde está a classe B, pios existe um erro de pacote.

Deu pra entender? Espero que sim!

Qualquer dúvida, não hesite em perguntar!

Bom dia e bons estudos!

Muito obrigado pela resposta Marco, realmente eu não tinha percebido este ponto e agora ficou bem claro, obrigado pela ajuda!

Sempre às ordens, Glauco! Meu objetivo é ajudar com o que eu puder e compartilhar meu conhecimento =)

Um abraço e bons estudos!