Java是一門面向?qū)ο蟮木幊陶Z言,在Java中,傳遞參數(shù)有兩種方式:值傳遞和引用傳遞,其中引用傳遞又可以分為對象引用傳遞和數(shù)組引用傳遞。這篇文章將主要討論Java中的引用傳遞和克隆。
引用傳遞是Java中非常重要的一種參數(shù)傳遞方式,它與值傳遞不同的是,它將對象的引用傳遞給調(diào)用方法的變量,即該方法所接收的參數(shù)與傳遞進(jìn)來的參數(shù)是同一個對象的引用。因此,當(dāng)在方法中對該對象進(jìn)行修改時,原對象也會被修改,這就是所謂的“臟數(shù)據(jù)”問題。
代碼示例:
public class Person { private String name; private int age; // 省略getter和setter方法 } public class Test { public static void main(String[] args) { Person p = new Person(); p.setName("Tom"); p.setAge(20); change(p); System.out.println(p.getAge()); // 輸出結(jié)果為30 } public static void change(Person p) { p.setAge(30); } }
在示例中,我們定義了一個Person類,并在main方法中創(chuàng)建一個Person對象p,然后調(diào)用change方法,并將p作為參數(shù)傳遞給該方法。然后在change方法中修改了p的年齡屬性。由于p傳遞的是該對象的引用,修改了該對象的屬性值后,在main方法中輸出p的年齡時,輸出的結(jié)果為30。
除了引用傳遞外,Java中還有一種克隆對象的方式,即使用clone方法??寺∈侵冈趦?nèi)存中創(chuàng)建一個新的對象,新的對象與原對象的屬性值完全相同。我們可以通過實(shí)現(xiàn)Cloneable接口和重寫Object類的clone方法來實(shí)現(xiàn)克隆對象的功能。
代碼示例:
public class Person implements Cloneable { private String name; private int age; // 省略getter和setter方法 public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); return null; } } } public class Test { public static void main(String[] args) { Person p = new Person(); p.setName("Tom"); p.setAge(20); Person p2 = (Person)p.clone(); System.out.println(p2.getAge()); // 輸出結(jié)果為20 } }
在示例中,我們將Person類實(shí)現(xiàn)了Cloneable接口,并在Person類中重寫了Object類的clone方法。在main方法中,我們創(chuàng)建了一個Person對象p,并為其屬性賦值。然后我們創(chuàng)建一個新的對象p2,并將p克隆到p2中,最后輸出p2的年齡屬性值,這個輸出結(jié)果是20。