= 賦值 實(shí)際上已經(jīng) 就是把物理地址賦值給了a1 所以兩個(gè)物理地址是一樣的
a1.p1的變化 a也是會(huì)變化的 a.p1也是=2
這個(gè)在剛學(xué)習(xí)java的時(shí)候 都是學(xué)過的。但是真的設(shè)計(jì)到里面的時(shí)候 就懵逼了务唐。 多虧了能夠想起來旅掂。 和別人一起商量 真的是碰撞火花。腦袋轉(zhuǎn)的快、。
一樣的結(jié)果
為什么會(huì)有上面的思考树碱。 來看一個(gè)效果肯适。
private ViewGroup.LayoutParams layoutParams;
private LinearLayout.LayoutParams linearLayoutParams;
private RelativeLayout.LayoutParams relativeLayoutParams;
layoutParams = topView.getLayoutParams();
relativeLayoutParams = (RelativeLayout.LayoutParams) layoutParams;
int beginBottomMargin = relativeLayoutParams.bottomMargin;
ViewGroup中沒有bottomMargin成員變量变秦。
bottomMargin 在MarginLayoutParams中 而他又是基類ViewGroup.LayoutParams的子類。很繞框舔。
并且
RelativeLayout.LayoutParams
public static class LayoutParams extends ViewGroup.MarginLayoutParams {
我們可以分析出 這也就是在有的類中 用ViewGroup當(dāng)做聲明類蹦玫。在具體的代碼中去判斷是哪種類型。然后去轉(zhuǎn)化刘绣。轉(zhuǎn)化別的值樱溉。 實(shí)際上ViewGroup 也已經(jīng)變化了。所以就可以吧ViewGroup當(dāng)做一個(gè)公共類了纬凤。
聲明了一個(gè)對(duì)象福贞。沒有new的話 就沒有分配物理地址。 =的話停士。物理地址一樣挖帘。但是還不是一個(gè)對(duì)象
先說明幾點(diǎn) == 比較的是物理地址 。equale() 比較的值
A a = new (1,2)恋技;
A b = new (1,2)拇舀;
a.equlas (b)true , true 兩個(gè)對(duì)象的值 相等 但是物理地址不相等
a==b false
如果我想 a b 一個(gè)物理地址◎叩祝控制一個(gè)讓屬性變化骄崩。另一個(gè)對(duì)象值就變化。 那么就用
= 應(yīng)為 這是賦值薄辅、要拂。 指向的同一個(gè)物理地址。
如果你想讓ab同一個(gè)值站楚。但是不是一個(gè)物理地址脱惰。 可以用clone 或者直接像上面的一樣。同一個(gè)構(gòu)造源请。 或者用set方法枪芒。
以前判斷值相不相等彻况。if(a==null&a.equlas(b)){}
說道這里 順道說說強(qiáng)制轉(zhuǎn)化
記住一句
父類引用指向子類對(duì)象。
父類A 子類B
A a = new B()舅踪;
= 都是右面指向左面
B是子類 A 是基類 相當(dāng)于 A a指向了B 纽甘, 也就是a這個(gè)對(duì)象指向了B, 或者說明白點(diǎn)B的地址被A指定了
父類引用指向子類對(duì)象 這個(gè)叫向上轉(zhuǎn)型
B aa= (B)a; 這個(gè)就像向下轉(zhuǎn)化
(這個(gè)是有前提的 a 只有是 = newB的時(shí)候 才成立 要不會(huì)報(bào)錯(cuò) 比如 A a = newA()這個(gè)就會(huì)報(bào)錯(cuò) 抽碌, 他不叫 向下轉(zhuǎn)化 )
為什么?
解釋 子類引用不能指向父類對(duì)象
(用飛機(jī)起飛的理解悍赢。就是向上飛沒事。下飛 就會(huì)有問題货徙。 所以 從右到左左权。
#向上轉(zhuǎn)沒問題。 父類 = 子類 方向是從右到左痴颊。 子類到父類 向上了赏迟。沒問題
向下轉(zhuǎn)就會(huì)有問題。)
A a = new B()蠢棱; 這個(gè)是先決條件锌杀, 沒有這句話。 談不上子類父類之間的轉(zhuǎn)化泻仙。
單純的看
A a = new A Bb = new B; B 是子類
a = (A)b糕再; 可以
b= (B)a; 不可以 報(bào)錯(cuò)
1父類引用指向子類對(duì)象,而子類引用不能指向父類對(duì)象
2子類對(duì)象直接賦給父類引用叫upcasting向上轉(zhuǎn)型玉转,向上轉(zhuǎn)型不用強(qiáng)制轉(zhuǎn)換突想。
如:A a = new B();
3把指向子類對(duì)象的父類引用賦給子類引用叫向下轉(zhuǎn)型(downcasting),要強(qiáng)制轉(zhuǎn)換究抓。
如:f1 就是一個(gè)指向子類對(duì)象的父類引用猾担。把f1賦給子類引用s1即 B b = (B)a;
其中f1前面的(Son)必須加上漩蟆,進(jìn)行強(qiáng)制轉(zhuǎn)換垒探。
(new 這個(gè)叫做Xx的對(duì)象 , 由于有 =號(hào) 怠李。所有 是后面的對(duì)象賦值給前面的某個(gè)類圾叼,從前面看就叫做。父類引用指向子類捺癞。 懂了吧夷蚊。 從前面叫引用。從后面叫做賦值 這就是=號(hào)髓介。)
這個(gè)
3 不理解的 可以 先這么理解惕鼓。因?yàn)閍本身就是new B。 所以 你再賦值給B 沒有問題唐础。
但是A a = new A Bb = new B; 就不可以箱歧。 但是 你的b是子類矾飞。
子類不可以指向父類
在 牢記一個(gè)概念 強(qiáng)轉(zhuǎn)和多態(tài)的區(qū)別
A a =new B(); 多態(tài)
編譯時(shí)期 a 是A類型 運(yùn)行時(shí)期。 就是B類型
a 對(duì)象呀邢。只有B的特性洒沦,A通過子類的實(shí)例化。來實(shí)例化自己价淌。 a就是B類型(B是A得子類)
和
B b = new B;
A a = (A)b申眼; 向上轉(zhuǎn)化。
new B 在內(nèi)存中開辟一個(gè)新的地址
b 強(qiáng)轉(zhuǎn)成A蝉衣, a 就是A類型括尸。
可以寫成
A a;
a= A(b)
a 指向了B對(duì)象的地址病毡。 a就是A 對(duì)象
一開始搜的百度答案 看的一個(gè)哥們的解釋濒翻。完全懵逼了
多態(tài)過程中。 并沒有轉(zhuǎn)化的過程剪验‰群福看到new的時(shí)候這就是實(shí)例化了一個(gè)B
轉(zhuǎn)過的實(shí)際上有強(qiáng)轉(zhuǎn)的過程。b轉(zhuǎn)化a 就變了A類型功戚。
A a =new B(); 以前不會(huì)這么舉例子。似嗤。 完全懵逼了啸臀。