Копировать объекты в Java
В этом посте будут обсуждаться различные методы копирования объектов в Java. Копирование объекта — это создание копии существующего объекта для изменения или перемещения скопированного объекта без воздействия на исходный объект.
В отличие от C++, объекты Java передаются не по значению, а по значению передаются их ссылки. Рассмотрим следующие фрагменты кода,
Object ob1 = new Object();
Object ob2 = ob1;
Оба ob1 а также ob2 теперь указывает на тот же объект, так как это просто ссылка на исходные данные; здесь не происходит копирования.
Object ob = new Object();
fun(ob);
Это также просто ссылка на исходные данные, поскольку методы в Java всегда передаются по значению. Однако передается значение ссылочной переменной.
Так как данные здесь примитивные, то просто копируется значение примитивного типа.
Иногда необходимо создать копию объекта для использования в приложении. В этом посте мы обсудим несколько способов достижения этого. Прежде чем мы начнем, давайте поговорим о мелком и глубоком копировании объектов.
1.Поверхностное копирование (копирование поля за полем)
Одним из способов копирования объекта является мелкая копия в котором мы выделяем новый неинициализированный объект и копируем в него все поля (атрибуты) из исходного объекта. Это не всегда приводит к желаемому поведению, когда значение поля является ссылкой на объект, поскольку оно копирует ссылку и, следовательно, ссылается на тот же объект, что и исходный объект. Таким образом, ссылочные объекты являются общими, поэтому, если один объект изменен, изменение видно в другом.
Альтернативой мелкому копированию является глубокая копия, где новые объекты создаются для любых объектов, на которые есть ссылки, а не для ссылок на копируемые объекты. Глубокая копия предпочтительнее мелкой копии.
Существует несколько подходов к копированию объекта, как описано ниже:
1. Использование конструктора копирования или фабрики
С помощью Копировать конструктор, мы можем определить действия, выполняемые компилятором при копировании объекта класса. Любая реализация конструктора копирования должна выполнять глубокое копирование для любых объектов, на которые есть ссылки в классе, путем создания новых объектов и копирования значений для примитивных и неизменяемых типов. Обычно он принимает только один параметр, который является еще одним экземпляром того же класса.
Мы также можем использовать метод статической фабрики копий, чтобы по существу делать то же самое, что и метод конструктора копирования. Оба подхода показаны ниже:
Как обратится к экземпляру класса?
Изучаю java сам, подскажите как обратится к другому классу кроме как объявляя его заново?
public class Dog < private int age; public int getAge() < return age; >public void setAge(int age) < this.age = age; >>
public class Cat < private int age; public int getAge() < return age; >public void setAge(int age) < this.age = age; >public void question() < // как тут обратится к Dog? Dog dog = new Dog(); // так? >>
Простой 2 комментария
Передать экземпляр класса в то место, где вы хотите к нему обратиться.
Вопрос тут в том, с какой целью необходимо обратиться из Cat к Dog?
Вы работаете с экземпляром класса, то есть объектом.
Если хотите работать с данными класса Dog в Cat, то создавайте объект, то есть как у вас и написано
1) передать этот класс в качестве аргумента
2) Если вам нужно создать экземпляр класса и что-либо с ним сделать, то да:
но если вам нужно обратиться к определенному ранее созданному экземпляру класса, то:
public void question(Dog dog)
public class Main < public static void main(String[] args) < Cat cat = new Cat(); cat.setName("Vasyka"); Dog dog = new Dog(); dog.setName("Barbos"); Human human = new Human(); human.setCat(cat); human.setDog(dog); System.out.println(human.getDog().voice()); System.out.println(human.getCat().voice()); >> interface Animal < String voice(); >abstract class Pet implements Animal < private String name; public String getName() < return name; >public void setName(String name) < this.name = name; >> class Dog extends Pet < @Override public String voice() < return getName() + " says Woof"; >> class Cat extends Pet < @Override public String voice() < return getName() + " says Meaw"; >> class Human < private Pet cat; private Pet dog; public Pet getCat() < return cat; >public void setCat(Pet cat) < this.cat = cat; >public Pet getDog() < return dog; >public void setDog(Pet dog) < this.dog = dog; >>
public void question(Dog dog)< //Тут соответственно, то что ты хочешь от пса >
Cat brit = new Cat(); Dog mops = new Dog(); brit.question(mops) //кот обратился к собаке через метод question
Как передать объект в метод java
Для передачи объекта в метод необходимо объявить параметр метода, который будет принимать объект нужного типа. Например:
public void someMethod(MyObject obj) // тело метода >
В данном примере метод someMethod принимает объект класса MyObject , передаваемый в качестве аргумента метода. Чтобы передать объект в метод, необходимо создать экземпляр класса, и использовать его в качестве аргумента метода. Например:
MyObject obj = new MyObject(); someMethod(obj);
Здесь мы создали экземпляр класса MyObject и передали его в метод someMethod . Внутри метода someMethod мы можем работать с переданным объектом, вызывая его методы или обращаясь к его полям.
Как передать объект из класса Java в другой класс Java
Я хочу получить доступ к этому мгновению ab в другом классе XYZ , Как сделать этот объект доступным в классе XYZ?
6 ответов
Трудно ответить на ваш вопрос без более конкретной информации о вашей проблеме, но это, безусловно, сработает:
Вы можете использовать setter для инициализации переменной экземпляра в вашем другом классе, если вы хотите использовать ее везде в этом классе:
class someClass < void someMethod() < ABC ab = new ABC(); XYZ xyz = new XYZ(); xyz.setABC(ab); >> class XYZ < ABC ab; //. void setABC(ABC ab) < this.ab = ab; >//. void doSomething() < // do something with instance variable ab >>
Есть несколько способов сделать то, что вы хотите достичь. Некоторые из них могут быть следующими:
Передача ссылки на объект через constructor
Здесь вы явно передадите ссылку на ваш ссылочный класс при создании объекта фактического класса.
public class ActualClass < private ReferenceClass refClassObject; /** * Passing through a constructor */ public ReferenceClass(ReferenceClass refClassObject)< this.refClassObject = refClassObject; >> class ReferenceClass < /** * Your implementation of the class */ >
Использование методов получения / установки
При таком подходе вы передадите ссылку на ваш объект через explict public setXX() методы. Этот подход является более гибким, потому что вы можете обновить эталонный объект, как и когда вы хотите (подумайте polymorphism ). В качестве примера:
public class ActualClass < private ReferenceClass refClassObject; public ActualClass()< >public void setReferenceClass(ReferenceClass refClassObject) < this.refClassObject = refClassObject; >public ReferenceClass getReferenceClass() < return refClassObject; >> class ReferenceClass < /** * Your implementation of the class */ >
Использование комбинации конструкторов и геттеров / сеттеров
Для большей гибкости вы можете инициализировать объект класса Actual ссылкой. Однако, если вы также хотите сохранить возможность изменения ссылки на объект на более позднем этапе, используйте комбинацию #1 и #2, указанную выше.
public class ActualClass < private ReferenceClass refClassObject; public ActualClass()< >public ActualClass(ReferenceClass refClassObject) < this.refClassObject = refClassObject; >public void setReferenceClass(ReferenceClass refClassObject) < this.refClassObject = refClassObject; >public ReferenceClass getReferenceClass() < return refClassObject; >> class ReferenceClass < /** * Your implementation of the class */ >
Какой из них выбрать? Ну, это будет зависеть от вашей реализации и требований.
Как передать созданный объект другому классу Java
Я создал экземпляр объекта в одном из моих классов для программы Java. Как передать тот же экземпляр этого объекта другому классу?
Нужно ли мне делать что-то вроде создания некоторого типа метода получения в исходном классе, чтобы передать объект другому классу?
4 ответа
Чтобы «передать» его, вам понадобится метод или конструктор в другом классе, который может его принять:
public class Other < // either public Other(MyClass obj) < // do something with obj >// or public void method(MyClass obj) < // do something with obj >>
Затем вызовите конструктор / метод:
MyClass x = new MyClass(); Other other = new Other(); other.method(x);
Есть много способов передать ссылку на один объект другому. Самые простые и распространенные способы:
- как параметр конструктора,
- как параметр метода установки; например setFoo(Foo foo) , чтобы установить атрибут «foo», или
- поскольку метод «добавления» в передаваемый объект будет добавлен в коллекцию; например addFoo(Foo foo) .
Кроме того, существует множество более сложных шаблонов, в которых объекты передаются с использованием публикации / подписки, обратных вызовов, фьючерсов и т. Д.
Наконец, есть несколько уловок, которые можно использовать для «переброски» объектов через границы абстракции . которые, как правило, являются плохой идеей.
Предположим, вы хотите передать объект класса A классу B . Теперь вы создали такой объект:
А теперь в вашем классе B вы можете написать метод для приема объекта A . Это должно быть public , и вы можете сделать это static , если хотите.
Если вы хотите передать object в B , вы должны захотеть что-то с ним сделать, верно? Поэтому вы должны назвать свой метод соответствующим образом. Вероятно, вы захотите назначить поле типа A (назовем это fieldA ) в B . (или, может быть, это не то, что вам нужно, но я использую это для примера)
public void setFieldA (A a)
Вы можете вызвать этот метод следующим образом:
anObjectOfClassB.setFieldA (object);
Конечно, вам не нужен anObjectOfClassB , если он статический.
Вы можете передать объект через конструктор другого класса.