Скомпілюйте час і значення часу виконання

To make things clear, I have elaborated my question in more detail.

Я маю цей код, який розробляє динамічну прив'язку, використовуючи концепцію перевизначення.

Ось код:

class Test { 
         public static void main(String [] args) 
         { 

             B b = new A();   

             b.p(10);     // 10.0
             b.p(10.0);  //10.0
         } 
  } 
  class B
  { 
    public void p(double i)
    { 
        print(i*2); 
    } 
  } 

  class A extends B 
  { 
     public void p(double i) 
    { 
          print(i); 
    } 
  }   

Тепер, пояснення говорить, що компілятор не може визначити, який метод викликати під час "часу компіляції". Саме під час «виконання», коли компілятор знає, що метод, який потрібно викликати, є методом підкласу, тому що коли ми перекриваємо, ми розглядаємо фактичний тип.

Контраст із цим кодом:

    class Test { 
         public static void main(String [] args) 
         { 

             B b = new A();   

             b.p(10);     // 10.0
             b.p(10.0);  //10.0
         } 
       } 
  class B
 { 
   public void p(double i)() 
  { 
     print(i*2); 
  } 
} 

 class A extends B 
 { 
    public void p(int i) 
   { 
      print(i); 
   } 
}

У цьому прикладі компілятор може розпізнати, який метод викликати під час компіляції. Як можна розпізнати компіляцію в цьому прикладі, поки не розпізнає попередній приклад? Питання:

Що саме означає термін "час компіляції" і "час виконання"? Як компілятор не розпізнає під час компіляції, що функція, яку потрібно викликати, є функцією підкласу?

0
Перевірте [це] [1]. Ви просите те ж саме. [1]:
додано Автор Ruchira Gayan Ranaweera, джерело
doc. html & zwnj;. Перевір це
додано Автор Raghunandan, джерело
щодо вашого питання 1. Як ваш код посилається на ваше запитання? 2. пояснення ЧОГО? каже, що компілятор не може визначити метод виклику? Ви отримуєте певну помилку?
додано Автор Sam I am, джерело
Коментарі у вашому коді означають, що ви вважаєте, що результат буде результатом 20.0 . Фактично, виведення буде 10.0 як b - примірник A ...
додано Автор DannyMo, джерело

9 Відповіді

Розгляньте наступний (псевдо) код:

B b = Rand() > 0.5?new A() : new B();

b.p(10);

Компілятор не може знати, який буде викликаний під час виконання.

5
додано
Тут найкраща відповідь. +1. Це просто і чудово пояснює.
додано Автор Maroun, джерело

Це досить очевидно

Час компіляції та часу виконання посилаються на період часу


Compile time is the time when your compiler is building your project.

Runtime is the time when your project is running.


І я припускаю, що ви питаєте, чому ваш код не знає, що B є A перед запуском коду. у наступному розділі:

 B b = new A();   

 b.p(10);     // 20.0
 b.p(10.0);  //20.0

Причина полягає в тому, що компілятор не оцінює всі можливі шляхи в коді, щоб перевірити цей матеріал.

 B b = new A();   

 if(...)
 {
    ...
    b = new B();
 }


 b.p(10);     // 20.0
 b.p(10.0);  //20.0

Він знає лише те, що b - це коли код фактично виконується.

3
додано

Run time means "when your program is running".

Compile time means "when your program is being compiled".

Є певні речі, які відомі лише під час виконання.

Прикладом може бути введення користувача.

Компілятор не може передбачити, що користувачі вводять під час виконання.

2
додано

Схоже, що наданий вами приклад неправильний.

Висновок 10.0 в обох викликах, не 20.0, як ви стверджували.

2
додано
Це не дуже відповідь на це питання. це більше також тангенціально пов'язаний коментар
додано Автор Sam I am, джерело
але це ще не відповідь
додано Автор Sam I am, джерело
Це є актуальним, хоча, як вважає автор, метод підкласу має бути названий. Справа в тому, що її називають.
додано Автор JamesB, джерело
Ну, можливо, не прямо, але він повинен підтвердити автору, що його/її припущення про реалізацію підкласу, які не були визнані, неправильні.
додано Автор JamesB, джерело
  • Час компіляції: під час компіляції.
  • Час виконання: під час виконання програми.

Розгляньте:

List x = getsSomeList();

x could be any implementation of the List interface.

Якщо ви називаєте x.add (foo) , правильний метод add не буде відомий до виконання, і є фактична реалізація, за допомогою якої можна викликати add .

1
додано

Що означає термін "час компіляції" та "час виконання"?

Compile time is when the code gets compiled to executable code (byte-code). That means, all files are linked (which you include by import expression), and byte-code, i.e. sequence of instructions is created.

Run time is when the CPU runs the compiled code - byte code.

Як компілятор не розпізнає під час компіляції, що функція, яку потрібно викликати, є функцією підкласу?

Насправді, це так. Якщо він не може розпізнати, то він не буде компілюватися, тому що компіляція повинна знати однозначно знати, який метод викликати, щоб підготувати код до часу виконання. Наданий вами код є дійсним, і буде виконано метод p() класу A .

1
додано

Компілятор не може знати, який метод викликати через поліморфізм, як сказано , що компілятор не може визначити, який метод викликати під час "компіляції" , це означає, що, оскільки доступна багаторазова форма функції, компілятор вирішує яку версію функції буде викликати при компіляції програми, тому замість неї буде вирішено, яким методом буде викликати програму під час виконання програми.

Якщо розширений/отриманий клас перевантаження функція/метод, яку ви намагаєтеся викликати, викликаєте метод з похідного класу , якщо метод не перевантажений у похідному класі, тоді він викликатиме метод з базового класу . Так працює динамічна прив'язка в мовах, орієнтованих на ООП.

0
додано

Різниця між "часом компіляції" та "часом виконання" - під час компіляції, JVM перевіряє на наявність синтаксису, конкретної Java та інших помилок у програмі, яку запитує програміст. Час виконання - це те, що перевіряється під час виконання програми.

Існує можливість, що ви можете бути синтаксично правильними, але матимете багато помилок під час виконання. Приклади: неправильно написані слова логіки в програмі як він працює як працюють речі, пов'язані з анімацією тощо

Це деп

0
додано

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

0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників