На ваш вопрос есть общий и конкретный ответ.Прагматично, мы должны сначала охватить конкретный.
Вы должны сделать что-то в соответствии с этим.
public class SpecialImage {
// The thing isn't a manipulator, it's a BufferedImage
// I would suggest renaming this for ease of maintenance
BufferedImage manipulator;
public SpecialImage(String path) {
manpiulator = ImageIO.read(new File(path));
}
}
Если вы не знаете, что ваш подкласс будет иметь то же "поведение", что иродительский класс, избегайте подклассов.Помещая BufferedImage
в свой класс в качестве поля, вы используете технику, называемую «Композиция», и, как правило, если сомневаетесь, предпочитает композицию наследованию .
Наследование работает лучше всего.когда классы следуют принципу подстановки Лискова , или почти в английских терминах, когда они оба имеют одинаковое «поведение», но модифицированные реализации этого «поведения».Например, BufferedImage
s и VolatileImage
s ведут себя точно так же, как java.awt.Image
s, но один делает это с доступным буфером, а другой не гарантирует доступность буфера (или даже существование буфера).
Ниже приводится более общий ответ на ваш вопрос.
Object
s моделируются как экземпляры "вещей", где "вещи" моделируются с помощью шаблона, называемого Class
.Построение - это процесс создания новой «вещи» из ее шаблона или, в объектно-ориентированной терминологии, создания Object
из ее Class
.
С этим пониманием вы можете видеть, что конструирование «вещи»«к существующей» вещи - в лучшем случае неловкий английский, а в худшем - почти бессмыслица.Вероятно, вы имели в виду один из
- Как мне создать копию "вещи"?
Если вам нужна вторая копия объекта, вам нужнопредоставить «конструктор копирования», который является общим термином для конструктора, который возвращает вторую эквивалентную копию первой «вещи».
public class Car {
private int speed;
public Car(int mph) {
// this is an optional keyword. I included it for clarity.
this.speed = mph;
}
// This is the copy constructor
public Car(Car other) {
this.speed = other.speed;
}
public int getSpeed() {
return speed;
}
}
- Как мне сделать вторую ссылку насуществующая «вещь»?
Вы создаете новое имя и присваиваете его старому имени.Старое имя (под обложками) даст ссылку, которая станет новым значением нового имени.Ссылки в основном скрыты, так как все операции над именами автоматически «разыменовываются».
Car myCar = new Car();
Car yourCar = myCar; // assuming it is a shared car.
Чтобы две части кода ссылались на одну и ту же «вещь», вам не нужно использовать конструктор, как это было бысоздать две вещи.Вместо этого вы используете два разных «имени» или «ссылки».Ссылки на Java похожи на указатели на других языках, за исключением того, что они ограничены рядом интересных способов.
Они не относятся к реальным ячейкам памяти.Это позволяет собирать мусор в компактную память без необходимости переписывать неизвестное количество ссылок.Сжатие памяти включает в себя перемещение хранилища данных объекта с одного начального адреса на другой начальный адрес, и при использовании «идентификатора ссылки на память» вместо фактического адреса, единственный физический адрес, который необходимо изменить, - это адрес в «идентификаторе ссылки на память».таблица "to" физический адрес "(эта таблица недоступна из программы, написанной пользователем).
Им нельзя назначать произвольные местоположения.Именованная ссылка имеет объявленный тип, а объект для назначения имеет объявленный тип.Строгая проверка типов компилятора и среды выполнения гарантирует, что для именованной ссылки могут быть назначены только совместимые типы.Таким образом, невозможно привести произвольный объект, на который должна ссылаться несовместимая именованная ссылка.
Математические операции запрещены, или, точнее, математические операции не реализованы.Это последнее ограничение предотвращает смещение именованной ссылки таким образом, чтобы оно могло ссылаться на другой объект с возможно другим несовместимым типом.
Имея в виду эти элементы, ваш первоначальный план будет хорошо работать; реальный вопрос в том, как вы достигнете этих целей. Если ваше изображение «GrayScale» является таким же , что и изображение, отличное от GrayScale, то использование того же класса (с методом toGrayScale()
) является хорошим выбором для дизайна. Если ваше изображение «GrayScale» отличается от вашего изображения, отличного от GrayScale, тогда toGrayScale()
возвращает второе изображение - хороший выбор дизайна.
Когда объектно-ориентированное программирование начинает разваливаться, это когда вы не выбираете эти варианты дизайна. Вы видите свой Объект как «панель памяти» и избегаете создания новых объектов и отбрасывания старых объектов, предпочитая поддерживать конкретную «панель памяти». Если вы не моделируете планшеты памяти, это не объектно-ориентированный дизайн, и поэтому вы будете бороться со своей объектно-ориентированной средой на каждом этапе пути к решению, которое даст вам желаемый результат.
Удачи вам в усилиях.