Esse assunto tem muito a ver com a organização do projeto. Primeiro, imagine que duas classes estão no mesmo pacote, naturalmente elas se conhecem e se enxergam, podendo assim se acessarem.
Exemplo:
Temos dois arquivos Java: o primeiro chamado ClassOne e o segundo ClassTwo.
class ClassOne {
String attributeOne;
String attributeTwo;
String attributeThree;
//..
}
package com.meuprojeto.model;
class ClassTwo {
String attributeOne;
String attributeTwo;
ClassOne classOne;
//..
}
Essas classes estão no pacote model e por isso não há erro de compilação até aqui. Mas imagine um projeto com alguns pacotes, como o da imagem abaixo, o que fazer?
O primeiro passo é tornar as classes públicas, adicionando a palavra reservada "public" antes de class.
Fica assim:
package com.myproject.util;
String attributeOne;
String attributeTwo;
String attributeThree;
//..
}
O segundo é importar a classe referenciada, exemplo:
package com.myproject.model;
import com.meuprojeto.util.ClassOne; //O import está aqui
public class ClassTwo {
String attributeOne;
String attributeTwo;
ClassOne classOne;
//..
}
Pronto, referência feita.
A seguir algumas curiosidades:
Dá pra importar duas classes com o mesmo nome?
Sim, é possível. Porém, contudo, todavia é necessário que uma seja referenciada por seu Full Qualified Name, exemplo:
package com.myproject.util;
import java.util.Date;
String attributeOne;
String attributeTwo;
String attributeThree;
Date data1;
java.sql.Date data2; //Essa foi referenciada pelo Full Qualified Name
//..
}
Também é possível importar todas as classes de um pacote:
import java.util.*;
Caso haja um import genérico (como o acima) e um específico como o abaixo, o Java sempre utiliza o import específico.
import java.util.Date;
Os pacotes são usados pela JVM para encontrar as classes do sistema dentro de uma estrutura de diretórios. Ao criar o pacote com.myproject.util a estrutura de diretórios deve ser myproject/com/myproject/util. Pode-se falar que myproject e util são subpacotes de com/.
Existem algumas convenções para criar nomes de pacotes. Convenções não são obrigatórias, mas são consideradas boas práticas pois tem a intenção de facilitar o entendimento e organização dos projetos. São elas:
- letras minúsculas;
- começar com o site da empresa;
- após o site deve vir o nome do projeto;
- estrutura livre após o projeto;
Já vimos que é possível importar todas as classes de um pacote e duas classes de pacotes diferentes mas com o mesmo nome. Mas e se fizermos dois importes com * e nesses pacotes existirem classes com o mesmo nome?
Devemos usar o Full Qualified Name para especificar qual classe será usada no código.
Ponto importante: em Java não podemos importar o subpacote inteiro usando *. Ou seja, não é possível fazer isso:
import com.myproject.*;
é necessário importar todas os pacotes:
import com.myproject.util;
import com.myproject.model;
import com.myproject.service;
Também é impossível importar atributos e métodos estáticos com a palavra reservada static e o import. Exemplo:
package com.meuprojeto.util;
class ClassOne {
String attributeOne;
String attributeTwo;
String attributeThree;
public static int X = 10;
//..
}
package com.meuprojeto.model;
import com.myproject.util.*;
class ClassTwo {
String attributeOne;
String attributeTwo;
System.out.println(X);
//..
}
Comentários
Postar um comentário