Как использовать частный метод в Java
Мне дан класс, который имеет частный метод say 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)
}
6 ответов:
Нет,
private
означает, что метод может быть вызван только внутри класса, в котором он определен. Вероятно, вы захотите, чтобыsetLocation
создал новый экземпляр классаsetCoords
, в котором он находится, или изменил видимость наsetCoords
.Редактировать: код, который вы разместили, будет работать. Просто имейте в виду, что любой экземпляр класса
Location
будет привязан к своему собственному объектуCoordinate
. Если вы создадите новый объектCoordinate
в другом месте кода, Вы не сможете изменить его внутреннее состояние. В другими словами, строкаCoordinate myCoord = new Coordinate(4, 5);
Создаст объект
myCoord
, который навсегда будет иметь координаты4
и5
.
private
значит, это частноеЕсли вы хотите, чтобы другие классы называли его, может быть, вам не стоит делать его частным?
Лучший и наиболее полезный ответ зависит от контекста вопроса, который, я полагаю, не совсем очевиден.
Если вопрос был вопросом Новичка о предполагаемом значении частного, то ответ "нет" вполне уместен. То есть:
- закрытые члены доступны только внутри класса
- package-закрытые члены A доступны только внутри классов в пакете A
- защищенные члены A доступны только в классах в пакет и подклассы
- открытые члены доступны везде видна.
Теперь, Если, и хорошо, возможно, это натяжка (спасибо Брайан:)), что вопрос пришел из более "продвинутого" контекста, где мы смотрим на вопрос "я знаю, что частное означает частное, но есть ли языковая лазейка", тогда, ну, есть такая лазейка. Это звучит так:
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
Конечно, это действительно не то, что когда-либо делали прикладные программисты. Но тот факт, что такая вещь может быть сделана, стоит знать, а не то, что следует игнорировать. Во всяком случае, ИМХО.