2015-12-31 1 views
3

Я новичок в Java, и я пытаюсь изучить концепцию «Метод переопределения» как часть наследования.Если метод экземпляра в подклассе имеет одинаковую подпись и DIFFERENT тип возвращаемого значения, является ли это переопределяющим методом или новым методом?

Если метод экземпляра в подклассе имеет такую ​​же подпись (то есть имя плюс номер и тип его параметров) как метод в суперклассе, но имеет DIFFERENT тип возвращаемого значения, метод экземпляра все еще отменяет метод в суперклассе? Или это совершенно новый метод? Заранее благодарю за любую помощь!

ответ

2

Нет, если у вас есть РАЗЛИЧНЫЙ тип возврата, то есть полностью новый метод. Не переопределено.

Тип возврата также является частью подписи метода. Вы должны соблюдать все правила, чтобы переопределить их.

И интересная часть отметить здесь ковариации

Рассмотрят у вас есть Родитель и отношения ребенка и пытаемся переопределить методы родителя в ребенке, ковариация означает, что главнейший метод, возвращающий более конкретный тип. Ниже приведен пример того же метода родительского метода, возвращающего объект, и где, когда метод Child решил возвратить определенный тип (String), где String является дочерним по классу Object. Следовательно, здесь существовала ковариация.

Ковариантные типы возвращаемых:

public class Parent{ 
    public Object doSomething(){} 
} 
public class Child extends Parent{ 
    public String doSomething() {} 
} 

Если вы заинтересованы дать прочитанный на моем блоге: http://codeinventions.blogspot.in/2014/11/covariant-contravariant-and-class-invariant-example-and-difference-in-java.html

+0

Большое вам спасибо за помощь! Следующий вопрос, если тип возврата не является подтипом типа, возвращаемого переопределенным методом, то это новый метод? – Thor

+1

@ dzjustinli No.Если только тип возврата несовместим, вы получите ошибку компилятора. Если добавить к нему несколько параметров, которые рассматриваются как новый метод (перегрузка). –

1

это переопределение, только если метод переопределения имеет тип возврата, который является подтипом типа, возвращаемого переопределенным методом.

+0

Большое вам спасибо за вашу помощь! Следующий вопрос, если тип возврата не является подтипом типа, возвращаемого переопределенным методом, то это новый метод? – Thor

+1

@dzjustinli он не будет компилироваться в этом случае, поскольку компилятор увидит его как другой метод (перегрузка), но поскольку методы не могут быть перегружены по типам возврата, он не будет компилироваться. – Ramanlfc

1

наиважнейшая метод имеет то же имя, номер и тип параметров и тип возвращаемого значения как метод, который он переопределяет. Метод overriding также может возвращать подтип типа, возвращаемого переопределенным методом. Этот подтип называется covariant return type. Допустим пример:

метод подкласса в возвращаемый тип R2 может отличаться от суперкласса метода обратного типа R1, R2, но должен быть подтипом R1. т. е. подкласс может возвращать тип, может быть подтипом типа возврата суперкласса.

class ShapeFactory { 
     public Shape newShape() {} 
    } 

    class CircleFactory extends ShapeFactory { 
     @Override 
     public Circle newShape() {} 
    } 
+1

Не забывайте аннотации @Override! –

+0

Да. если вы не добавили даже его переопределение по умолчанию. – iMBMT

1

Для метода с другим типом возвращаемого из одноименного родительского метода с той же аргументом арностью и типами, если типом возвращаемого значения является подтипом типа возвращаемого значения родительского метода, то это юридический переопределения. Если нет, это ошибка компилятора.

public interface Exemplary 
{ 
    CharSequence getText(); 
} 

public class Example implements Exemplary 
{ 
    @Override 
    public String getText(); // legal 
} 

public class BadExample implements Exemplary 
{ 
    @Override 
    public Integer getText(); // error 
} 

https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.1

Смежные вопросы