Определение того, какая реализация метода будет вызвана (Объявлено против Фактического типа) [дубликат]

Если вы сомневаетесь, напишите фрагмент кода кода :

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 :  

10
задан Visruth 25 November 2012 в 21:02
поделиться

5 ответов

Статические методы разрешаются по типу переменной времени компиляции. m имеет тип Main, поэтому вызывается метод из Main.

Если вы измените его на SubMain m ..., то будет вызван метод на SubMain.

18
ответ дан porges 25 August 2018 в 05:48
поделиться

Это потому, что статические методы не являются полиморфными. Более того, статический метод должен вызываться не объектом, а использованием класса, то есть Main.method() или SubMain.method(). Когда вы вызываете m.method(), java фактически вызывает Main.method(), потому что m имеет тип Main.

Если вы хотите использовать полиморфизм, не используйте статические методы.

15
ответ дан AlexR 25 August 2018 в 05:48
поделиться

статические методы статически привязаны к их имени класса, потому что m является типом основного класса, а затем после компиляции он будет выглядеть следующим образом Main.method (); после компиляции вашего класса выполните следующую команду: javap -c Main u может увидеть код сборки jvm для Main class, и u увидит следующий m.method // вызовет static invoke static, invoke special сообщает, что static binding invoke special, invoke interface сообщает что динамическое связывание

0
ответ дан Anoop Singhal 25 August 2018 в 05:48
поделиться

Eclipse дает мне такое предупреждение, когда я пытаюсь сделать такие вещи:

Статический метод XXX () из типа XXX должен быть доступен статическим способом

Статические методы не участвуют в наследовании. Переменная имеет тип Main, поэтому компилятор разрешил вызов вашей функции на Main.method().

Для дополнительного удовольствия попробуйте установить m на null.

2
ответ дан developmentalinsanity 25 August 2018 в 05:48
поделиться

Java выполняет раннее связывание для статических методов, в отличие от методов экземпляров, которые динамически связаны.

Поскольку ваша объектная переменная имеет тип Main, вызов привязан к реализации суперкласса во время компиляции.

Хорошее объяснение доступно здесь .

1
ответ дан mmccomb 25 August 2018 в 05:48
поделиться
Другие вопросы по тегам:

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