Override (перезапись метода в субклассах):
- модификатор доступа перезаписанного метода не может быть строже.
- private, final, static методы не могут быть перезаписаны.
- нельзя расширать Exception, только УМЕНЬШАТЬ ИЛИ ВООБЩЕ УБИРАТЬ (дети exception) при перезаписи.
- нельзя добавлять или убирать полнустью Exception.
- нельзя изменять return тип.
- JVM сначала смотрит по ссылке, потом ищет перегруженный метод. Пример: Animal hs = new Horse(); hs.eat(). Вызовется метод с обьекта Horse.
- Статические методы нельзя перезаписать, только переназначить (будут использоваться по ссылке).
Overload (перегрузка методов):
- должны изменять список аргументов.
- могут изменять тип return, модификатор доступа, изменять или создавать Exception.
- может быть перегружен в одно и том же классе или субклассе.
- тип ссылки определяет какой перегруженный метод будет вызван.
Приоритет перегруженных методов:
- Расширение типов ( void func(int x), void func(long x) )
- Автобоксинг ( void func(Intger x), void func(Long x) ) Не действует расширения для типов оболочок. При аргументе ф-ции Long или byte нельзя кинуть Integer (IS-A FAIL).
- Аргумент переменной длины ( 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
Комментариев нет:
Отправить комментарий