2015-01-09 4 views
1

У меня есть упражнение для решения, у меня есть правильный ответ, но я не могу его получить ... Может ли кто-нибудь помочь мне в том, что происходит после каждого «шага». вот упражнение. У нас есть 2 класса: введите код здесьНаследование, что происходит после каждого шага

public class CA 
{ 
    protected String descricao; 
    private float valor; 
    public CA(String descricao, float valor) 
    { 
     this 
     .descricao = descricao; 
     this.valor = valor; 
    } 

    public String getDescricao() 
    { 
     return descricao; 
    } 

    public float getValor() 
    { 
     return valor; 
    } 

    public float teste(float a) 
    { 
     return soma(a); 
    } 

    public float soma(float a) 
    { 
     return valor + a; 
    } 
} 

и второе:

public class CB extends CA 
{ 
    private final int maxStock = 15; 
    private int stock; 
    public CB(String descricao, float valor) 
    { 
     super(descricao,valor); 
     stock = 0; 
    } 

    public int getStock() 
    { 
     return stock; 
    } 

    public void setStock(int actual) 
    { 
     stock = actual; 
    } 

    public int emFaltaStock() 
    { 
     return (maxStock-stock); 
    } 

    public float soma(float a) 
    { 
     return getValor() + a * 2; 
    } 

    public boolean noLimite(int minStock) 
    { 
     return ((minStock-stock) <= 0); 
    } 
} 

Вопрос заключается в том, что будет результат этих утверждений:

CB cb1 = new CB("cb1",10); 
CA ca1 = cb1; 
float v1= ca1.soma(2); 

Я знаю, что это будет 14, но почему? Может ли кто-нибудь сказать мне?

+0

Каков ваш ожидаемый ответ? –

+0

Я написал это, ответ: 14. – user3508537

+0

Вы имеете в виду, что получаете 14 в качестве ответа? И что вы ожидали? И вам нужна причина, по которой ответ 14? –

ответ

0

Пожалуйста, попытайтесь понять Поток

CB cb1 = new CB("cb1",10); // Object of CB has been created 
CA ca1 = cb1;    // Referencing CA instance to CB instance 
float v1= ca1.soma(2); // Calling *soma* Method 

в сома переопределенная метод ... метод CB будет называться даже ca1.soma(2);, как CA1 на самом деле со ссылкой на CB экземпляр. Вызов метода зависит от экземпляра, а не от ссылки.

1

Это выставка того, что мы называем (полиморфизм). Пока вы устанавливаете значения CB (значения подкласса) в первом утверждении. и вызов экземпляра подкласса с помощью суперкласса ca1 refernce во втором выражении. В третьем заявлении, когда вы вызываете метод с помощью ссылки superClass ca1, вызывается метод CB подкласса из-за полиморфизма в java. поэтому результат равен 14.

0

Я знаю, что это будет 14, но почему? Может ли кто-нибудь сказать мне?

Почему, потому что это красота Polymorphism.

Шаг 1: CB cb1 = new CB("cb1",10);

Здесь значение valor = 10

Шаг 2: CA ca1 = cb1;

здесь reference из CA является reference из CB.

Шаг 3: float v1= ca1.soma(2);

Так что, когда вы звоните soma, метод CB будет называться и возвращает значение в качестве 14.0.

Пройтись: What is polymorphism?

0

Это потому, что вы создали объект класса ребенка и назначить его суперкласса следующим образом:

Father obj = new Child(); 

, если у вас есть заявление, как это, какой у вас точно так же:

CB cb1 = new CB("cb1",10); 
CA ca1 = cb1; 
float v1= ca1.soma(2); 
OR 
CA ca1 = new CB("cb1",10); 
float v1= ca1.soma(2); 

и есть метод с похожа подписью обмена в отец и ребенок, всегда будет выполняться метод ребенка.

Этот метод настолько полезен в объектно-ориентированном программировании, потому что у вас может быть много дочерних классов, которые расширяют класс Отца, и каждый из этих дочерних классов может иметь метод перезаписи с различные алгоритмы

Этот подход вызывает Polymorphism в объектно-ориентированном программировании.

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