最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解決lombok的@Data注解無法打印繼承的父類信息問題

 更新時間:2024年11月06日 09:24:04   作者:樘棣寂寂  
在Java編程中,使用@Data注解可能導(dǎo)致子類繼承父類屬性后,打印只顯示子類信息不顯示父類信息,問題源于@Data注解作用域僅限于當(dāng)前類,解決方法包括使用@ToString(callSuper=true)注解或重寫toString方法

問題場景

子類StudentResp繼承父類PersonResp,子類也擁有了父類的屬性。

給子類中繼承的父類屬性的賦值,但是打印了以后只會顯示子類信息,父類信息不顯示。

  • 子類:學(xué)生類繼承父類人員類
@Data
public class StudentResp extends PersonResp {

    /**
     * 學(xué)號
     */
    private Integer studentId;

    /**
     * 成績
     */
    private Integer score;
}
  • 父類:人員類
@Data
public class PersonResp {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年齡
     */
    private Integer age;
}

代碼中給子類以及繼承的父類信息賦值然后打印

    public static void main (String[] args) {

        StudentResp studentResp = new StudentResp();
        //學(xué)生子類賦值
        studentResp.setStudentId(1000000000);
        studentResp.setScore(92);
        //父類賦值
        studentResp.setName("風(fēng)清揚");
        studentResp.setAge(18);
        //打印學(xué)生子類信息
        System.out.println(studentResp);
 
    }

打印出來只有子類自己的屬性,父類的屬性沒有出來

問題分析

單獨獲取子類中父類的信息(name跟age),觀察打印看有沒有值

    public static void main (String[] args) {

        StudentResp studentResp = new StudentResp();
        //學(xué)生子類賦值
        studentResp.setStudentId(1000000000);
        studentResp.setScore(92);
        //父類賦值
        studentResp.setName("風(fēng)清揚");
        studentResp.setAge(18);

        //打印父類信息
        System.out.println("姓名:" + studentResp.getName());
        System.out.println("年齡:" + studentResp.getAge());
    }

打印出來發(fā)現(xiàn)是有值的

確認了繼承本身是沒有問題的,繼承的父類的值都可以給上,也能獲取到,隨后直接打開target對應(yīng)目錄下的StudentResp子類,觀察編譯后的代碼

public class StudentResp extends PersonResp {
    private Integer studentId;
    private Integer score;

    public StudentResp() {
    }

    public Integer getStudentId() {
        return this.studentId;
    }

    public Integer getScore() {
        return this.score;
    }

    public void setStudentId(final Integer studentId) {
        this.studentId = studentId;
    }

    public void setScore(final Integer score) {
        this.score = score;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof StudentResp)) {
            return false;
        } else {
            StudentResp other = (StudentResp)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$studentId = this.getStudentId();
                Object other$studentId = other.getStudentId();
                if (this$studentId == null) {
                    if (other$studentId != null) {
                        return false;
                    }
                } else if (!this$studentId.equals(other$studentId)) {
                    return false;
                }

                Object this$score = this.getScore();
                Object other$score = other.getScore();
                if (this$score == null) {
                    if (other$score != null) {
                        return false;
                    }
                } else if (!this$score.equals(other$score)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof StudentResp;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $studentId = this.getStudentId();
        int result = result * 59 + ($studentId == null ? 43 : $studentId.hashCode());
        Object $score = this.getScore();
        result = result * 59 + ($score == null ? 43 : $score.hashCode());
        return result;
    }

    public String toString() {
        return "StudentResp(studentId=" + this.getStudentId() + ", score=" + this.getScore() + ")";
    }
}

看到這里,大多數(shù)同學(xué)應(yīng)該已經(jīng)定位到出現(xiàn)問題的原因了。

最后的toString()方法可以明確的看到這里只取了子類本身的兩個屬性,并沒有去獲取父類的屬性。

問題原因

