日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
在Java的繼承中,你是否有這樣的疑惑?

一、問(wèn)題

有FirstChild和SecondChild兩個(gè)類(lèi),因?yàn)槠渲械膶傩詎ame、code等是相同的,為此抽出了一個(gè)父類(lèi)BaseDO,如下:

創(chuàng)新互聯(lián)建站專(zhuān)注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站建設(shè)、成都做網(wǎng)站、安順網(wǎng)絡(luò)推廣、小程序定制開(kāi)發(fā)、安順網(wǎng)絡(luò)營(yíng)銷(xiāo)、安順企業(yè)策劃、安順品牌公關(guān)、搜索引擎seo、人物專(zhuān)訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)建站為所有大學(xué)生創(chuàng)業(yè)者提供安順建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:www.cdcxhl.com

package com.example.day01;

public class BaseDO {
private String name;
private String code;
private String field1;
private String field2;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getCode() {
return code;
}

public void setCode(String code) {
this.code = code;
}

public String getField1() {
return field1;
}

public void setField1(String field1) {
this.field1 = field1;
}

public String getField2() {
return field2;
}

public void setField2(String field2) {
this.field2 = field2;
}

@Override
public String toString() {
return "BaseDO{" +
"name='" + name + '\'' +
", code='" + code + '\'' +
", field1='" + field1 + '\'' +
", field2='" + field2 + '\'' +
'}';
}
}

FirstChild

package com.example.day01;

public class FirstChild extends BaseDO{
private String myField1;
private String myFiled2;

public String getMyField1() {
return myField1;
}

public void setMyField1(String myField1) {
this.myField1 = myField1;
}

public String getMyFiled2() {
return myFiled2;
}

public void setMyFiled2(String myFiled2) {
this.myFiled2 = myFiled2;
}

@Override
public String toString() {
return "FirstChild{" +
"myField1='" + myField1 + '\'' +
", myFiled2='" + myFiled2 + '\'' +
"} " + super.toString();
}
}

SecondChild

package com.example.day01;

public class SecondChild extends BaseDO{
private String secondField1;
private String secondField2;

public String getSecondField1() {
return secondField1;
}

public void setSecondField1(String secondField1) {
this.secondField1 = secondField1;
}

public String getSecondField2() {
return secondField2;
}

public void setSecondField2(String secondField2) {
this.secondField2 = secondField2;
}

@Override
public String toString() {
return "SecondChild{" +
"secondField1='" + secondField1 + '\'' +
", secondField2='" + secondField2 + '\'' +
"} " + super.toString();
}
}

從上面可以看到兩個(gè)子類(lèi)除了含有父類(lèi)的屬性外還有自己各自的屬性,現(xiàn)在有個(gè)需求是這樣的,要實(shí)例化這兩個(gè)子類(lèi)。

二、如何解決

2.1、分別初始化

何為分別初始化,所謂分別初始化就是各自初始化自己的,為每個(gè)子類(lèi)分別實(shí)現(xiàn)初始化其屬性的方法,如下

FirstChild fillFirstField(FirstChild firstChild){

firstChild.setName("apple");
firstChild.setCode("apple");
firstChild.setMyField1("first Child");

return firstChild;
}
SecondChild fillSecondField(SecondChild secondChild){

secondChild.setName("apple");
secondChild.setCode("apple");
secondChild.setSecondField1("second Child");
return secondChild;
}

這里作為演示對(duì)屬性沒(méi)有全部賦值,如果兩個(gè)子類(lèi)相同的屬性比較多,那么賦值起來(lái)會(huì)比較麻煩,而且兩個(gè)方法的代碼重復(fù)度會(huì)很高。

2.2、抽象出一個(gè)公共的方法

既然,已經(jīng)為兩個(gè)子類(lèi)抽象出了公共的屬性,那么順著這個(gè)思路下去,也可以抽象出一個(gè)公共的方法為這些公共的屬性賦值,即為父類(lèi)填充屬性,

BaseDO fillField(BaseDO baseDO){
baseDO.setName("apple");
baseDO.setCode("apple");
return baseDO;
}

好了,在進(jìn)行子類(lèi)初始化的時(shí)候已經(jīng)有一個(gè)方法可以初始化其公共屬性,那么接下來(lái)的事情,就是初始化其自己的屬性即可,

下面就實(shí)例化FirstChild,然后初始化其公有屬性

FirstChild firstChild=new FirstChild();
fillField(firstChild);
firstChild.setMyField1("first Child");
System.out.println(firstChild);

打印出firstChild的結(jié)果如下

可以看到已經(jīng)把公共屬性name、code和特意屬性myField1進(jìn)行賦值,完成了上面的需求。

可能有些同學(xué)會(huì)使用下面的寫(xiě)法,

可以看的該種寫(xiě)法存在錯(cuò)誤,提示我們需要的類(lèi)型是FirstChild,但是我們提供的BaseDO,我們知道fillField方法返回的BaseDO類(lèi)型,一個(gè)父類(lèi)型的實(shí)例不可賦值給子類(lèi)型的引用( 相反一個(gè)子類(lèi)型的實(shí)例可以賦值給父類(lèi)型,典型的多態(tài) ),這怎么辦那,向下類(lèi)型轉(zhuǎn)換,沒(méi)錯(cuò),如下

細(xì)心的小伙伴會(huì)問(wèn),那為什么fillField方法可以接受FirstChild的實(shí)例那,哈哈哈,前邊紅字提到了多態(tài)。

怎么樣,是不是對(duì)多態(tài)又有了更深的理解。

延申一點(diǎn)

從fillField方法來(lái)看,我們知道該方法可以不設(shè)返回值,為什么可以不設(shè)返回值,因?yàn)橐妙?lèi)型,不是傳值,可以理解為引用,哈哈,所以叫引用類(lèi)型,在fillField方法中對(duì)其引用類(lèi)型的參數(shù)進(jìn)行了修改,那么在這個(gè)方法執(zhí)行完了之后,引用這個(gè)參數(shù)的其他引用同樣可以感知到其修改,下面的寫(xiě)法就是很好的佐證,

是不是又加深了引用和引用的對(duì)象間的關(guān)系,多說(shuō)一句引用在jvm的內(nèi)存模型中是在哪個(gè)區(qū),引用指向的對(duì)象那?

三、總結(jié)

本文分析了在開(kāi)發(fā)過(guò)程中,遇到公有屬性很多的多個(gè)實(shí)體類(lèi)時(shí)的設(shè)計(jì)思路,抽出公有的父類(lèi),由父類(lèi)承擔(dān)公有屬性。并且在進(jìn)行屬性填充的時(shí)候,如果公有屬性的值是一樣的,那么可以抽出公共的方法進(jìn)行屬性填充,這里又提到了多態(tài)。

  1. 抽出公有屬性;
  2. 對(duì)多態(tài)的理解;
  3. 向下類(lèi)型轉(zhuǎn)換;
  4. 引用類(lèi)型的傳遞;

最后,廣大讀者們,對(duì)于類(lèi)似的需求,你們有更好的設(shè)計(jì)思路嗎,歡迎踴躍討論。


網(wǎng)站欄目:在Java的繼承中,你是否有這樣的疑惑?
分享鏈接:http://www.dlmjj.cn/article/dpsgesg.html