Dúvida quanto a "package"

Boa noite.

Na verdade nem tenho certeza se seria package.

Eu estou seguindo uma série de exercícios de um livro. Chamados Labs.

Para cada Lab eu criei uma pasta no C.

Estou fazendo o Lab 06. Nesse sabe ele, usa classes desenvolvidas no Lab 05.

Eu poderia criar essa nova classe na pasta do Lab 05 e estaria resolvido.

Mas eu acredito que exista uma maneira de dizer pro Notepad++ que as classes que eu estou usando estão em outra pasta.

Isso é possível?

Posso fazer a Main Class que está na pasta Lab 06 usar classes que estão na pasta Lab 05?

Obrigado!

Obs: Uso Notepad++ e quando crio um arquivo não é solicitado o packge (como ocorre no IntelliJ por exemplo). Então eu estou organizando meus arquivos dessa maneira. Cada classe que eu crio eu dou um nome e coloco .java na extensão.

vc pode importar, por exemplo:

import br.com.guj.app.usuarios;

usuarios seria a pasta q vc quer importar.

1 curtida

br.com sempre existe? Ou é só exemplo?

É um exemplo.
A convenção de código Java recomenda que nomes de pacotes comecem com o domínio de quem desenvolveu sem o www e escrito ao contrário.
Por exemplo, se o domínio de quem desenvolveu for www.exemplo.com.br os pacotes terão o prefixo br.com.exemplo

2 curtidas

No meu caso o arquivo Main.java está n esse caminho: C:\Note++\Projetos\Dia06_Lab02

E as outras classes que pretendo usar estão nesse caminho: C:\Note++\Projetos\Dia05_Lab03

Estou achando estranho porque eu não defini nenhum domínio na hora de criar as classes. O notepad++ só pede pra salvar em algum diretório.

Aí quando o main tenta usar alguma classe que está no outro diretório dá erro de tipo não encontrado.

Tentei fazer algo assim:

import C:\Note++\Projetos\Dia05_Lab03.*; //Gerou erro dizendo que “.” é esperado depois do C

import C.Note++.Projetos.Dia05_Lab03.*; //Geraou erro dizendo que “;” é esperado

Cara, vamos lá. Deixa eu tentar explicar, pois eu entendo que você está com muita dificuldade.
As primeiras classes java que desenvolvemos quase nunca apresentam a definição do pacote. São classes simples, direcionadas a execução de uma única tarefa. Correto?
Assim sendo, é comum criarmos classes assim:

publc class Bla {
    public static void main(String[] args) {
        //Faz algo aqui
    }
}

Porém, quando começamos a trabalhar com mais classes e, principalmente, precisamos interagir com mais de uma delas, temos a opção de aglomerar tudo num só diretório e fazer funcionar ou seguir uma boa prática e separá-las por funcionalidade ou afinidade.
Aí é que entra o package (pacote).

Veja a diferença para a classe anterior:

package br.com.teste;

publc class Bla {
    public static void main(String[] args) {
        //Faz algo aqui
    }
}

Agora suponha que dentro do main eu quero uma instância da seguinte classe:

package br.com.teste.processors;

public class Processor {
    public void execute(){
        //Faz algo
    }
}

Eu não posso, simplesmente, pegar e fazer isso:

package br.com.teste;

publc class Bla {
    public static void main(String[] args) {
        Processor proc = new Processor(); //Erro: classe Processor não está no mesmo package
    }
}

Como resolvo isso? Simples, usando import:

package br.com.teste;

import br.com.teste.processors.Processor;

publc class Bla {
    public static void main(String[] args) {
        //Faz algo aqui
    }
}

Mas, e o que isso tem a ver som o sistema de arquivos (file system) de um sistema operacional qualquer?
Se você usa uma IDE, absolutamente nada! (Se não usa, tem umas peculiaridades, mas, na prática, é como se não se considerasse isso).
Assim sendo, não importa se você salvou o que você fez em C:\blablabla\etcetcetc, afinal, o que vai valer é se a classe está naquele mesmo package ou se você importou o package adequado.

Existe outro porém: você só pode referenciar packages que estejam dentro do mesmo projeto.
Mas, então, como eu faço para aproveitar um projeto de terceiro ou meu, mas que não é esse mesmo?
Simples: quando você cria um projeto, ele pode ser exportado de N formas. Uma delas é como um jar não executável (se não sabe o que é um jar, pesquise!). Ele contém várias classes que servem como auxiliares.
Para nossa situação, esse jar deve, obrigatoriamente, ser importado para o projeto. Ou seja, incluído em seu classpath. Uma vez que isso seja feito, você já pode referenciar a(s) classe(s) desse projeto nas classes do teu.

3 curtidas

Nossa entendi.

É exatamente o que você disse. Até pouco tempo atrás eu estava estudando através de exercícios pontuais. E eu salvava as classes do modo que eu achava conveniente pra abrir depois.

Agora eu estou seguindo um estudo mais estruturado, que possui uma certa sequência. Então algumas classes começam a interagir com classes que eu criei antes.

Se achar que precisa de algo mais reforçado, procure pelo canal da Loiane no youtube. Tem um curso completo de java básico lá.

1 curtida

Boa noite.

Eu criei dois diretórios no C

projects\study\Lab03 e

projects\study\Lab05

Criei duas classes e chamei de classe01 e classe02.

coloquei na classe01:

package projects.study.Lab03;

E coloquei na classe02:

package projects.study.Lab05;

Aí na classe02 eu instanciei um objeto da classe01. E mandei executar o método executa() que eu criei (apenas escreve “teste” na tela).

Eu tentei rodar sem fazer o import. E deu erro dizendo que a classe01 não foi encontrada. Blz.

Aí eu adicionei na classe02:

import projects.study.Lab03.classe01;

Aí deu erro dizendo que o package não existe.

Eu li a documentação oficial da Oracle sobre package.

Agora entendi o que faltava. o CLASSPATH.

Entendi como funciona a estrutura e como a JVM trata os packages.

Obrigado pelas dicas!