通過看編譯后的代碼可以得出@Data不會打印繼承的父類信息是因為該注解本身作用域的問題,@Data注解在編譯時會自動給實體類添加@Setter,@Getter,@ToString等方法。

但是@Data注解的作用域只在當(dāng)前類中,所以最終打印的時候只會打印出當(dāng)前類(子類)的信息。

即使子類擁有的是全屬性,但是打印不會顯示父類信息。

解決方式

本文介紹兩種解決方案。

  • 第一種:在子類上添加@ToString(callSuper = true)注解,該注解會將父類的屬性跟子類的屬性一起生成toString;
  • 第二種:不使用@Data注解,使用@Setter,@Getter注解,在父類中重寫toString()方法并用JSON的方式打印。

1.子類添加@ToString(callSuper = true)注解

@Data
@ToString(callSuper = true)
public class StudentResp extends PersonResp {

    /**
     * 學(xué)號
     */
    private Integer studentId;

    /**
     * 成績
     */
    private Integer score;
}

打印子類

    public static void main (String[] args) {

        StudentResp studentResp = new StudentResp();
        //學(xué)生子類賦值
        studentResp.setStudentId(1000000000);
        studentResp.setScore(92);
        //父類賦值
        studentResp.setName("風(fēng)清揚");
        studentResp.setAge(18);
        //學(xué)生子類
        System.out.println(studentResp);
  
    }

結(jié)果可以看到父類信息

再看看target中子類編譯后的代碼

public class StudentResp extends PersonResp {
    private Integer studentId;
    private Integer score;

    public StudentResp() {
    }

    public Integer getStudentId() {
        return this.studentId;
    }

    public Integer getScore() {
        return this.score;
    }

    public void setStudentId(final Integer studentId) {
        this.studentId = studentId;
    }

    public void setScore(final Integer score) {
        this.score = score;
    }

    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof StudentResp)) {
            return false;
        } else {
            StudentResp other = (StudentResp)o;
            if (!other.canEqual(this)) {
                return false;
            } else {
                Object this$studentId = this.getStudentId();
                Object other$studentId = other.getStudentId();
                if (this$studentId == null) {
                    if (other$studentId != null) {
                        return false;
                    }
                } else if (!this$studentId.equals(other$studentId)) {
                    return false;
                }

                Object this$score = this.getScore();
                Object other$score = other.getScore();
                if (this$score == null) {
                    if (other$score != null) {
                        return false;
                    }
                } else if (!this$score.equals(other$score)) {
                    return false;
                }

                return true;
            }
        }
    }

    protected boolean canEqual(final Object other) {
        return other instanceof StudentResp;
    }

    public int hashCode() {
        int PRIME = true;
        int result = 1;
        Object $studentId = this.getStudentId();
        int result = result * 59 + ($studentId == null ? 43 : $studentId.hashCode());
        Object $score = this.getScore();
        result = result * 59 + ($score == null ? 43 : $score.hashCode());
        return result;
    }

    public String toString() {
        return "StudentResp(super=" + super.toString() + ", studentId=" + this.getStudentId() + ", score=" + this.getScore() + ")";
    }
}

可以明確的看到最后的toString()方法中多了一個super.toString()方法,將父類的信息打印出來

2.不使用@Data注解,使用@Setter,@Getter注解,在父類中重寫toString()方法并用JSON的方式打印。

子類使用@Setter,@Getter注解

@Getter
@Setter
public class StudentResp extends PersonResp {

    /**
     * 學(xué)號
     */
    private Integer studentId;

    /**
     * 成績
     */
    private Integer score;
}

父類中重寫toString()方法并用JSON的方式打印

@Data
public class PersonResp {

    /**
     * 姓名
     */
    private String name;

    /**
     * 年齡
     */
    private Integer age;

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }


}

打印子類

    public static void main (String[] args) {

        StudentResp studentResp = new StudentResp();
        //學(xué)生子類賦值
        studentResp.setStudentId(1000000000);
        studentResp.setScore(92);
        //父類賦值
        studentResp.setName("風(fēng)清揚");
        studentResp.setAge(18);
        //學(xué)生子類
        System.out.println(studentResp);

    }

