B. Set the current directory to xcom then invoke
javac -classpath . B.java
[code]
C:\Projetos\foo\test\xcom>javac A.java
C:\Projetos\foo\test\xcom>javac -classpath . B.java
B.java:2: cannot find symbol
symbol: class A
public class B extends A { } →
^
1 error[/code]
Veja que o classpath foi setado para xcom, sendo assim a procura será feita por uma classe que tenha a entrada seguinte:
xcom.A, ou seja dentro de xcom, não tem um pacote xcom, o que você tem que entender é que existe uma declaração package, e sendo assim a entrada para o classpath teria que ser xcom.A, o compilador está procurando o pacote xcom dentro de xcom, o qual tem um A!, ele pensa assim:
Estou dentro de xcom e encontrei um ".", vou procurar o que é preciso para compilar, preciso de uma classe chamada "xcom.A", vou começar entrando dentro de um pacote chamado "xcom", opa não existe nenhum pacote chamado xcom!, vou lançar uma exeção. dizendo que não consegui encontrar o simbolo "A", pois não existe esse caminho!
A mesma coisa está acontecendo nas outras alternativas!
Agora o teste que você fez é diferente, você não colocou um package na declaração da classe, e ae pediu para procurar com classpath local, ae deu certo, veja que são situações distintas.
Eu estou com o livro em “Português”, não sei qual será a página, se você está usando em “Inglês”, que é melhor lógico…heheh
Tem um subtítulo no meu livro na página 446 “Declarando e Usando Classpaths”, depois logo abaixo tem “Observação para o exame” e mais abaixo tem o seguinte trecho:
-classpath /com/foo/acc:/com/foo:.
Esse classpath é idêntico ao anterior, EXCETO pelo fato de que o ponto (.) ao final da declaração instrui java ou javac a procurar por arquivos de classe também no diretóriio atual.(Lembre-se de que estamos falando de arquivos de classes - quando você está dizendo a javac qual arquivo.java compilar, javac procura no diretório atual por padrão.)
Se você verificar a afirmação acima, é justamente seu caso, apesar de sua classe estar em um “package”, você navegou até o pacote em que ela está,
e executou javac, o mesmo incluiu o arquivo em (.), e foi compilado. São detales especialmente “diabólicos” como diz o livro.
No caso citado por você, está compilando um arquivo, o qual usa outra classe,
veja:
package xcom;
public class B extends A { }
e ai está usando o classpath para a procura das classes necessárias para compilar o arquivo, ou seja a classe A!. A diferença, é que em um caso você colocou sua classe em um pacote, e está apenas compilando o arquivo.java, a partir do diretório corrente.