2014-02-03 5 views
3

Скажем, у вас естьJava: копировать атрибуты из одного экземпляра объекта в другой?

public class Car{ 
    private Engine m_eng; 
    public Car(){ 

    } 

    public Engine getEngine(){ 
    return m_eng; 
    } 

    public void setEngine(Engine engine){ 
    m_eng = engine; 
    } 
} 

public class Engine{ 
    private String m_name; 
    public Engine(){}; 
    public Engine(String name){ m_name = name;} 

    public String getName(){ 
    return m_name; 
    } 
    public void setName(String name){ 
    m_name = name; 
    } 
} 

public static void main(String[] args){ 
    Engine eng1 = new Engine("abc"); 
    Car car1 = new Car(); 
    car1.setEngine(eng1); 
    Car car2 = new Car(); 
    car2.setEngine(car1.getEngine()); 
} 

Вопрос: являются двигателем car1 и car2 со ссылкой на тот же экземпляр двигателя, или когда я car2.setEngine(car1.getEngine()), он автоматически делает глубокую копию car1.getEnginer() и установите автомобиль2?

+2

Вы можете проверить это с помощью '=='. –

+1

Это тот же пример. Как сказал @SotiriosDelimanolis, вы можете легко протестировать его с помощью '=='. –

+1

Если вы не сделали это намеренно, это, безусловно, не является глубокой копией на Java. –

ответ

6

car1 ---------------> ENG1

car2.setEngine(car1.getEngine()); 

результаты в

car1 -------------- -> ENG1 < ------------------ car2

тем самым указывая на тот же экземпляр двигателя

+0

Это единственный ответ, который объясняет в деталях, почему двигатель в обеих машинах - это одна и та же ссылка на объект. –

3

Нет глубокой копии. Оба экземпляра Car ссылаются на тот же экземпляр Engine.

2

Нет глубокой копии. обе ссылки ссылаются на один и тот же объект, попробуйте использовать == operator для сравнения двух объектов.

Engine eng1 = new Engine("abc"); 
    Car car1 = new Car(); 
    car1.setEngine(eng1); //here you have set the reference eng1 which is pointing to the object abc in heap 
    Car car2 = new Car(); 
    car2.setEngine(car1.getEngine());// here you are getting the reference of the object which is in the heap and setting it in car2 Object 
4

Да, это будет тот же пример.

3

Как было отмечено другими людьми, когда вы делаете

car2.setEngine(car1.getEngine()) 

engine в car2 будет той же ссылкой на объект, что и в car1. Это легко проверить с помощью ==:

System.out.println(car2.getEngine() == car1.getEngine()); //prints "true" 

когда я car2.setEngine(car1.getEngine())он автоматически делает глубокую копию car1.getEngine() и установите car2?

Будьте осторожны, так как при выполнении этого заявления нет копия ссылки на объект, это не глубокая копия ни неполную копию, это та же ссылка на объект. Это означает, что, если изменить состояние двигателя в одном из автомобилей, то двигатель в другом автомобиле модифицируется (с такой же ссылкой на объект):

public static void main(String[] args){ 
    Engine eng1 = new Engine("abc"); 
    Car car1 = new Car(); 
    car1.setEngine(eng1); 
    Car car2 = new Car(); 
    car2.setEngine(car1.getEngine()); 
    //additional code to show the last statement 
    car2.getEngine().setName("foo"); 
    System.out.println(car2.getEngine().getName()); //prints "foo" 
    System.out.println(car1.getEngine().getName()); //prints "foo" too 
    System.out.println(eng1.getName()); //prints "foo" since it is the same object reference used from the beginning 
} 

Проверьте здесь, чтобы узнать о том, как сделать копии ссылок на объекты: Java: recommended solution for deep cloning/copying an instance

+0

Благодарим вас за ответ. – qusr

+0

@qusr, пожалуйста. –

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