Override & overload

Override (перезапись метода в субклассах):

  1. модификатор доступа перезаписанного метода не может быть строже.
  2. private, final, static методы не могут быть перезаписаны.
  3. нельзя расширать Exception, только УМЕНЬШАТЬ ИЛИ ВООБЩЕ УБИРАТЬ (дети exception) при перезаписи.
  4. нельзя добавлять или убирать полнустью Exception.
  5. нельзя изменять return тип.
  6. JVM сначала смотрит по ссылке, потом ищет перегруженный метод. Пример: Animal hs = new Horse(); hs.eat(). Вызовется метод с обьекта Horse. 
  7. Статические методы нельзя перезаписать, только переназначить (будут использоваться по ссылке).

Overload (перегрузка методов):

  1. должны изменять список аргументов.
  2. могут изменять тип return, модификатор доступа, изменять или создавать Exception.
  3. может быть перегружен в одно и том же классе или субклассе.
  4. тип ссылки определяет какой перегруженный метод будет вызван.

Приоритет перегруженных методов:


  1. Расширение типов ( void func(int x),  void func(long x) )
  2. Автобоксинг ( void func(Intger x), void func(Long x) ) Не действует расширения для типов оболочок. При аргументе ф-ции Long или byte нельзя кинуть Integer (IS-A FAIL).
  3. Аргумент переменной длины ( void func(int ... x) ) 
public class Clazz { 
    private void process(String... s) { 
        System.out.print("*"); 
    } 
    private void process(String s) { 
        System.out.print("1"); 
    } 
    private void process(String s, String a) { 
        System.out.print("2"); 
    } 
    public static void main(String[] args) { 
        Clazz c = new Clazz(); 
        c.process("asd"); 
        c.process("asd","asd"); 
        c.process("asd","asd","asd"); 
    } 
} //12*

public class TypesTutorial { 
 
    public static void main(String... atgs) { 
        A alpha = new B(); 
    } 
} 
 
class A { 
    A(){ 
        System.out.print("A"); 
        a(); 
    } 
     
    void a() { 
        System.out.print("a"); 
    } 
} 
 
class B extends A { 
    B() { 
        System.out.print("B"); 
        a(); 
    } 
     
    void a() { 
        System.out.print("b"); 
    } 
} // AbBb


public class Z { 
    public void print( Object o ) { 
        System.out.println( "Object" ); 
    } 
 
    public void print( String str ) { 
        System.out.println( "String" ); 
    } 
 
    public void print( Integer i ) { 
        System.out.println( "Integer" ); 
    } 
   
    public static void main(String[] args) { 
        Z z = new Z(); 
        z.print( null ); 
    } 
}  //Будет ошибка компиляции. Чтобы не было, нужно убрать метод с String или Integer или явно указать ссылку. При этом будет выведено Integer или String cответственно. Можно так же явно указывать ссылку, тогда ошибки также не будет.
class A { 
    public void m(Number n) { 
        n = 5 / 3; 
        System.out.println("class A, method m : " + n); 
    } 
} 
 
class B extends A { 
    public void m(Double d) { 
        d = d / 3; 
        System.out.println("class B, method m : " + d); 
    } 
} 
 
public class MainClass { 
    public static void main(String args[]) { 
        A a = new B(); 
        a.m(5.0); 
    } 
} //Пояснение: полиморфного вызова методов не происходит, поскольку сигнатуры void m(Number n) и void m(Double d) отличаются. Тот факт, что Double наследник Number не играет никакой роли. ОТВЕТ: class A, method m : 1

Комментариев нет:

Отправить комментарий