結(jié)果也可以看到父類信息

總結(jié)

這個問題本身不算是個大問題,延伸出來更為重要的是我們解決問題的思路。因為從本質(zhì)上來說屬性本身都是存在的,只是沒打印出來。

但是遇到這個問題的時候第一反應(yīng)都是,明明繼承了父類,為啥父類的值會沒有,從而會帶偏我們?nèi)ソ鉀Q問題方向,遇到此類問題,第一我們應(yīng)該先確認問題的本質(zhì),到底有沒有給上值,確認了已經(jīng)給上值,就說明只是打印的問題,進而去編譯后的代碼中查看為啥沒打印出來,最終定位到問題從而解決問題。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java類型生命周期的詳細解析

    java類型生命周期的詳細解析

    以下是對java中的類型生命周期進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-08-08
  • Spark JDBC操作MySQL方式詳細講解

    Spark JDBC操作MySQL方式詳細講解

    這篇文章主要介紹了Spark JDBC操作MySQL方式,Spark SQL可以通過JDBC從傳統(tǒng)的關(guān)系型數(shù)據(jù)庫中讀寫數(shù)據(jù),讀取數(shù)據(jù)后直接生成的是DataFrame,然后再加上借助于Spark SQL豐富的API來進行各種操作
    2023-02-02
  • springboot單獨使用feign簡化接口調(diào)用方式

    springboot單獨使用feign簡化接口調(diào)用方式

    這篇文章主要介紹了springboot單獨使用feign簡化接口調(diào)用方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java項目時的命名規(guī)范使用及說明

    Java項目時的命名規(guī)范使用及說明

    文章總結(jié)了SpringBoot項目命名規(guī)范,包括項目、包、類、方法、變量、配置文件、Starter、API、數(shù)據(jù)庫和其它命名規(guī)則,以確保代碼的一致性和可讀性
    2026-01-01
  • java中main函數(shù)你知道多少

    java中main函數(shù)你知道多少

    大家好,本篇文章主要講的是java中main函數(shù)你知道多少,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • Java 通過位運算求一個集合的所有子集方法

    Java 通過位運算求一個集合的所有子集方法

    下面小編就為大家?guī)硪黄狫ava 通過位運算求一個集合的所有子集方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 怎樣使用PowerMockito 測試靜態(tài)方法

    怎樣使用PowerMockito 測試靜態(tài)方法

    這篇文章主要介紹了使用PowerMockito 測試靜態(tài)的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringMVC如何配置JSP視圖解析器

    SpringMVC如何配置JSP視圖解析器

    這篇文章主要介紹了SpringMVC如何配置JSP視圖解析器問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 在編碼時如何使用\r與\n,兩者的區(qū)別

    在編碼時如何使用\r與\n,兩者的區(qū)別

    本篇文章是對\r與\n兩者的區(qū)別,以及編程語言中如何使用進行了詳細的分析介紹,需要的朋友可以參考下
    2015-07-07
  • java lambda 表達式中的雙冒號的用法說明 ::

    java lambda 表達式中的雙冒號的用法說明 ::

    這篇文章主要介紹了java lambda 表達式中的雙冒號的用法說明 ::具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

武清区| 杭锦旗| 五峰| 咸丰县| 安多县| 天峻县| 呼图壁县| 锡林郭勒盟| 北辰区| 闻喜县| 奉贤区| 千阳县| 北海市| 土默特右旗| 扎囊县| 保山市| 宝兴县| 南陵县| 乐陵市| 东乌珠穆沁旗| 浦江县| 津南区| 抚宁县| 金阳县| 高陵县| 加查县| 西畴县| 织金县| 巴青县| 正定县| 都江堰市| 察雅县| 峨山| 濮阳县| 弥渡县| 历史| 吴川市| 黑山县| 醴陵市| 沅陵县| 都安|