- 前言:
我们都知道,封装是面向对象的核心思想。通常要对一些类进行封装(即属性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调用父类构造方法,也就导致了创建对象时候必须赋初值。
解决办法是在父类再添加一个无参构造函数,过后子类也可以添加无参构造函数,问题便解决了。
可以看到这样也可以达到同样的目的,但是相当繁琐不够灵活,且增加了类之间的耦合度。因此个人觉得还是前者较适。