Java: Есть ли способ использовать метод, определенный в суперклассе, наряду с добавленной функциональностью в подклассе? [Дубликат]

Основная проблема с кодом, показанным OP, заключается в том, что i никогда не читается до второго цикла. Чтобы продемонстрировать, представьте, что вы видите ошибку внутри кода

funcs[i] = function() {            // and store them in funcs
    throw new Error("test");
    console.log("My value: " + i); // each should log its value.
};

Ошибка на самом деле не происходит до тех пор, пока funcs[someIndex] не будет выполнен (). Используя эту же логику, должно быть очевидно, что значение i также не будет собрано до этой точки. Как только исходный цикл завершится, i++ добавит i к значению 3, что приведет к сбою условия i < 3 и завершению цикла. На этом этапе i является 3, поэтому, когда используется funcs[someIndex](), и i оценивается, он равен 3 - каждый раз.

Чтобы пройти мимо этого, вы должны оценить i, поскольку он встречается. Обратите внимание, что это уже произошло в форме funcs[i] (где есть 3 уникальных индекса). Существует несколько способов захвата этого значения. Один из них - передать его в качестве параметра функции, которая уже несколько раз показана здесь.

Другой вариант - построить объект функции, который сможет закрыть эту переменную. Это может быть выполнено таким образом

jsFiddle Demo

funcs[i] = new function() {   
    var closedVariable = i;
    return function(){
        console.log("My value: " + closedVariable); 
    };
};

71
задан muttley91 13 May 2016 в 17:04
поделиться

11 ответов

Вызов точно super() всегда избыточен. Это явно делает то, что было бы неявно сделано иначе. Это потому, что если вы опустите вызов супер-конструктора, супер-конструктор без аргументов будет вызван автоматически в любом случае. Не сказать, что это плохой стиль; некоторым людям нравится быть явным.

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

public class Animal {
   private final String noise;
   protected Animal(String noise) {
      this.noise = noise;
   }

   public void makeNoise() {
      System.out.println(noise);
   }
}

public class Pig extends Animal {
    public Pig() {
       super("Oink");
    }
}
128
ответ дан Mark Peters 1 September 2018 в 04:33
поделиться

Вы можете использовать его для вызова метода суперкласса (например, когда вы переопределяете такой метод, super.foo () и т. д.) - это позволит вам сохранить эту функциональность и добавить к ней все, что у вас есть в методе переопределения.

1
ответ дан AHungerArtist 1 September 2018 в 04:33
поделиться

Супер вызовет ваш родительский метод. См .: http://leepoint.net/notes-java/oop/constructors/constructor-super.html

1
ответ дан Ben Groot 1 September 2018 в 04:33
поделиться

Вы использовали бы его как первую строку конструктора подкласса для вызова конструктора его родительского класса.

Например:

public class TheSuper{
    public TheSuper(){
        eatCake();
    }
}

public class TheSub extends TheSuper{
    public TheSub(){
        super();
        eatMoreCake();
    }
}

Построение экземпляра TheSub будет вызывать как eatCake(), так и eatMoreCake()

8
ответ дан Dave Newton 1 September 2018 в 04:33
поделиться
1
ответ дан Florian Neiss 1 September 2018 в 04:33
поделиться

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

http://download.oracle.com/javase/tutorial/java/IandI/super.html

9
ответ дан Jon 1 September 2018 в 04:33
поделиться

Вы также можете использовать ключевое слово super в подклассе, если вы хотите вызвать метод из родительского класса, когда вы переопределили его в подклассе.

Пример:

public class CellPhone {
    public void print() {
        System.out.println("I'm a cellphone");
    }
}

public class TouchPhone extends CellPhone {
    @Override
    public void print() {
        super.print();
        System.out.println("I'm a touch screen cellphone");
    }
    public static void main (strings[] args) {
        TouchPhone p = new TouchPhone();
        p.print();
    }
}

Здесь строка super.print() вызывает метод print() суперкласса CellPhone. Выход будет:

I'm a cellphone
I'm a touch screen cellphone
18
ответ дан MaxZoom 1 September 2018 в 04:33
поделиться

Из документации oracle page :

Если ваш метод переопределяет один из его методов суперкласса, вы можете вызвать переопределенный метод с помощью ключевого слова super ,

Вы также можете использовать super для ссылки на скрытое поле (хотя скрывать поля не рекомендуется).

Использование super в конструкторе подклассов:

Вызов конструктора суперкласса должен быть первой строкой в ​​конструкторе подкласса.

Синтаксис для вызова конструктора суперкласса -

super();  

или:

super(parameter list);

С помощью super() вызывается конструктор без аргументов суперкласса. С помощью super(parameter list) вызывается конструктор суперкласса с соответствующим списком параметров.

Примечание: Если конструктор явно не вызывает конструктор суперкласса, компилятор Java автоматически вставляет вызов в no- конструктор аргументов суперкласса . Если у суперкласса нет конструктора без аргументов, вы получите ошибку времени компиляции.

Связанная публикация:

Полиморфизм против перегрузки и перегрузки

0
ответ дан Ravindra babu 1 September 2018 в 04:33
поделиться

Первая строка вашего конструктора вашего подкласса должна быть вызовом super(), чтобы гарантировать, что вызывается конструктор суперкласса.

0
ответ дан robev 1 September 2018 в 04:33
поделиться

Я просто попробовал, комментируя super (); делает то же самое, не комментируя это как @Mark Peters

package javaapplication6;

/**
 *
 * @author sborusu
 */
public class Super_Test {
    Super_Test(){
        System.out.println("This is super class, no object is created");
    }
}
class Super_sub extends Super_Test{
    Super_sub(){
       super();
       System.out.println("This is sub class, object is created");
    }
    public static void main(String args[]){
        new Super_sub();
    }
}
0
ответ дан user2567665 1 September 2018 в 04:33
поделиться

super используется для вызова constructor, methods и properties родительского класса.

38
ответ дан Zain Shaikh 1 September 2018 в 04:33
поделиться
Другие вопросы по тегам:

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