2016-04-06 3 views
-6

Итак, я исхожу из C++, и из того, что я могу сказать, оператор Java import ...; очень похож на наш оператор #include <...>.Значение Java «Import» Statement

Однако, в то время как #include использует каталоги файлов в виде «D: \ Вставить \ Directory \ Name \ Здесь», смысл за «com.example.something.here», используемый в import путает мне.

Вопросы:

  1. Может кто-то пожалуйста, объясните мне (с точки зрения непрофессионала), что на самом деле означает этот странный синтаксис обратного URL и
  2. Предоставлять пример того, как я мог бы использовать это заявление доступ к ресурсам из других файлов?
+5

Это своего рода широкая тема для сайта Q & A. Это основная концепция, которую вы изучаете при изучении языка. Например. из учебников Java: https://docs.oracle.com/javase/tutorial/java/package/usepkgs.html. Было бы хорошо, если бы вы сделали некоторые фундаментальные исследования и вернулись с конкретным вопросом. –

ответ

1

Оператор import в Java и директива #include в C++ выглядят обманчиво похожими, но на самом деле очень разные. Оператор import фактически не вызывает чтение файла Java (что выполняется как с помощью компиляции, так и с помощью пути к классам, то есть параметров, заданных для компилятора Java в командной строке); скорее, оператор import - это просто синтаксический сахар, используемый для того, чтобы избежать использования полнофункциональных имен во всем коде (в противном случае для любого класса, не входящего в текущий пакет, требуется полное имя). В отличие от этого, #include не только загружает файл, но делает это слепой подстановкой, независимо от того, был ли этот файл уже включен или нет (что является причиной того, что заголовки обычно включают #ifndef ... #endif, включают защитные устройства, чтобы предотвратить содержимое заголовка из обрабатывается многократно, несмотря на то, что его содержимое многократно наклеивается).

Обозначение обратного URL, используемое в пакетах Java, - это соглашение, используемое для избежания столкновений между библиотеками разных авторов. Мысль здесь состоит в том, что для предотвращения коллизий имен между поставщиками/авторами вам потребуется некоторая централизованная регистрация; используя существующую систему регистрации доменных имен, позволяет Java разгрузить это предотвращение столкновения существующей системе, а не изобретать колесо. Однако это чисто конвенция.Не обязательно, чтобы пакет коррелировал с доменом; например, система впрыска зависимостей кинжалов использует package dagger, а не package io.github.google.dagger (хотя последнее - это имя пакета, которое будет использоваться, если следовать стандартным соглашениям об использовании обратного домена).

Обратите внимание: как на C++, так и на Java, использование абсолютных путей, по сути, считается плохой практикой. То есть, на C++, если вы делали #include "D:\Insert\Directory\Name\Here" ... это, по сути, не хорошая инженерная практика. В C++ лучше сделать #include "relative/path/to/headerfile.h" и указать через командную строку компилятора, что "D:\Path\To\Directory" является одним из корневых каталогов, в которых начинается поиск. То же самое относится к Java. То есть, в общем, пути относятся к различным корням вашего репозитория, а вызовы компилятора указывают расположение этих каталогов репозитория. Это гарантирует, что код является самодостаточным и герметичным, ссылаясь только на другой код в репозитории/проекте (а не на произвольный код/​​пути, которые находятся в системе). В Java этот механизм поиска называется «classpath»; в C++ это очень специфичный для компилятора, но с компилятором GNU C++ флаги -I и -L позволяют указать путь к каталогам include и каталогам lib, которые используются для определения заголовков и библиотек для ссылок.

3

«Синтаксис обратной URL-адреса» - это соглашение Java о том, как должны быть организованы структуры пакетов; цель состоит в том, что пакеты Java являются полу-универсальными, и идея состоит в том, что если каждая организация кодирует пакет, соответствующий веб-сайту этой организации, тогда не будет конфликтов пространства имен.

Вообще говоря, в отличие от C++, import в Java никогда не требуется. Вы могли бы написать весь файл Java, такой как

class MyList extends java.util.AbstractList<MyClass> { 
    public void forEach(java.util.function.Consumer<? super MyClass> consumer) { 
    ... 
    } 
} 

просто явно квалифицируя все. Но это практически нечитаемо, поэтому каждый импортирует классы, которые они хотят ссылаться, и ссылается на них по их неквалифицированному имени (например, AbstractList и Consumer в этом примере).

1

com.example.something.here в java означает, что вы используете какой-либо java-класс в com/example/something/here, где каждый каталог рассматривается как пакет ..... Используется для использования кода некоторого java класс присутствует в com/example/something/here