在子类中对get(), set() 方法进一步整合 减小代码冗余度

  1. 前言
    我们都知道,封装是面向对象的核心思想。通常要对一些类进行封装(即属性private化,只提供一套public的get(),set()方法供外界访问),而当一个类的属性较多时候,那么创建一个该类对象 就需要连续使用set()方法,会使代码显得非常冗余。
    例如下面这样:请添加图片描述
    2:解决办法 此时可以在子类中 创建一个静态方法来对get(),set()进行进一步整合,从而减小代码冗余度。
    请添加图片描述
    可以看到通过创建一个新的静态方法,只需两行代码即可生成一个对象以及查看对象相关的信息。同时还具有封装函数的 审查功能!
    请添加图片描述
    这里赋予对象 ‘亚索’和‘盖伦’的生命值都为负,可以看到仍然通过调用set(),get()函数的检查功能 将错误检查出来。可谓集方便与严谨为一体
    附:相关代码
package com.indi.lol;

public class Hero {
    private String heroName;
    private String heroTitle;
    private int heroHp;
    private int heroMp;
    /*public Hero(String heroName,String heroTitle,int heroHp,int heroMp){
            this.heroName =heroName;   //   创建一个有参的构造方法
            this.heroTitle =heroTitle;
            this.heroHp =heroHp;
            this.heroMp =heroMp;
    }*/
    public Hero(){  //  创建一个无参的构造方法
    }


    public void  attack(){
        System.out.println("英雄攻击!");
    }

    // 对类的成员变量进行封装
    // 设置 相关属性
    public void setHeroName(String heroName){ //设置get,set方法将类进行封装 此处为设置英雄名字
        this.heroName = heroName;
    }
    public void setHeroTitle(String heroTitle) {
        this.heroTitle = heroTitle;
    }
    public void setHeroHp(int heroHp) {
        if  (heroHp>0)
            this.heroHp = heroHp;
        else {System.out.println("你输入"+'['+  this.getHeroName()+ ']'  +"的生命值不合法!");
            this.heroHp = 100; // 生命值不合法时候 将默认改为100
        }
    }
    public void setHeroMp(int heroMp) {
        if  (heroMp>0)
            this.heroMp = heroMp;
        else {System.out.println("你输入的法力值不合法!");
        };
    }
    // 获得相关属性
    public String getHeroName(){  // 此处为返回英雄名字
        return this.heroName;
    }
    public String getHeroTitle() {
        return heroTitle;
    }
    public int getHeroHp() {
        return heroHp;
    }
    public int getHeroMp() {
        return heroMp;
    }








    public static void main(String[] args) {
        /*Hero h1 = new Hero();
        Hero h2 = new Hero();
        h1.heroName = "赵信";
        h1.heroTitle = "德邦总管";
        h1.heroHp = 800; // 初始生命值800
        h1.heroMp = 300; // 初始法力值300*/
    }
}

package com.indi.lol;

public class OperateHero extends Hero {

    public static void main(String[] args) {
        //Hero h1 = new Hero("剑圣","易大师",-320,320);
        Hero h2 = new Hero();
        h2.setHeroName("亚索");           //类进行封装之后 只能通过【set方法】设置属性
        h2.setHeroTitle("疾风剑豪");
        h2.setHeroHp(-580);
        h2.setHeroMp(320);
        System.out.println(h2.getHeroName()); // 只能通过【set方法】访问属性
        System.out.println(h2.getHeroTitle());
        System.out.println(h2.getHeroHp());
        System.out.println(h2.getHeroMp());
        /* 这样似乎比较冗余和麻烦,下面 创建一个静态方法 来对 set() get() 进行进一步的封装
        这样就可以在创建对象时候,对 对象的属性进行赋值 还能检查相应的错误(已对该类属性进行私有化封装)*/
        Hero h3 = setHero("盖伦","德玛西亚之力",-320,20);
        getHeroInform(h3); // 获取英雄 h3 的相关信息


    }

    public static Hero setHero(String HeroName,String HeroTitle,int HeroHp,int HeroMp){
            Hero hr = new Hero();  // 将封装好的set,get方法进一步封装成静态函数
            hr.setHeroName(HeroName);
            hr.setHeroTitle(HeroTitle);
            hr.setHeroHp(HeroHp);
            hr.setHeroMp(HeroMp);
            return hr;
        }

    public static void getHeroInform(Hero hrMould)    {
        System.out.println("该英雄的信息为:");
        System.out.println("英雄名:"+hrMould.getHeroName()+"  称号:"+hrMould.getHeroTitle()+
                           "  基础生命值:"+hrMould.getHeroHp()+"  基础法力值:"+hrMould.getHeroMp());

    }
}

附言
写道这里可能有的朋友会问 为什么不直接使用【构造函数】,也是直接在创建对象的时候的赋予相关的属性值。如下面这样:
请添加图片描述
请添加图片描述
其实这样也可以但会出现如下问题:
在这里插入图片描述
可以看到此时,当我们在创建一个新对象时候,必须对对象相关的属性进行赋值,否则报错。这是因为子类继承父类的同时 ,会自动调用父类的构造方法(隐式或显示),而由于此时父类【只有一个有参构造方法】 ,因此子类的构造方法不管(有参无参),必须用super调用父类构造方法,也就导致了创建对象时候必须赋初值。
解决办法是在父类再添加一个无参构造函数,过后子类也可以添加无参构造函数,问题便解决了。
请添加图片描述
请添加图片描述
请添加图片描述
可以看到这样也可以达到同样的目的,但是相当繁琐不够灵活,且增加了类之间的耦合度。因此个人觉得还是前者较适。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值