2016-01-26 1 views
0

У меня есть массив объектов, называемый _Array. Я определил _Array [0] как объект, являющийся подклассом суперкласса. У меня есть поля в этом подклассе, которые не существуют в суперклассе, но я хочу получить доступ к этим полям из массива, который я создал в суперклассе. Это возможно? Ниже приведен пример кода. Я указал строку, с которой я связан с комментарием.Я хочу использовать поле из подкласса из массива, созданного в SuperClass

public class SuperClass { 

    String color = "Red"; 
    int favenumber = 15; 

    public static void main(String[] args) { 
     SuperClass[] _Array = new SuperClass[10]; 

     _Array[0] = new SubClass(10, 150); 

     _Array[0].age = 10; /////THIS LINE HERE IS MY QUESTION 

     System.out.println(_Array[0].getClass()); 
    } 
} 


public class SubClass extends SuperClass{ 

    public int age = 0; 
    public int weight = 0; 

    SubClass(int age, int weight) 
    { 
     this.age = age; 
     this.weight = weight;   
    } 
} 
+0

Я бы рекомендовал вместо этого использовать «Список». – Powerlord

+0

@Powerlord Как бы список позволил ему получить доступ к члену из производного класса из экземпляра базового класса? – Robert

ответ

2

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

((SubClass) _Array[0]).age = 10; 

Это бросает объект сначала SubClass, а затем доступа поле в одной строке. Вы также можете проверить, если она является подклассом:

if(_Array[0] instanceof SubClass){ 
    ((SubClass) _Array[0]).age = 10; 
} 
0

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

((SubClass) _Array[0]).age = 10; 

Однако, это довольно некрасиво:

  • Код будет вызывать InvalidCastException, если объект в этом массиве не имеет типа SubClass, и компилятор не может помочь вам поймать это.

  • Код трудно понять.

Вместо этого вы могли бы сначала создать SubClass без немедленного назначения его в массив, установить возраст по мере необходимости, а затем добавить его в _Array:

SubClass s = new SubClass(10, 150); 
_Array[0] = s; 
0

Да, вы можете, но компилятор должен жаловаться что у объекта нет поля с именем age, потому что ваш массив объявлен как содержащий суперклассы, но в runtime array [0] будет экземпляром подкласса, который эффективно имеет возраст, вам просто нужно добавить что-то, чтобы компилировать код, вы должны использовать массив [0] в подкласс. Я советую вам прочитать об объектно-ориентированном программировании и наследовании

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