2015-09-10 5 views
1

я запутался о коде приведенном ниже, где Player является abstract класс:Java: объект абстрактного класса

private void cbxTeamAItemStateChanged(java.awt.event.ItemEvent evt) {           
     if (evt.getStateChange() == ItemEvent.SELECTED) { 
      Player p = (Player) evt.getItem(); 
      if(P.getTipo().contains("Defense")){ 
       lblDefense1.setText("Skill:"); 
      } 
     } 
} 

Если в Java I не создать Object из в abstract класса, почему это работает?

Не является ли эта строка экземпляром Player?

Player p = (Player) evt.getItem(); 

ответ

2

Вы вводите пустую переменную в экземпляр. p является переменной игрока, а evt.getItem() возвращает конкретный экземпляр типа типа, который расширяет Player (или реализует Player, если Player был интерфейсом). Какой точный подтип игрока не важен, поскольку все, что вам нужно знать, это то, что он придерживается контракта с абстрактным классом игрока и, следовательно, имеет все необходимое поведение игрока.

+1

Ow! Понял! Это было бы так же Player P = new Defense()? (в моем случае Defense extends Player) – Mucida

+0

@Mucida: да, похоже на это. –

+0

Но почему я должен использовать его для (Player), а не только: Player p = evt.getItem()? – Mucida

3

Переменная p содержит ссылку на экземпляр подкласса абстрактного класса Player. Поскольку Player является абстрактным классом, его экземпляр не может быть создан. Однако экземпляры подкласса абстрактного класса Player все еще могут быть привязаны к переменной p. См. https://www.computingnotes.net/java/abstract-class-in-java/

1

У вас могут быть объекты с абстрактным классом в качестве их типа, даже если вы не можете напрямую создавать абстрактные классы. evt.getItem() имеет конкретный, не абстрактный тип, который возвращается под капот, и этот тип реализует Player с определенным кодом. Если когда-нибудь они захотят изменить имя этого класса, они могут, и это не повлияет на этот код, если он продолжит реализацию всех методов в Player. В принципе, это абстрагирует специфику этого объекта от вас и только уверяет вас, что где-то кто-то реализовал все методы, которые должен иметь Player в объекте.

1

Вы не можете создать экземпляр класса abstract, но вы можете настроить его на родителя. В вашем случае evt.getItem() возвращает child (, т. Е.TennisPlayer), и вы передаете его классу суперкласса Player, который действителен.

Рассмотрим следующий пример,

class Mango extends Fruit {} 

abstract class Fruit {} 

public class Test { 

    public static void main(String[] args) { 
     Mango mango = new Mango(); 
     //Note that mango is also fruit 
     Fruit fruit = (Fruit) mango; 
    } 

} 

Примечание это действует до до литом ребенка его родителей, потому что (т.е.) каждый Mango является безусловноFruit.

+0

Humm. Вот почему cast (Player) evt.getItem() может «найти» защиту подкласса? – Mucida

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