2017-02-17 4 views
-2

I know its via inheritance when we say B c = new C(); but what is the difference with C c = new C()Instantiate по наследству

Я знаю, что этот код работает, но почему и как это моя эпидемия. когда я сделал свою собственную математику (используя ручку и бумагу), мне дали 80. Но когда я прочитал документ OCA, я заметил, что они пришли к тому же ответу, но по разным причинам.

«Когда программа запущена, метод main() вызовет метод max() в C с параметрами 10 и 20, потому что фактический объект, на который ссылается« c », имеет класс C. Этот метод вызовет метод max() в B с параметрами 20 и 40. Метод max() в B в свою очередь вызовет метод max() в A с параметрами 20 и 40. Метод max() в A вернет 40 в метод max() в B. Метод max() в B вернет 80 к методу max() в C. И, наконец, max() из C вернет 80 в main(), которые будут распечатаны ».

Какой звук более или менее греческий для меня, пожалуйста, помогите. Хотите знать, что значит писать B c = new C(); и как он отличается от C c = new C();

+0

Какова ваша собственная математика? –

+0

'B c = new C();' vs 'C c = new C();' не влияет на вывод 'max'. – 4castle

+0

Вы также можете указать правильное объяснение своего вопроса кодом. – Darshan

ответ

0

Предположим, что мы имеем C c = new C(); B b = c;

C объект строится, но вы видите только его часть B через b. Точно так же, как разные люди видят вас по-другому: например, ваш друг видит вас в качестве друга, но ваш родитель видит вас в детстве, даже если это тот же человек (вы уникальны, но люди видят вас по-другому). Тогда разговор с этим объектом через b позволяет говорить только с его видением (только то, что определено как общедоступное в B). Конечно, объект является C, тогда, если вы используете метод B, на него отвечают его поведение C. Это называется полиморфизм (разные выглядит для одного объекта) подтипирование (взгляды связаны друг с другом включением).

Настоящим примером такого использования может быть следующее. Я предполагаю, что вы согласны с тем, что Car является Vehicule как Van является Vehicle. Тогда, когда вы строите паркинг, вы его не проектировали только для автомобилей, но для любых Vehicle, так как вы можете оставить Car или Van. Так что очень полезно см. a Car или Van как простой Vehicle.

В Java это может дать:

class VehicleThatCouldBeParked {} 
class Car extends VehicleThatCouldBeParked {} 
class Van extends VehicleThatCouldBeParked {} 

... 
VehicleThatCouldBeParked []parking = ne VehicleThatCouldBeParked[100]; // build a parking with hundred locations 
... 
Car myCar = new Car(); // some car 
... 
Van myVan = new Van(); // some van 
... 
parking[76] = myCar; // my car is parked in slot 77 
parking[34] = myVan; // my van is parked in slot 35 
... 

Это очень важно во многих ситуациях (даже в реальной жизни) не знать о некоторых деталях объектов.

0

Если вы напишете B c = new C();, результат будет таким же из-за динамического связывания. Во время выполнения тип объекта будет использоваться для разрешения метода вызова. Тип объекта c (C) все тот же, поэтому никакой разницы.

Единственное отличие в коде состоит в том, что тип ссылки был изменен.

0

Во время выполнения будет вызываться метод фактического объекта.

Разница, однако, зависит от вашего использования, где, возможно, у вас есть B, определяющий поведение и C, И для ответа D, E и F могут быть реализованы им определенным образом. Теперь, используя ссылку типа B, вы можете создать общий контракт для клиента.

Предлагает ознакомиться с базовой концепцией ООП из множества ресурсов в Интернете.

0

Вопрос, о котором вы говорите, касается полиморфизма. Если у вас есть переменная (представьте ее как поле), указывающую на класс (назовем ее A), указывая на некоторый класс, вы можете поместить в это поле любой класс, который расширяет A.

На вас еще одна проблема, я совет внимательно читать пост: Casting objects in Java

0
abstract class A { 
    protected abstract void print(); 
} 

class B extends A { 

    @Override 
    protected void print() { 
     System.out.println("I am in B"); 
    } 

    public void print1() { 
     System.out.println("No in A"); 
    } 
} 

class C extends A { 

    @Override 
    protected void print() { 
     System.out.println("I am in C"); 
    } 

    public void print1() { 
     System.out.println("No in A"); 
    } 
} 

Аа = новый C(); a.print();

// a. print1(); не может разрешить метод print1()

// B b = новый C(); несовместимый тип

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