#java #methods #private-methods
#java #методы #частные методы
Вопрос:
Мне дан класс, у которого есть частный метод, скажем, setCoors (int x, int y). В конструкторе этого класса также есть setCoors . В другом классе я хочу иметь метод setLocation, который вызывает setCoors. Возможно ли это?
Новый вопрос:
Возможно ли это, если мне не разрешено устанавливать для метода значение public?
public class Coordinate{
public Coordinate(int a, int b){
setCoors(a,b)
}
private void setCoords(int x, int y)
}
public class Location{
private Coordinate loc;
public void setLocation(int a, int b)
loc = new Coordinate(a,b)
}
Комментарии:
1. @RayToal — вы делаете какие-то большие предположения. Учитывая, что он не понимает всего общего и частного, я сомневаюсь, что его класс еще не дошел до рефлексии. Конечно, это тоже предположение … просто немного меньший, учитывая, что он заявляет, что конструктор вызывает частный метод … 😉
2. @Brian Я согласен, что да, ответ «нет» более полезен, потому что вы правы, вопрос исходит из начального контекста Java. Я не против оставить ответ на месте для других посетителей страницы, но если есть консенсус в отношении того, что он не принадлежит, я могу отозвать его. Тем не менее, я не могу решить, является ли лучшим ответом квалифицированное «нет»; что-то вроде «ну, нет, ты не можешь, но веееееллллллл, есть действительно сложная задняя дверь, которая позволяет вам это сделать, но никто этого не делает, кроме этих злых хакеров, и вы можете узнать об этом позже …» Или, может быть, нет. 🙂
Ответ №1:
Лучший и наиболее полезный ответ зависит от контекста вопроса, который, я полагаю, не совсем очевиден.
Если вопрос был вопросом новичка о предполагаемом значении private, то ответ «нет» вполне уместен. То есть:
- частные члены A доступны только внутри класса A
- пакет-частные члены A доступны только внутри классов в пакете A
- защищенные члены A доступны только внутри классов в пакете A и подклассов A
- общедоступные члены A доступны везде, где A виден.
Теперь, если, и хорошо, может быть, это натяжка (спасибо, Брайан :)), что вопрос возник из более «продвинутого» контекста, где рассматривается вопрос «Я знаю, что private означает private, но есть ли языковая лазейка», тогда, ну, есть такаялазейка. Это выглядит так:
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
class C {
private int x = 10;
private void hello() {System.out.println("Well hello there");}
}
public class PrivateAccessDemo {
public static void main(String[] args) throws Exception {
C c = new C();
List<Field> fields = Arrays.asList(C.class.getDeclaredFields());
for (Field f: fields) {
f.setAccessible(true);
System.out.println(f.getName() " = " f.get(c));
}
List<Method> methods = Arrays.asList(C.class.getDeclaredMethods());
for (Method m: methods) {
m.setAccessible(true);
m.invoke(c);
}
}
}
Вывод:
x = 10
Well hello there
Конечно, это действительно не то, что когда-либо делали прикладные программисты. Но тот факт, что такую вещь можно сделать, стоит знать, а не то, что следует игнорировать. В любом случае, ИМХО.
Комментарии:
1. Серьезно, вы собираетесь «помочь» студенту, который не понимает public vs. private с отражением?
2. ха-ха, слишком смешно. Рэй прав, но я думаю, что Брайан еще более прав. 😉 «Нет» — гораздо лучший ответ. 🙂
3. На самом деле из вопроса невозможно определить, что учащийся не понимает public по сравнению с private. Это могло быть исследовательским вопросом в продвинутом классе. Но ваш вопрос справедлив. Я уточню ответ, спасибо.
Ответ №2:
Нет, private
означает, что метод может быть вызван только внутри класса, в котором он определен. Вероятно, вы захотите setLocation
создать новый экземпляр класса setCoords
, в котором он находится, или изменить видимость setCoords
.
РЕДАКТИРОВАТЬ: опубликованный вами код будет работать. Просто имейте в виду, что любой экземпляр Location
класса будет привязан к своему собственному Coordinate
объекту. Если вы создадите новый Coordinate
объект где-то еще в своем коде, вы не сможете изменить его внутреннее состояние. Другими словами, строка
Coordinate myCoord = new Coordinate(4, 5);
создаст объект myCoord
, который навсегда будет иметь координаты 4
и 5
.
Комментарии:
1. Итак, если мне не разрешено делать setCoords общедоступными. затем в setLocation мне сделать что-то вроде этого: setLocation(int a, int b) { координаты = новая координата (a,b)? предполагая, что setCoords в классе координат
2. Да, предполагая, что это то, что вы хотите. Не видя дизайна класса, трудно сказать, правильный ли это подход к проблеме.
Ответ №3:
private
означает, что он частный
Если вы хотите, чтобы другие классы вызывали его, может быть, вам не следует делать его закрытым?
Комментарии:
1. Как сказал @Dan в своем ответе на мой ответ, он не может изменить видимость
setCoords
метода.2. Неверно. К нему можно получить доступ с помощью отражения. Он не спрашивал, должен ли он, он спросил, может ли он. Теперь я полностью согласен с тем, что вы должны сказать ему, что он не должен, но это не меняет того факта, что правильный ответ «Да, но …»
Ответ №4:
Никакие private
методы не могут быть доступны за пределами класса, в котором они определены
Ответ №5:
Домашнее задание для детей: ответ отрицательный. Парень, требующий сумасшедшей работы для своей работы: ответ — да. Что еще более важно, ваш setCoors
метод не должен принимать аргументы int. Он должен принимать два SilverBullet
объекта.
Ответ №6:
private
означает, что вы можете получить к нему доступ только внутри определенного класса.