Как использовать приватный метод в Java - PullRequest
4 голосов
/ 08 октября 2011

Мне дан класс, у которого есть закрытый метод, скажем 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 ]

6 голосов
/ 08 октября 2011

Лучший и самый полезный ответ зависит от контекста вопроса, который, я считаю, не совсем очевиден.

Если вопрос был начинающим вопросом о предназначенном значении частного, то ответ «нет» является полностью уместным. То есть:

  • частные члены A доступны только в классе A
  • закрытые для пакета члены A доступны только внутри классов в пакете A
  • защищенные члены A доступны только внутри классов в пакете A и подклассов 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

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

4 голосов
/ 08 октября 2011

Нет, private означает, что метод может быть вызван только внутри класса, в котором он определен. Возможно, вы захотите, чтобы setLocation создал новый экземпляр класса setCoords, в котором он находится, или изменил видимость на setCoords.

РЕДАКТИРОВАТЬ: Код, который вы опубликовали, будет работать. Просто помните, что любой экземпляр класса Location будет связан со своим собственным объектом Coordinate. Если вы создадите новый объект Coordinate где-то еще в вашем коде, вы не сможете изменить его внутреннее состояние. Другими словами, строка

Coordinate myCoord = new Coordinate(4, 5);

создаст объект myCoord, который навсегда будет иметь координаты 4 и 5.

4 голосов
/ 08 октября 2011

private означает, что это личное

Если вы хотите, чтобы другие классы вызывали его, возможно, вам не следует делать его закрытым?

3 голосов
/ 08 октября 2011

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

2 голосов
/ 08 октября 2011

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

1 голос
/ 08 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...