Странный синтаксис для инстанцирования внутреннего класса

var a1 = [1,2,3,6];
var a2 = [1,2,3,5];

function check(a, b) {
  return (a.length != b.length) ? false : 
  a.every(function(row, index) {
    return a[index] == b[index];
  });
}  

check(a1, a2);

////// ИЛИ ///////

var a1 = [1,2,3,6];
var a2 = [1,2,3,6];

function check(a, b) {
  return (a.length != b.length) ? false : 
  !(a.some(function(row, index) {
    return a[index] != b[index];
  }));
}  

check(a1, a2)
42
задан starblue 11 March 2009 в 21:37
поделиться

5 ответов

Внутренним классам (как Button.ClickEvent) нужна ссылка на экземпляр внешнего класса (Button).

, Что синтаксис создает новый экземпляр Button.ClickEvent с его внешним набором ссылки класса к значению button.

Вот пример - игнорируют отсутствие инкапсуляции и т.д., это только в целях демонстрации:

class Outer
{
    String name;

    class Inner
    {
        void sayHi()
        {
            System.out.println("Outer name = " + name);
        }
    }
}

public class Test
{
    public static void main(String[] args)
    {
        Outer outer = new Outer();
        outer.name = "Fred";

        Outer.Inner inner = outer.new Inner();
        inner.sayHi();
    }
}

раздел See 8.1.3 из спецификации для больше о внутренних классах и экземплярах включения.

70
ответ дан Jon Skeet 23 September 2019 в 13:43
поделиться

Нестатический внутренний класс в Java содержит скрытую ссылку, которая указывает на экземпляр внешнего класса, в котором это объявляется. Таким образом, сообщение об ошибке, которое Вы получили первоначально, говорит Вам, что Вы не можете создать новый экземпляр внутреннего класса, также не определяя экземпляр внешнего класса для него, чтобы быть присоединенными.

, Возможно, причина Вы не видели, что синтаксис прежде - то, что внутренние классы часто выделяются в методе внешнего класса, где компилятор заботится об этом автоматически.

8
ответ дан Daniel Earwicker 23 September 2019 в 13:43
поделиться

Кнопка. ClickEvent является нестатическим внутренним классом, таким образом, экземпляр этого класса может только существовать включенный в экземпляр Кнопки.

В Вашем втором примере кода у Вас есть экземпляр Кнопки, и Вы создаете экземпляр ClickEvent, включенного в этот экземпляр Кнопки...

9
ответ дан pgras 23 September 2019 в 13:43
поделиться

Чтобы постараться не смущать себя и коллег - программистов с этой редко используемой функцией, можно всегда делать внутренние классы статичными.

В случае, если ссылка на внешний класс необходима, можно передать его явно в конструкторе.

3
ответ дан starblue 23 September 2019 в 13:43
поделиться

Ваш код скомпилировал бы, имел Вас, ввел

buttonClick(new Button().ClickEvent(button));

вместо

buttonClick(new Button.ClickEvent(button));

, поскольку конструктор является методом и когда Вы называете метод в Java, необходимо передать список аргументов, даже когда это пусто.

-1
ответ дан diginoise 23 September 2019 в 13:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: