2013-06-30 3 views
-1

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

public static void main(String[]args){ 

    A a = new A(2,3); 
    B b = new B(3,5,6); 

    System.out.println("A object: "); 
    a.showij(); 
    System.out.print("sum = "); 
    ((B) a).sum(); < ==== this line gives me the error, can't cast 
    System.out.println("B object: "); 
    b.showij(); 
    System.out.print("sum = "); 
    b.sum(); 

} 

public class B extends A { 

int k; 

public B(){ 
    super(); 
} 

public B(int a, int b, int c) { 
    super(a, b); 
    k = c; 
} 

public void sum(){ 
    System.out.println(i + j + k); 
} 
} 


public class A { 

int i,j; 

public A() { 

} 

public A(int a, int b){ 
    i = a; 
    j = b;  
} 

public void showij(){ 
    System.out.println("\ti: " + i + " j: " + j); 
} 
} 

* Редактирование: здесь есть все, что

+0

вы можете показать, Что '' A' и B'? – sanbhat

+0

Непонятно, что вы спрашиваете, и не видя определений 'A' и' B', я не думаю, что кто-то может понять, какие методы доступны из каких классов. –

+0

A - родительский класс java, который принимает 2 целых числа, B - это дочерний класс, который расширяет A и принимает 3 целых числа, класс B имеет сумму метода, которая суммирует целые числа i, j и k –

ответ

1

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

Вы можете отличить B от A, потому что производный класс всегда можно отличить к его суперклассу. На самом деле вам даже не нужен бросок для этого. Но это невозможно, наоборот.

Предполагая, что B расширяет A.

B b = new B(1,2,3,4,5); 
    A a = b; <- This is valid. 

    a.sum(); 

Это было бы по синтаксически правильным, но он все равно вызывает функцию суммы B, поскольку он является объектом В.

Однако в Java вас не может явно вызвать супер-функцию вне класса, как в C++. Вы должны deicde это в вашей функции, а затем вызвать его из B, как это:

class B extends A 
{ 
    @Override 
    public int sum() 
    { 
     super.sum(); 
    } 
} 

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

Update

Пример кода:

public class A 
{ 
    private int mI; 
    private int mJ; 

    public A(int i, int j) 
    { 
     mI = i; 
     mJ = j; 
    } 

    public int sum() 
    { 
     return mI+mJ; 
    } 

    public void showij() 
    { 
     System.out.println("I: "+ mI + " J: "+mJ); 
    } 

    public void print() 
    { 
     System.out.println("A called "+ sum()); 
    } 
} 

Класс B:

public class B 
    extends A 
{ 
    private int mK; 

    public B(int i, int j, int k) 
    { 
     super(i, j); 
     mK = k; 
    } 

    public int sum() 
    { 
     return super.sum()+mK; 
    } 

    public void showk() 
    { 
     System.out.println("K: "+ mK); 
    } 

    public void print() 
    { 
     System.out.println("B called "+ sum()); 
    } 
} 

Тест главная:

public class test 
{ 
    public static void main(String[] args) 
    { 
     A a = new A(1, 2); 
     B b = new B(3, 4, 5); 

     a.print(); 
     b.print(); 
     a.showij(); 
     b.showij(); 
     b.showk(); 
     a = b; 
     b.print(); 
    } 
} 
+0

, поэтому я бы объявил сумму внутри родительского класса A, а затем назовите ее, как вы ее написали? –

+0

как бы добавить переменную в класс B, если я вызову super.sum() –

+0

, вы можете определить интерфейс в базовом классе, который вычисляет сумму. Я отправляю пример того, как вы могли это сделать. – Devolus

0

Ваш код делает ком pile, потому что он действителен, чтобы передать тип его подклассу. По этой причине исключение из среды выполнения класса было вызвано.

A a = new A(2,3); --> Your instance is of type A 

((B) a).sum(); --> and you are casting it to B, which cannot happen because the object is not of type B 

Однако это утверждение работал бы

A a = new B(2,3, 6); --> As per the declaration type of instance is A but the actual instance created is B. So even if a is cast to B it works. 
((B) a).sum(); 
+0

Я сделаю это спасибо !! –

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