[英]In java, a composite object cannot contain other objects. what does it means?
我對以下陳述感到困惑。 誰能幫我理解下面的陳述?
在java中,復合對象不能包含其他對象。 它只能引用其組成對象。 組成對象可以在對象之間共享,它們的生命周期可以獨立於復合對象的生命周期。
在其他語言中,例如C ++,Object可以被認為包含另一個對象。 如果A類的對象包含B類對象,則A將大於B.
在Java中,您只有從一個類到另一個類的引用(繼承的一部分)如果A引用B,那么B的大小並不重要,它不會影響A的大小。
這意味着在Java中, 與C ++等語言不同 ,對象不能包含其他對象,只能引用它們。
這意味着組合和聚合的概念之間沒有實際差異。 在復合中,對象的生命周期被限制在包含對象的生命周期內,並且通常包含對象創建包含的對象。 總的來說,有更多的自由。
考慮這樣的事情:
class Foo {
}
class Bar {
Foo my_foo = new Foo();
}
my_foo
是對Foo
對象的引用 ,它不是對象本身。 Foo
對象本身並不直接綁定到“封閉” Bar
對象。
Java中的對象類型變量是指向分配並在堆上生存的對象的引用。
您需要了解此設計選擇的后果:它意味着如果修改了堆上的對象,那么引用它的所有對象都會看到該更改。
因此,如果您遇到這種情況,創建地址引用的對象的代碼可以通過修改地址來更改Person的私有狀態:
class Person {
private String name; // Strings are immutable; that is important
private Address address; // Address as written below is mutable
public Person(String n, Address a) {
this.name = n;
this.address = a;
}
}
class Address {
private String street;
private String city;
private String stateOrProvince;
private String postalCode;
public Address(String street, String city, String stateOrProvince, String postalCode) {
this.street = street;
this.city = city;
this.stateOrProvince = stateOrProvince;
this.postalCode = postalCode;
}
// add getters and setters, etc.
}
如果我們通過在子類中創建對象或通過使用超類對象的引用來調用超類的方法,那么引用和聚合之間可能沒有區別。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.