Sobes.tech
Middle

Разкажи ми за правилата за пренатоварване на методи.

sobes.tech AI

Отговор от AI

Претоварване на методи (Method Overloading) в обектно-ориентираното програмиране позволява да се дефинират няколко метода в един клас с едно и също име, но с различни сигнатури.

Основните правила за претоварване на методи:

  1. Различие в сигнатурите: Сигнатурата на метода включва името на метода и списъка с типове на неговите параметри в съответния ред. За да се счита, че методите са претоварени, техните сигнатури трябва да се различават.

    // Примери за различни сигнатури
    void print(int i) { }
    void print(String s) { }
    void print(int i, String s) { }
    void print(String s, int i) { } // Различава редът на параметрите
    
  2. Името на метода трябва да е едно и също: Претоварените методи трябва да имат едно и също име.

    // Правилен пример за претоварване
    class Example {
        void process(int a) { }
        void process(double b) { }
    }
    
  3. Типът на върнатата стойност не е част от сигнатурата: Промяната само на типа на върнатата стойност не прави методите претоварени. Компилаторът няма да може да различи кой метод да извика, ако сигнатурите на параметрите са еднакви.

    // Не е претоварване - грешка при компилация
    int calculate() { return 1; }
    String calculate() { return "error"; }
    
  4. Модификаторите за достъп и спецификаторите за изключения не влияят на претоварването: Аналогично на типа на върнатата стойност, промяната само на модификаторите за достъп (public, private, protected, default) или списъка с изключения (throws) не води до претоварване.

    // Не е претоварване - грешка при компилация, ако сигнатурите на параметрите са еднакви
    public void doSomething() { }
    private void doSomething() { }
    
  5. Порядъкът на параметрите има значение: Промяната на реда на типовете параметри прави сигнатурите различни.

    // Е претоварване
    void setup(int width, int height) { }
    void setup(int height, String unit) { } // Различава се по втория параметър
    void setup(String unit, int size) { } // Различава се по типа и реда на параметрите
    
  6. Броят на параметрите има значение: Различният брой параметри води до различни сигнатури.

    // Е претоварване
    void log(String message) { }
    void log(String message, int level) { }
    

Следователно, ключовият фактор за претоварване е уникалността на сигнатурата на метода, която се определя от името му и набора (типовете и реда) на параметрите.