Если вы сомневаетесь, напишите фрагмент кода кода :
for ($j = 1; $j < 4; $j++)
{
for ($k = 0; $k < $j; $k++)
{
echo "\n\$i % $j == $k: \n";
for ($i = 0; $i < 10; $i++)
{
echo "$i : ";
if ($i % $j == $k)
{
echo "TRUE";
}
echo " \n";
}
}
}
Вот результат. Используйте его, чтобы выяснить, что вам нужно использовать:
$i % 1 == 0:
0 : TRUE
1 : TRUE
2 : TRUE
3 : TRUE
4 : TRUE
5 : TRUE
6 : TRUE
7 : TRUE
8 : TRUE
9 : TRUE
$i % 2 == 0:
0 : TRUE
1 :
2 : TRUE
3 :
4 : TRUE
5 :
6 : TRUE
7 :
8 : TRUE
9 :
$i % 2 == 1:
0 :
1 : TRUE
2 :
3 : TRUE
4 :
5 : TRUE
6 :
7 : TRUE
8 :
9 : TRUE
$i % 3 == 0:
0 : TRUE
1 :
2 :
3 : TRUE
4 :
5 :
6 : TRUE
7 :
8 :
9 : TRUE
$i % 3 == 1:
0 :
1 : TRUE
2 :
3 :
4 : TRUE
5 :
6 :
7 : TRUE
8 :
9 :
$i % 3 == 2:
0 :
1 :
2 : TRUE
3 :
4 :
5 : TRUE
6 :
7 :
8 : TRUE
9 :
Статические методы разрешаются по типу переменной времени компиляции. m
имеет тип Main
, поэтому вызывается метод из Main
.
Если вы измените его на SubMain m ...
, то будет вызван метод на SubMain
.
Это потому, что статические методы не являются полиморфными. Более того, статический метод должен вызываться не объектом, а использованием класса, то есть Main.method()
или SubMain.method()
. Когда вы вызываете m.method()
, java фактически вызывает Main.method()
, потому что m имеет тип Main.
Если вы хотите использовать полиморфизм, не используйте статические методы.
статические методы статически привязаны к их имени класса, потому что m является типом основного класса, а затем после компиляции он будет выглядеть следующим образом Main.method (); после компиляции вашего класса выполните следующую команду: javap -c Main u может увидеть код сборки jvm для Main class, и u увидит следующий m.method // вызовет static invoke static, invoke special сообщает, что static binding invoke special, invoke interface сообщает что динамическое связывание
Eclipse дает мне такое предупреждение, когда я пытаюсь сделать такие вещи:
Статический метод XXX () из типа XXX должен быть доступен статическим способом
blockquote>Статические методы не участвуют в наследовании. Переменная имеет тип
Main
, поэтому компилятор разрешил вызов вашей функции наMain.method()
.Для дополнительного удовольствия попробуйте установить
m
наnull
.
Java выполняет раннее связывание для статических методов, в отличие от методов экземпляров, которые динамически связаны.
Поскольку ваша объектная переменная имеет тип Main, вызов привязан к реализации суперкласса во время компиляции.
Хорошее объяснение доступно здесь .