Доступ в Java
Напишите класс Gate в Gate.java с полем private int по имени code, конструктором Gate(int n), который делает code = n;, и методом void show(), который печатает code. В Pier.java постройте один gate через Gate g = new Gate(9);, затем вызовите g.show();. Скомпилируйте оба файла и запустите java Pier. Экран должен показать одну строку: 9. Поле скрыто от Pier. Метод на Gate всё ещё может его читать. Слово private на поле — то, чему учит эта страница.
Поле, которое Pier не должен называть напрямую
До сих пор другие классы в той же папке часто могли дотянуться до полей вроде j.fill или t.size, когда у этих полей не было слова доступа. Слово private это меняет. Поле private принадлежит классу, который его объявил. Методы внутри того же класса могут использовать поле. Другой класс — здесь Pier — не должен писать g.code.
Сначала создайте Gate.java. Строка public class — public class Gate. Не оставляйте здесь старое имя класса Tag или Jar. Внутри фигурных скобок объявите private int code;. Напишите конструктор Gate(int n) { code = n; } с разными именами, чтобы этой странице не нужен был this. Затем напишите:
void show() { System.out.println(code); }
В Gate.java нет main. Сохраните перед компиляцией. Метод show сидит в том же классе, что и code, поэтому он может читать private-поле. Это разрешённый путь на этой странице.
public class Gate {
private int code;
Gate(int n) {
code = n;
}
void show() {
System.out.println(code);
}
}
Pier вызывает show, а не g.code
Создайте Pier.java в той же папке. Его строка public class — public class Pier. Внутри main напишите Gate g = new Gate(9);, затем g.show();. На этой странице не пишите System.out.println(g.code);. Если вы попробуете g.code из Pier, пока code — private, javac откажет.
Держите Pier как класс, в котором есть main. Не кладите main внутрь Gate для этого урока. Если в папке ещё лежит оставшийся файл Yard со страницы static, не запускайте для этого урока java Yard — после компиляции Gate.java и Pier.java выполните java Pier.
public class Pier {
public static void main(String[] args) {
Gate g = new Gate(9);
g.show();
}
}
Из папки, где лежат оба файла, выполните javac Gate.java Pier.java. Вы можете сначала скомпилировать Gate.java, затем Pier.java, когда оба готовы. Когда скобки, фигурные скобки и точки с запятой совпадают, javac не пишет своей строки. Затем запустите java Pier — не java Pier.java и не java Gate. Уберите окончание .java из команды запуска. Запускайте класс, в котором есть main. Те же команды работают в Windows и в macOS.
Программа должна напечатать одну строку и остановиться: 9. Она не просит вас вводить текст. Если терминал ждёт ввода с клавиатуры, в каком-то файле ещё остался вызов nextLine из старого упражнения. Удалите этот вызов и оставьте в Pier new Gate(9) плюс g.show();, а в Gate — private int code.
Пройдите запуск один раз. Java начинает с Pier.main. Выражение new Gate(9) строит gate и в конструкторе кладёт 9 в code. Вызов g.show() входит в show на том же объекте. Внутри Gate метод show может читать code и печатает 9. Pier никогда не называл поле. Экран показывает 9.
Если в Pier вместо g.show(); вы напишете System.out.println(g.code);, javac остановится с ошибкой доступа, пока code — private. Этот отказ — смысл этой страницы. Верните g.show();.
Сравнение со static и с открытыми полями
На странице static вы вызывали Tag.ping(); без поля объекта, которое нужно было скрывать. То по-прежнему работает. Эта страница скрывает поле и открывает метод. Оставшееся демо Tag.ping(); — другой урок. Для этой страницы держите Gate, Pier и g.show();.
Более ранние страницы часто оставляли поля без private, поэтому j.fill из другого класса компилировался. Эта более свободная форма всё ещё встречается в маленьких демо. Этот урок намеренно выбирает private, чтобы вы увидели границу. Печать самого g через System.out.println(g); не показывает чистое 9. Вызовите g.show(); или печатайте через метод, который класс разрешает.
Два gate, два code
Каждый new Gate(...) хранит свой собственный private code. Вы можете написать Gate a = new Gate(2); и Gate b = new Gate(8);, затем вызвать a.show(); и b.show();.
public class Pier {
public static void main(String[] args) {
Gate a = new Gate(2);
Gate b = new Gate(8);
a.show();
b.show();
}
}
Скомпилируйте и запустите снова: javac Gate.java Pier.java, затем java Pier. Экран должен показать 2 в одной строке и 8 в следующей. Каждый вызов show шёл на своём объекте и читал private-поле того объекта. Запись Gate b = a; не строит второй объект — используйте два вызова new Gate(...), когда хотите два code.
Если обе строки показывают одно и то же число, проверьте, что каждый new передаёт другой аргумент. Если javac жалуется на code внутри Pier, у вас ещё есть прямая строка g.code — уберите её и держите show.
Что остаётся для packages
Эта страница держит оба файла в одной папке с раскладкой пакета по умолчанию. Более поздняя страница — packages — кладёт классы в именованные папки со строками package. Здесь оставайтесь с private и show. Не изобретайте на этой странице полную таблицу public/protected; цель урока — одно private-поле и один метод, который всё ещё может его читать.
Если javac не находит Gate при компиляции Pier.java, проверьте, что Gate.java лежит в той же папке и что строка класса — public class Gate. Когда в папке ещё лежат Tag.java или Yard.java, не трогайте их или удалите только если они путают команду компиляции. После компиляции пары Gate и Pier с этого урока запустите java Pier.
Перед packages
Вы можете объявить private int code;, написать Gate(int n) { code = n; } и void show() { System.out.println(code); }, и из Pier выполнить Gate g = new Gate(9);, затем g.show();. Скомпилируйте оба файла и запустите java Pier. Экран показывает 9. Private-поле осталось внутри Gate. Метод того же класса его напечатал. Следующая страница — packages, где вы размещаете классы в именованных папках пакетов.
Держите private на поле. Держите печать внутри show, а не как g.code из Pier. Держите main в Pier. Эти три привычки — контрольная точка этой страницы перед тем, как идти дальше. Когда экран показывает 9 через show, вы пересекли границу доступа так, как задумал этот урок.
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху