Почему ключевое слово "пакет" и .h? - PullRequest
10 голосов
/ 03 августа 2010

1) Почему в файлах, которые находятся в Java-пакете, я должен написать «пакет» в нем?* 2) Я родом из мира C ++.Я всегда импортировал .h классов, которые мне нужны, из других файлов, которые используют этот класс (я имею в виду, я хочу только «показать» заголовок, а не реализацию).Но теперь я немного озадачен импортом в Java.Как это делается в Java?

Спасибо

Ответы [ 4 ]

7 голосов
/ 03 августа 2010
  1. Нет, это не предполагается.В конце концов, как называется моя посылка?com.mypackage.stuff?src.com.mypackage.stuff?myproject.com.mypackage.stuff?C.Users.makakko.workspace.myproject.src.com.mypackage.stuff?

    Если вы основываете пакет только на папках, это относительно корня диска?Что если проект разрабатывается на другой машине с другой буквой?Это относительно местоположения javac.exe?Опять же, как насчет разных каталогов установки?Как насчет рабочего каталога при запуске javac?Но вы можете указать местоположение для javac для поиска ваших исходных файлов. Что делать, если вы хотите сделать простую тестовую программу или научить кого-то Java, который никогда ранее не программировал;Вам нужно использовать / объяснить всю концепцию структуры пакета?

    Если вы опустите спецификатор package, значит, вы все еще в пакете.Это просто «пакет по умолчанию», который не имеет имени.

  2. Заголовочные файлы - это скорее артефакт, связанный с необходимостью компиляции C, чем способ сокрытия информации.В Си метод должен быть определен прежде, чем на него можно будет ссылаться.Если вы хотите иметь несколько методов, которые ссылаются друг на друга, вы должны определить все из них перед использованием любого из них, отсюда и заголовок.Заголовки в C ++ переносятся из этого, но изменения в C ++ изменяют необходимость заголовков.

    В Java компилятор будет проверять все ваши сигнатуры методов и классов, прежде чем делать что-либо, требующее метода / класса.Функция, обслуживаемая заголовками, помещается в сам компилятор.Вы не можете зависеть от заголовка для скрытия вашей информации, потому что

    1. Код может быть помещен в файл заголовка

    2. Если вы не используете реальныйскрывая информацию, такую ​​как отдельная библиотека, программист может найти файл c / cpp, который соответствует заголовку без проблем

    Аналогично в Java вы можете получить реальную сокрытие информации, только удаливисточник.Как только вы сделали исходный код недоступным, вы предоставляете API с открытыми / защищенными классами, перечислениями и интерфейсами.Чтобы получить бонусные баллы, напишите объяснительные комментарии JavaDoc для всего и запустите javadoc.exe над своим источником, чтобы создать отдельную документацию для всех, кто будет использовать ваши пакеты.

5 голосов
/ 03 августа 2010

1) Объявление package должно соответствовать иерархии каталогов в проекте.

Если я использую package com.stackoverflow.bakkal; в Car.java, то ожидается следующая иерархия.

com/
|-- stackoverflow/
|   `-- bakkal/
|       |-- Car.java

2) Если вы хотите скрыть реализацию, вы можете использовать interface в Java вместо class. Затем распространите фактические реализации в .class файлах или JAR, например.

Ммм, но интерфейс не может быть экземпляр ...

Интерфейс в некоторой степени работает как прототип в C ++. У вас есть контракт, тогда фактическая реализация приходит откуда-то еще.

Я хочу создать экземпляр класса, но не давая реализацию, только прототип

Это невозможно даже в C ++, как вы можете создать экземпляр чего-либо, не имея его фактической реализации? В C ++ вам все равно нужно ссылаться на объектные файлы. В Java вы используете .class файлы.

3 голосов
/ 03 августа 2010

Пакеты не предполагаются, потому что философия Java заключается в том, что лучше быть явным, чем неявным / предполагаемым.

Это дает вам возможность получить доступ ко всему в вашем текущем пакете, но все, что находится за пределами, должно быть явно импортировано. (Я считаю, что Java.lang является исключением, поскольку он содержит так много базовых функций, как String, что не было бы ни одного пакета, который бы его не использовал).

Вот почему вы склонны видеть:

import java.util.ArrayList;
import java.util.LinkedList;

вместо:

import java.util.*;

Это может показаться раздражающим, пока однажды вы не попытаетесь выяснить, что кто-то использует код, и вам не покажется, насколько сложнее это будет, если что-то будет скрыто / подразумевается.

Если вы используете Eclipse, Netbeans или IntelliJ, вы никогда не заметите этого из-за двух функций.

Прежде всего, если вы нажмете Ctrl-пробел в середине ввода имени класса, он не только завершит имя класса для вас, но также автоматически добавит его в список импорта.

Во-вторых, если вы когда-нибудь попадете туда, где импорт "Неверный", или вы не используете расширение ctrl-space, вы можете просто набрать ctrl-shift-o (eclipse), чтобы он "Fix import". Это автоматически импортирует вещи, которые нужно импортировать, и удаляет импорт, который вам больше не нужен. В зависимости от ваших настроек он также будет расширяться или сворачиваться *.

Как только вы отключите систему, вы даже не подумаете об импорте.

1 голос
/ 03 августа 2010

Пакет указывает путь к классу. Он должен совпадать с каталогом на диске или в банке (zip). Расположение относительно расположения на пути к классам. Защищенный доступ ограничен классами в одном пакете.

Некоторые вещи, которые вы можете сделать в файле .h, выполняются в определении класса. Константы принадлежат классу и могут быть публично видны. В .h константы должны быть публично видны.

Импорт эквивалентен включению .h, но помогает решать проблемы противоречивых определений одного и того же имени. Вы можете включить только один элемент или все видимые элементы из класса. Также можно пропустить импорт и использовать имя пакета для добавления префикса к классу, к которому вы обращаетесь.

Реализация на самом деле не видна через импорт (по крайней мере, за исключением того, что обеспечивается скомпилированным классом. То, что видно, это видимые интерфейсы с открытыми методами и данными. Для импорта из тех же методов пакета и данных, для которых не указан доступ (public / protected / private) также видны. Защищенные методы и переменные видны подклассам класса. Файлы .h могут использоваться без предоставления исходных или объектных файлов. Для импорта требуются указанные классы (класс может состоять из только констант, хотя это будет плохой дизайн.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...