Почему ключевое слово “пакета” и.h?

1) Почему в файлах, которые находятся в пакете Java я, shoud пишут вещь "пакета" в нем?, его весьма непосредственно принятый это, если это находится в каталоге, затем в пакете?.

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

Спасибо

10
задан makakko 3 August 2010 в 02:27
поделиться

4 ответа

  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 ++ переносятся из этого, но изменения в C ++ меняют необходимость заголовков.

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

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

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

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

7
ответ дан 3 December 2019 в 21:57
поделиться

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

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

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

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

Ммм, но интерфейс не может быть инстанцирован...

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

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

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

5
ответ дан 3 December 2019 в 21:57
поделиться

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

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

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

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

1
ответ дан 3 December 2019 в 21:57
поделиться

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

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

Вот почему вы обычно видите:

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

вместо:

import java.util.*;

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

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

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

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

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

3
ответ дан 3 December 2019 в 21:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: