当需要一个有限集合,而有限集合中的数据为特定的值时,可以使用枚举类型。枚举类型的定义使用关键字enum,其语法格式如下:
[public] enum 枚举类型名称 [implements接口名称列表] { 枚举值; 变量成员声明及初始化; 方法声明及方法体; }
enum Score{ EXCELLENT, QUAILFIED, FAILED; }; public class ScoreTester { public static void main(String [] args){ giveScore(Score.EXCELLENT); } public static void giveScore(Score s){ switch (s){ case EXCELLENT: System.out.println("EXCELLENT"); break; case QUAILFIED: System.out.println("QUAILFIED"); break; case FAILED: System.out.println("FAILED"); break; } } }
枚举类型具有如下特点:
1)枚举类型是类,而不是简单的整数类型,枚举值是类的对象;
2)枚举类型继承过java.lang.Enum类;
3)枚举类型没有public的构造函数;
4)枚举值是public、static、final的。
枚举类型有很多默认方法。
枚举类型相当于定义一个类,因此可以给该类定义数据和方法。
此外,枚举类型可以定义构造函数,不过为了防止程序员自行定义枚举类型的对象,枚举类型的构造函数只能是private的,并且默认是private的。
首先声明银行账号类,包括状态、构造方法、get方法及set方法。
enum Grade{//定义枚举类型,表示账户的等级。 VIP, General; } public class BankAccount { private String ownerName; private int accountNumber; private float balance; Grade grade; public BankAccount(){ this("",0,0,Grade.General); } public BankAccount(String initName,int initAccNum,float initBal,Grade g){ ownerName=initName; accountNumber=initAccNum; balance=initBal; grade=g; } public String getOwnerName(){ return ownerName; } public int getAccountNumber(){ return accountNumber; } public float getBalance(){ return balance; } public Grade getGrade(){ return grade; } public void setOwnerName(String newName){ ownerName=newName; } public void setAccountNumber(int newNum) { accountNumber = newNum; } public void setBalance(float newBalance){ balance=newBalance; } public void setGrade(Grade g){ grade=g; } }
声明测试类:
public class AccountTester { public static void main(String args[]){ BankAccount anAccount; anAccount=new BankAccount("zhangsan",10000,0,Grade.General); anAccount.setBalance(anAccount.getBalance()+100); System.out.println("here is the account:"+anAccount); System.out.println("account name:"+anAccount.getOwnerName()); System.out.println("account number"+anAccount.getAccountNumber()); System.out.println("Balance: $"+anAccount.getBalance()); System.out.println("Grade:"+anAccount.grade); } }
输出结果: here is the account:BankAccount@75b84c92 account name:zhangsan account number10000 Balance: $100.0 Grade:General
当需要将一个独享输出到显示器时,通常需要调用它的toString()方法,将对象的内容转为字符串。Java的所有类都有一个默认的toString()方法,如果需要特殊的转换功能,则需要自己重写toString()方法。
系统默认的toString()的方法体如下;
getClass().getName()+'@'+Integer.toHexString(hashCode())
在实际应用中,往往需要此方法能够返回更有意义的信息。这就需要我们重写自己的toString()方法,其主要功能是用一个字符串来描述一个对象的主要信息。
在BankAccount中加入toString()方法。
public String toString(){ return (grade+"account #"+accountNumber+"with balance $"+balance); }
System.out.println("here is the account:"+anAccount.toString());
然后重新编译运行测试类;
输出: here is the account:Generalaccount #10000with balance $100.0 account name:zhangsan account number10000 Balance: $100.0 Grade:General
在声明toString()方法时,需要注意以下几点:
1)toString()方法必须被声明为public;
2)返回类型为String;
3)方法的名称必须为toString,且没有参数;
4)在方法体中不要使用输出方法System.out.println()。
在toString()方法中使用DecimalFormat类的实例方法format对数据进行格式化。DecimalFormat类在java.text方法中。
public String toString(){ return (grade+"account #"+accountNumber+"with balance"+new java.text.DecimalFormat("$0.00f").format(balance)); }
另外一种格式化输出字符串的方法,是使用printf。
输出两位小数并加上$符号。
System.out.printf("$%.2f",anAccount.getBalance());
public static BankAccount example(){ BankAccount ba=new BankAccount(); ba.setOwnerName("zhangwei"); ba.setAccountNumber(5000); return ba; } public static BankAccount example1(){ BankAccount ba=new BankAccount(); ba.setOwnerName("wanger"); ba.setAccountNumber(2000); ba.deposit(1000); return ba; } public static BankAccount example2(){ BankAccount ba=new BankAccount(); ba.setOwnerName("mazi"); ba.setAccountNumber(3000); ba.deposit(2000); return ba; }
声明存钱取钱的方法;
public float deposit(float anAmount){ balance+=anAmount; return (balance); } public float withdraw(float anAmount){ balance-=anAmount; return (anAmount); }