何谓封装
定义类并不等于做好了面向对象中封装(Encapsulation)的概念,那么到底什么才有封装的含义?你必须以对象的角度来思考问题。
封装对象初始流程
假设要写个可以管理储值卡的应用程序,首先得定义储值卡会记录哪些数据,像是储值卡号码、余额、红利点数,在Java中可使用 class关键字进行定义
public class CashCard {
String number;
int balance,bonus;
}
使用 Cashcard. java储存,编译为Cashcard.class并将这个位码给朋友使用,你的朋友要建立5张储值卡的数据
Cashcard card1=new Cashcard();
card1 number = "A001"
card1 balance =500
card1 bonus =0;
cashcard card2=new Cashcard();
card2 number "A002"
card2 balance=300:
card2 bonus =0;
...
在这里可以看到,如果想存取对象的数据成员,可以通过“”运算符加上数据成员名称你发现到每次他在建立储值卡对象时,都会做相同的初始动作,也就是指定卡号、余额与红利点数,这个流程是重复的,更多的Cashcard对象建立会带来更多的程序代码重复,重复代码意味着可以改进。用构造函数改进:
package hello;
public class CashCard {
String number;
int balance,bonus;
public CashCard(String number, int balance, int bonus) {
// TODO 自动生成的构造函数存根
this.number=number;
this.balance=balance;
this.bonus=bonus;
}
}
package hello;
public class CardApp {
public static void main(String[] args) {
CashCard card1=new CashCard("A001", 1000, 0);
CashCard card2=new CashCard("A002", 500, 0);
CashCard card3=new CashCard("A003", 300, 0);
CashCard card4=new CashCard("A004", 900, 0);
//如果没有构造函数只能通过下面的代码实现。
// CashCard card1=new CashCard();
// card1.number="A001";
// card1.balance=1000;
// card1.bonus=0;
}
}
构造函数是与类同名的方法,不用声明返回类型。这里构造函数number,balance,bonus参数与类中number,balance,bonus同名,加上this关键字,表示将参数值指定给这个对象的number,balance,bonus数据成员。
如果建立多个对象可以直接使用数组:
CashCard[] cards= {
new CashCard("A001", 100, 0),
new CashCard("A002", 500, 0),
new CashCard("A003", 300, 0),
new CashCard("A004", 900, 0),
};
for(CashCard card:cards) {
System.out.printf("%s%d%d\n", card.number, card.balance,card.bonus);
}
Scanner scan= new Scanner(System.in);
int money=scan.nextInt();
CashCard card1=new CashCard("A001", 1000, 0);
CashCard card2=new CashCard("A002", 500, 0);
CashCard card3=new CashCard("A003", 300, 0);
CashCard card4=new CashCard("A004", 900, 0);
if(money>0) {
card1.balance+=money;
if(money>=1000) {
card1.bonus++;//下面即是流程的封装
void save(int money) {//存钱调用
if(money>0) {
this.balance+=money;
if(money>=1000) {
this.bonus++;
}
}else {
System.out.println("error");
}
}
代码重复可以构建函数:
//下面即是流程的封装
void save(int money) {//存钱调用
if(money>0) {
this.balance+=money;
if(money>=1000) {
this.bonus++;
}
}else {
System.out.println("error");
}
}
void charge(int money) {//取钱调用
if(money<0) {
if(money<this.balance) {
this.balance-=money;
}else {
System.out.println("钱不够");
}
}else {
System.out.println("error");
}
}
int exchange(int bones) {//兑换红利
if(bonus>0) {
this.bonus-=bonus;
}
return this.bonus;
}
void output(){
System.out.printf("%s%d%d",this.number,this.balance,this.bonus);
}
其中exchange必须返回剩余点数。