Основная проблема с кодом, показанным 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 уникальных индекса). Существует несколько способов захвата этого значения. Один из них - передать его в качестве параметра функции, которая уже несколько раз показана здесь.
Другой вариант - построить объект функции, который сможет закрыть эту переменную. Это может быть выполнено таким образом
funcs[i] = new function() {
var closedVariable = i;
return function(){
console.log("My value: " + closedVariable);
};
};
Вызов точно 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");
}
}
Вы можете использовать его для вызова метода суперкласса (например, когда вы переопределяете такой метод, super.foo () и т. д.) - это позволит вам сохранить эту функциональность и добавить к ней все, что у вас есть в методе переопределения.
Супер вызовет ваш родительский метод. См .: http://leepoint.net/notes-java/oop/constructors/constructor-super.html
Вы использовали бы его как первую строку конструктора подкласса для вызова конструктора его родительского класса.
Например:
public class TheSuper{
public TheSuper(){
eatCake();
}
}
public class TheSub extends TheSuper{
public TheSub(){
super();
eatMoreCake();
}
}
Построение экземпляра TheSub
будет вызывать как eatCake()
, так и eatMoreCake()
Когда вы хотите, чтобы конструктор суперкласса вызывался - для инициализации полей внутри него. Взгляните на эту статью, чтобы понять, когда ее использовать:
http://download.oracle.com/javase/tutorial/java/IandI/super.html
Вы также можете использовать ключевое слово 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
Из документации oracle page :
Если ваш метод переопределяет один из его методов суперкласса, вы можете вызвать переопределенный метод с помощью ключевого слова
blockquote>super
,Вы также можете использовать
super
для ссылки на скрытое поле (хотя скрывать поля не рекомендуется).Использование
super
в конструкторе подклассов:Вызов конструктора суперкласса должен быть первой строкой в конструкторе подкласса.
blockquote>Синтаксис для вызова конструктора суперкласса -
super();
или:
super(parameter list);
С помощью
super()
вызывается конструктор без аргументов суперкласса. С помощьюsuper(parameter list)
вызывается конструктор суперкласса с соответствующим списком параметров.Примечание: Если конструктор явно не вызывает конструктор суперкласса, компилятор Java автоматически вставляет вызов в no- конструктор аргументов суперкласса . Если у суперкласса нет конструктора без аргументов, вы получите ошибку времени компиляции.
Связанная публикация:
Первая строка вашего конструктора вашего подкласса должна быть вызовом super()
, чтобы гарантировать, что вызывается конструктор суперкласса.
Я просто попробовал, комментируя 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();
}
}
super
используется для вызова constructor
, methods
и properties
родительского класса.