Как использовать частный метод в Java

#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 означает, что вы можете получить к нему доступ только внутри определенного класса.