Conflitos de nomes
Uma das razões para usar pacotes é para que os nomes de classe não precisem ser exclusivos todos do Java. Isso significa que às vezes você quer importar uma classe que pode ser encontrada em vários lugares. Um exemplo comum disso é a classe Date. Java fornece implementações de java.util.Date e java.sql.Date. Este é outro exemplo em que você não precisa conhecer os nomes dos pacotes para o exame da OCA - eles serão fornecidos a você. O que importar poderemos usar se quisermos a versão java.util.Date?
public class Conflicts {
Date date;
// some more code
}
A resposta deve ser fácil agora. Você pode escrever import java.util.*; ou import java.util.Date;. Os casos complicados ocorrem quando outras importações estão presentes:
import java.util.*;
import java.sql.*; // DOES NOT COMPILE
Quando a classe é encontrada em vários pacotes, o Java fornece o erro do compilador:
The type Date is ambiguous
Em nosso exemplo, a solução é fácil: remova a importação java.sql.Date que precisa. Mas o que faremos se precisarmos de uma pilha inteira de outras classes no pacote java.sql?
import java.util.Date;
import java.sql.*;
Ah, agora funciona. Se você importar explicitamente um nome de classe, ele terá precedência sobre qualquer curingas presentes. Java pensa: “Tudo bem! O programador realmente quer que eu assuma o uso da classe java.util.Date. ”
Mais um exemplo. O que o Java faz com “laços” por precedência?
import java.util.Date;
import java.sql.Date;
Java é inteligente o suficiente para detectar que esse código não é bom. Como programador, você reivindicou explicitamente desejar que o padrão seja tanto o java.util.Date quanto o java.sql.Date. Como não pode haver dois padrões, o compilador informa:
The import java.sql.Date collides with another import statement
Se você realmente precisa usar duas classes com o mesmo nome ...
Às vezes você realmente quer usar Data de dois pacotes diferentes. Quando isso acontece, você pode escolher uma para usar na importação e usar o nome da outra classe totalmente qualificada (o nome do pacote, um ponto e o nome da classe) para especificar que é especial. Por exemplo:
import java.util.Date;
public class Conflicts {
Date date;
java.sql.Date sqlDate;
}
Ou você não pode ter nenhum com uma importação e sempre usar o nome da classe totalmente qualificada:
public class Conflicts {
java.util.Date date;
java.sql.Date sqlDate;
}