java基础--接口
1、生活中的接口:
1)电脑厂商留的USB接口-------------制定标准、规范
U盘、键盘、鼠标厂商-------------遵守标准、规范
2)国家对开发商--------------------制定标准、规范
开发商---------------------遵守标准、规范
2、 JAVA中的接口:
定义:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,
因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具 有不同的行为(功能)。
1)是一个标准、规范,遵守,遵守了这个标准就能干某件事
2)由interface定义
3)只能包含常量和抽象方法
1 interface Inter1{ 2 public static final int NUM = 5; 3 public abstract void show(); 4 5 double PI = 3.14159; //默认public static final 6 void sayHi(); //默认public abstract 7 8 // int num; //编译错误,没有赋值 9 // public static sayHi(){} //编译错误 10 }
4)接口不能被实例化
5)接口是需要被实现/继承的,实现类/子类
必须重写接口中的所有抽象方法
6)一个类可以实现多个接口,用逗号分隔
若又继承又实现时,应先继承后实现
1 interface Inter2{ 2 void a(); 3 } 4 interface Inter3{ 5 void b(); 6 } 7 abstract class Aoo{ 8 abstract void c(); 9 } 10 class Boo extends Aoo implements Inter2,Inter3{ 11 public void a(){} 12 public void b(){} 13 void c(){} 14 }
7)接口可以继承接口
继承和实现的理解:
类对类---------------继承
接口对接口--------------继承
类和接口--------------实现
1 interface Inter2{ 2 void a(); 3 } 4 interface Inter3 extends Inter2{ 5 void b(); 6 } 7 class Aoo implements Inter2{ 8 public void a(){} 9 public void b(){} 10 }
3、接口的小例子:
这里简单写了一个银行卡系统的接口小例子,此案例按如下步骤进行。
步骤一:定义银联接口
首先,定义名为 UnionPay 的银联接口,用于描述银联统一指定的规则;然后在该接口中定义
getBalance 方法表示获取余额功能,定义 drawMoney 表示取钱功能,定义 checkPwd 表示检查
密码功能,代码如下所示:
1 /* 2 * 接口,用于描述银联统一制定的规则 3 */ 4 public interface UnionPay { 5 //查看余额 6 public double getBalance(); 7 //取钱 8 public boolean drawMoney(double number); 9 //检查密码 10 public boolean checkPwd(String input); 11 }
步骤二:定义工商银行接口
定义名为 ICBC 的接口表示工商银行接口,用于描述中国工商银行发行的卡片功能,该接口
需要满足银联接口的功能,因此继承银联接口;该接口在具备银联接口的功能上,要求增加
在线支付功能,所以在该接口中定义 payOnline 方法,表示此功能,代码如下:
1 public interface ICBC extends UnionPay{ 2 //增加在线支付功能 3 public void payOnline(double number); 4 }
步骤三:定义农业银行接口
该接口在具备银联接口的功能基础上要求增加支付电话费功能,所以在该接口中定义
payTelBill 方法,表示此功能,代码如下:
1 public interface ABC extends UnionPay{ 2 //增加支付电话费的功能 3 public boolean PayTelBill(String phoneNum,double sum); 4 }
步骤四:定义工商银行接口的实现类
首先,定义 ICBCImpl 的类,该类实现 ICBC 接口;另外,分析问题中的取钱功能,需要
对余额信息进行存储,插入卡片后需要输入密码后才能进行取钱,因此,在该类中定义 double
类型属性 money 表示账户余额以及 String 类型属性 pwd 表示密码,代码如下:
1 public class ICBCImpl implements ICBC{ 2 private double money; 3 private String pwd; 4 5 public ICBCImpl(double money,String pwd){ 6 this.money = money; 7 this.pwd = pwd; 8 } 9 10 @Override 11 public double getBalance(){ 12 return money; 13 } 14 15 @Override 16 public boolean drawMoney(double number){ 17 if(number <= money){ 18 money -= number; 19 return true; 20 } 21 return false; 22 } 23 24 @Override 25 public void payOnline(double number){ 26 if(number < money){ 27 money -= number; 28 } 29 } 30 31 @Override 32 public boolean checkPwd(String input){ 33 if(pwd.equals(input)){ 34 return true; 35 }else{ 36 return false; 37 } 38 } 39 40 }
步骤五:定义农业银行接口的实现类:
实现农业银行接口的实现过程与工行相似,实现过程中注意,农行卡内的余额可以透支
2000,代码如下所示:
1 public class ABCImpl implements ABC{ 2 //卡内余额,允许最多透支2000 3 private double balance; 4 //账号密码 5 private String password; 6 7 public ABCImpl(double balance,String password){ 8 this.balance = balance; 9 this.password = password; 10 } 11 12 @Override 13 public double getBalance(){ 14 return balance; 15 } 16 17 @Override 18 public boolean drawMoney(double number){ 19 if(balance - number >= -2000){ 20 balance -= number; 21 return true; 22 } 23 return false; 24 } 25 26 @Override 27 public boolean checkPwd(String input){ 28 if(password.equals(input)){ 29 return true; 30 }else{ 31 return false; 32 } 33 } 34 35 @Override 36 public boolean PayTelBill(String phoneNum,double sum){ 37 if(phoneNum.length() == 11 && (balance - sum) >= -2000){ 38 balance -= sum; 39 return true; 40 } 41 return false; 42 } 43 }
步骤六:测试
新建 TestUnionPay 类,测试银联接口提供的方法是否成功实现,代码如下所示(农业银行测试代码相似):
1 import java.util.Scanner; 2 public class TestUnionPay { 3 public static void main(String[] args) { 4 UnionPay icbc = new ICBCImpl(2000,"123456"); 5 6 Scanner input = new Scanner(System.in); 7 System.out.println("请输入密码:"); 8 if(icbc.checkPwd(input.next())){ 9 System.out.println("请输入金额:"); 10 double num = Double.parseDouble(input.next()); 11 12 if(icbc.drawMoney(num)){ 13 System.out.println("取款成功,卡内余额为:"+icbc.getBalance()); 14 }else{ 15 System.out.println("取款失败!"); 16 } 17 }else{ 18 System.out.println("密码错误!"); 19 } 20 input.close(); 21 } 22 23 }
测试结果如下: