Змінюй хід війни! Допомагай ЗСУ!

[Вопрос по Java] - статический метод

  • Автор теми Автор теми beerofeel
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 26.07.2010
Повідом.: 52
[Вопрос по Java] - статический метод

Ребята, добрый день.

Есть вопрос, есть код:

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


в статический метод, я помещаю массив и вычисляю минимальное / максимальное число. Всё тривиально. Возвращаю объект new Pair(min, max);

Почему внутренний класс class Pair без модификатора static не хочет создавать объект? Статический метод не может обращаться к не статическим полям. Т.е. возвращать объект типа Pair, он не может тоже получается?

Что-то я подзабыл. :rolleyes:

Спасибо большое.
 
этот код компилируются вообще?

"Статический метод не может обращаться к не статическим полям." - верно, но объект типа Pair не статическое поле вовсе

мне кажется беда в модификаторах доступа и конструктор Pair просто не видно для метода elementMinMax, поэтому и не удается вернуть новый объект типа Pair

p.s.: java не знаю совсем =)
 
static class ArrayAlg
class Pair

Как может new вернуть новый объект если класс статический? Что в вашем понимании означает "static"?

ваша беда в том что вы к статическому классу обращаетесь через this

попробуйте просто убрать this.
 
Останнє редагування:
Почему внутренний класс class Pair без модификатора static не хочет создавать объект? Статический метод не может обращаться к не статическим полям. Т.е. возвращать объект типа Pair, он не может тоже получается?
Не хочет потому что внутренний класс Pair может получать доступ к полям внешнего класса ArrayAlg. То есть нельзя создать экземпляр нестатического Pair, который может получать доступ к нестатическим полям ArrayAlg из статического метода ArrayAlg, который к нестатическим полям доступа не имеет.
 
Не статический внутренний класс содержит неявную ссылку на объемлющий класс (генерируется компилятором).
Статический класс таковой ссылки не имеет и не требует существования объекта объемлющего класса для своего создания.

Статический метод обращается к классу, не статический - к объекту. Возвращать может что-угодно и тот и тот.

Почему внутренний класс class Pair без модификатора static не хочет создавать объект?
Потому что компилятор обязан вставить скрытую ссылку на объект класса ArrayAlg в объект внутреннего классa Pair. Вызвав конструктор из статического метода, вы не даете компилятору это сделать.


От нефиг делать написал пример. Скрытых полей не видно, но наверняка они должны где-то быть:

Сорцы:
Код:
A.java
public class A {

    B testNonStatic() {
        return new B();
    }

    static C testStatic() {
        return new C();
    }

    class B {

        B() {
        }
    }

    static class C {

        C() {
        }
    }
}
Декомпилированный байт код. В конструкторе класса "B" есть ссылка на "A":
Код:
A.class
public class A
{
  A.B testNonStatic()
  {
    return new A.B();
  }

  static A.C testStatic() {
    return new A.C();
  }

  static class C
  {
  }

  class B
  {
    B()
    {
    }
  }
}

A$B.class
class A$B
{
  A$B(A paramA)
  {
  }
}

A$C.class
class A$C
{
}
 
Останнє редагування:
burning_LEGION

Нет никакой беды в модификаторах доступа. Код абсолютно рабочий и правильный.

kosyak

Честно, я даже не понял о чём Вы говорите?
Если модификатор static используется для метода, это означает, что к методу можно обратиться не через ссылку на объект, а на прямую через имя класса, т.е. nameOfClass.nameOfMethod().
В моём коде именно это происходит: ArrayAlg.elementMinMax(d) Вызывается метод через имя класса ArrayAlg, в качестве параметра указывается ссылка на объект массива d. Дальше идёт вычисление минимального и максимального элемента. В конце возвращается новый объект new Pair(min, max);


Ребята, спасибо всем за объяснения. Честно говоря, мало понял из Ваших объяснений. Если можно, как-то попроще объясните. :)

С наступающим всех! :)
 
Если можно, как-то попроще объясните.

Попроще: класс Pair без модификатора static может использовать поля содержащего класса ArrayAlg

Код:
  private int yo;
    
    class Pair {
        double min;
        double max;

        Pair(double min, double max) {
            this.min = min;
            this.max = max;
        }

        double getMin() { return min + [B]yo[/B]; }

Следовательно, возврат метода static Pair elementMinMax(double[] array) тоже зависел бы от внезапной переменной yo. Это недопустимо, поэтому класс Pair должен быть static, даже если ты не используешь динамический контекст. Сегодня не используешь, а завтра захочется, и в 500 местах начнутся феерические вещи.
 
Ребята, спасибо.

Помогите ещё разобраться с последовательностью инициализации при наследовании. Значит:

Сначала инициализируются статические поля базового класса, Затем если есть статические поля в подклассе, инициализируются они.

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

Нужно остеригаться и стараться не вызывать переопределённые методы в конструкторе базового класса при создании объекта подкласса.

Если где-то ошибаюсь, подправьте. :пиво: Спасибо.

Кстати, вот код по которому я сделал выводы:

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
Останнє редагування:
Тут детально
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
 
Kompot

Да, я видел, осталось только английский язык выучить на отлично.

Я делаю выводы по работе кода, который привёл ниже. Поэтому подозреваю, что мои выводы правильные.
 
Я делаю выводы по работе кода, который привёл ниже. Поэтому подозреваю, что мои выводы правильные.

читайте спеки к используемой реализации JVM. завтра запускаете на другой JVM и все выводы придется делать заново.
 
Kompot

В чём ошибка тогда?
 
Останнє редагування:
Назад
Зверху Знизу