2015-06-25 2 views
2

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

Программа будет добавлять, удалять, искать и отображать растения.

Предположим, что я должен создать завод высшего класса и три разных растения (цветы, гриб, сорняк), чтобы простираться от растения.

ВОПРОС: Я хочу, чтобы создать растение ArrayList или Array. Возможно ли это? или что было бы наиболее логичным?

Код, приведенный выше, - это просто точка. Ни в коем случае не правильный.

class Plant{ 
//atributes 
//constructor 
//setters and getters 
} 


class Flower extends Plant{ 
//with some different attributes 
} 


class Fungus extends Plant{ 
//with some different attributes 
} 

class Weed extends Plant{ 
// with some different attributes 
} 


public class PlantList{ 
public static void main(String[] args){ 

//HERE is where I'm confused 

ArrayList<Plant> plantList= new ArrayList<Plant>(); 


// OR 

Plant plantList= new Plant[25]; 

plantList[0] = new Flower(); 
plantList[1] = new weed(); 
plantList[2] = new fungus(); 

//or completely way off? 

//add() 
//remove() 
//search() 
//display() 

} 

Может кто-нибудь объяснить мне, как добавить дерево разных типов растений в массив или массив?

+0

Некоторые небольшие овалы консистенции в вашем коде; выберите одно написание 'plant' –

+0

@BenKnoble, как я уже упоминал выше, это был не код, который бы работал. Я пытался набрать очень быстро. Не думал, что это кого-нибудь обидит. Спасибо за вашу помощь в любом случае! –

+0

Нет без обид; его точка гордости в SO, что вопросы (и ответы) выглядят профессионально. Если у вас есть шанс, вы можете очистить его, как вы знаете. –

ответ

4

По умолчанию вы можете поместить любой объект в список, но из Java 5 Java Generics позволяет ограничить типы объектов, которые вы можете вставить в список.

List<Plant> list = new ArrayList<Plant>(); 

Этот список теперь может содержать только экземпляры растений. И это полиморфизм между массивами.

Один раздражает аспект по этой теме является то, что хотя Flower является подтипом Plant, это вовсе не означает, что ArrayList<Flower> является подтипом ArrayList<Plant>.

Что вы можете сделать, это

List<Plant> list = new ArrayList<Plant>(); 

Тогда

Plant flower1 = new Flower(); 

Plant weed1 = new Weed(); 

list.add(flower1); 
list.add(weed1); 

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

+0

Что делать, если я пишу это нечто вроде этого 'List list = new ArrayList();' 'list.add (flower1);' ????? –

+0

Таким образом, у вас есть список массивов, который может иметь любые объекты, которые я мог бы добавить, например, как String 'list.add (« flower? »)', Поскольку вы можете видеть, что этот подход не является безопасным по типу. –

3

Вы можете хранить ссылки на экземпляры любого подкласса Plant в массиве Plant[] или ArrayList<Plant>.

Массив - это один из способов представления коллекции фиксированного размера. Ваш пример иллюстрирует, как помещать ссылку на растение в массив.

ArrayList<Plant> поддерживает коллекцию, размер которой может быть изменен по мере необходимости. Вы можете поставить ссылку на завод в нее несколько способах, в том числе метода add():

plantList.add(new Flower()); 

Как и в стороне, это принято в Java, чтобы назвать все классы с начальным символом верхнего регистра.

+0

Спасибо.Я это знаю. Я пытался набрать слишком быстро, и код был просто для того, чтобы понять. –

+0

@ Энди Томас, что, если я напишу это как-то вроде этого 'List list = new ArrayList();' 'list.add (flower1);' ????? –

+0

@BilalMaqsood - Тогда вы будете использовать «сырой тип». Необработанные типы поддерживаются для обратной совместимости с кодом, написанным до Java 1.5. Они не поддерживают проверку типов параметрируемых типов во время компиляции. Получатель списка может помещать в него * любую * ссылку, а не только ссылки на Завод. –

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