Как использовать частный метод в 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 4

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

Конечно, это действительно не то, что когда-либо делали прикладные программисты. Но тот факт, что такая вещь может быть сделана, стоит знать, а не то, что следует игнорировать. Во всяком случае, ИМХО.

Нет private методы не могут быть доступны вне класса, в котором они определены

Ребенок-делает-домашнее задание: Ответ-нет. Парень-требующий-немного-сумасшедшей-работы-вокруг-своей-работы: ответ-да. Однако гораздо важнее то, что ваш метод setCoors не должен принимать аргументы int. Он должен принимать два объекта SilverBullet.

private это означает, что вы можете получить к нему доступ только внутри определенного класса.