где поведение частного и статического методов отличается от поведения только частного метода

Что касается моего понимания:

Когда метод статичен, он

  1. ранняя привязка
  2. может вызывать с именем класса даже до того, как объект не будет создан
  3. может вызывать только статический член внутри него.

Я никогда не обнаружил другого поведения статики ни во время компиляции, ни во время выполнения. Есть ли какие-нибудь?

Когда метод является частным, он

  1. также раннее связывание
  2. может вызывать только внутренний вызов, поэтому может вызывать напрямую без объекта.

Например, метод hugeCapacity() в классе ArrayList.

private static final int DEFAULT_CAPACITY = 10;

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
} 

Поскольку в Java есть приватный + статический метод. Почему возникает их необходимость. Это с целью ограничения, чтобы ограничить доступ к нестатическим переменным внутри метода?


person TheCurious    schedule 27.04.2015    source источник
comment
Дело в том, что статические методы связаны с типом, а не с каким-либо экземпляром типа, тогда как методы экземпляра связаны с экземпляром типа. Частная часть полностью ортогональна этому. (Например, вы можете вызвать частный статический метод без каких-либо экземпляров, когда-либо существовавших ...)   -  person Jon Skeet    schedule 27.04.2015
comment
@JonSkeet На самом деле, сэр, поскольку частный метод вызывает беспокойство - они могут вызывать только внутри класса. Когда вы можете вызывать их напрямую по его имени, так зачем связывать их с накладными расходами ClassName.methodName.   -  person TheCurious    schedule 27.04.2015
comment
@ dubey-theHarcortians: вам не нужно указывать ClassName для вызова статического метода, если вы вызываете его в том же классе (или подклассе). Дело в том, что вы должны сделать метод статическим, если он логически не работает с экземпляром класса - это так просто.   -  person Jon Skeet    schedule 27.04.2015
comment
точно, сэр. У меня также есть такая же точка, поскольку метод, который является частным, имеет такое же поведение, что и prvate + static.each, и каждое свойство статического метода теряет свое существование в случае частного метода. Зачем нужен частный + статический метод. Это с целью ограничения, чтобы ограничить доступ к нестатическим переменным внутри метода?   -  person TheCurious    schedule 27.04.2015
comment
еще одна вещь, надеюсь, вы ответили в спешке. этот статический частный метод недоступен в подклассе :) @JonSkeet, как вы сказали, если вы вызываете его в том же классе (или подклассе).   -  person TheCurious    schedule 27.04.2015
comment
@ dubey-theHarcortians: Я говорил о статических методах в целом. Опять же, вы пытаетесь связать две полностью ортогональные концепции вместе, и мне совсем не ясно, зачем вам это нужно. Метод частного экземпляра не ведет себя так же, как частный статический метод. Подсказка: попробуйте получить доступ к переменным экземпляра из частного статического метода ... И если вы сейчас собираетесь сказать, что в частных статических методах нет смысла: попробуйте вызвать частный метод instance, когда вы этого не сделаете. есть экземпляр, чтобы вызвать его ...   -  person Jon Skeet    schedule 27.04.2015
comment
спасибо, сэр. я нашел после summery-1 - вы можете вызвать этот (частный + статический) метод в другом статическом методе того же класса даже до того, как объект не будет создан. 2- u не может получить доступ к нестатическому экземпляру члена класса в нем.   -  person TheCurious    schedule 27.04.2015
comment
да. И это точно то же самое, что и для не приватных статических методов. Как я уже сказал, это ортогональные концепции. Единственная область, в которой они перекрываются, - это то, что не частные методы экземпляра могут быть переопределены.   -  person Jon Skeet    schedule 27.04.2015


Ответы (1)


Что ж, если вы не хотите открывать метод для внешнего мира и использовать его только внутри, вы можете пометить их как частные. Это относится и к static методам. Пример :

public class Sample {

    public static void main(String[] args) {
        SomeTestClass.display1(); // compilation error
        SomeTestClass.display2();
    }

}

class SomeTestClass {
    private static void display1() {
        System.out.println("displaying 1..");
    }

    public static void display2() {
        display1();
        System.out.println("displaying 2..");
    }
}

В приведенном выше коде method1() предполагается использовать только в классе SomeTestClass. Это увеличивает абстракцию.

person TheLostMind    schedule 27.04.2015
comment
Что ж, если вы не хотите открывать метод внешнему миру и использовать его только внутри, вы можете пометить их как статические. Нет, вы помечаете это как личное ... - person Jon Skeet; 27.04.2015
comment
@JonSkeet - я хотел сказать private, а не static. (Тем не менее, опечатка: P) Исправил .. - person TheLostMind; 27.04.2015