[关闭]
@Hubertoo 2017-07-17T05:31:39.000000Z 字数 5815 阅读 794

OOP.Unit05

达内


知识体系

抽象类和接口

使用抽象类

使用接口

多态

  1. Animal a = new Dog();
  2. Dog dog = (Dog) a;
  3. //一定要注意父类继承关系或者接口实现关系,不然会有:ClassCastException
  4. //这个时候就要用到instanceof关键字来判断

定义成员内部类

  1. //内部类加上外部类
  2. package day02;
  3. public class Outer {
  4. private int time;
  5. private Inner inner;
  6. Outer(int time){
  7. this.time = time;
  8. inner = new Inner();
  9. inner.say();
  10. }
  11. public void printTime(){
  12. System.out.println(time);
  13. }
  14. class Inner{
  15. public void say(){
  16. time++;
  17. System.out.println("hahahaha");
  18. }
  19. }
  20. }
  21. //测试类
  22. package day02;
  23. public class OuterTest {
  24. public static void main(String[] args) {
  25. Outer o = new Outer(100);
  26. o.printTime();
  27. }
  28. }
  29. //结果是:
  30. // hahahaha
  31. // 101

定义匿名内部类

  1. //定义Action接口
  2. package day02;
  3. public interface Action {
  4. public void execute();
  5. }
  6. //匿名内部类
  7. package day02;
  8. public class Main {
  9. public static void main(String[] args) {
  10. Action action = new Action(){
  11. public void execute(){
  12. System.out.println("Hello World");
  13. }
  14. };
  15. action.execute();
  16. }
  17. }

经典案例

根据周长计算不同形状图形的面积

Shape抽象类

  1. package day02;
  2. public abstract class Shape {
  3. protected double c;
  4. public abstract double area();
  5. }

Circle类

  1. package day02;
  2. public class Circle extends Shape{
  3. public Circle(double c){
  4. this.c = c;
  5. }
  6. /**
  7. * 计算圆形的面积
  8. */
  9. public double area(){
  10. return 0.0625*c*c;
  11. }
  12. }

Square类

  1. package day02;
  2. public class Square extends Shape {
  3. public Square(double c){
  4. this.c = c;
  5. }
  6. /**
  7. * 计算圆形的面积
  8. */
  9. public double area(){
  10. return 0.0725*c*c;
  11. }
  12. }

TestShape类

  1. package day02;
  2. public class TestShape {
  3. public static void main(String[] args) {
  4. Shape[] shapes = new Shape[2];
  5. shapes[0] = new Circle(4);
  6. shapes[1] = new Square(4);
  7. System.out.println(shapes[0].area());
  8. System.out.println(shapes[1].area());
  9. }
  10. }
  11. // 运行结果是:1.0 1.16

银行卡系统(实现银联接口)

  1. 银联接口描述统一制定的规则,该接口提供检测密码方法,取钱方法,查询余额方法
  2. 工商银行接口,用来描述工银行发卡的功能,在满足银联接口的基础上,增加在线支付功能
  3. 农行接口,另外增加支付电话费的问题,卡内余额可以透支2000.
  4. 实现两个接口并测试

银联接口

  1. package day02;
  2. public interface UnionPay {
  3. //查看余额
  4. public double getBalance();
  5. //取钱
  6. public boolean drawMoney(double number);
  7. //检查密码
  8. public boolean checkPwd(String input);
  9. }

工行接口

  1. package day02;
  2. public interface ICBC extends UnionPay {
  3. //增加在线支付功能
  4. public void payOnline(double number);
  5. }

农行接口

  1. package day02;
  2. public interface ABC extends UnionPay{
  3. //增加支付电话费的功能
  4. public boolean payTelBill(String phoneNum, double sum);
  5. }

工行实现类

  1. package day02;
  2. public class ICBCImpl implements ICBC {
  3. private double money;
  4. private String pwd;
  5. public ICBCImpl(double money, String pwd) {
  6. super();
  7. this.money = money;
  8. this.pwd = pwd;
  9. }
  10. @Override
  11. public double getBalance() {
  12. return money;
  13. }
  14. @Override
  15. public boolean drawMoney(double number) {
  16. if(number <= money){
  17. money -= number;
  18. return true;
  19. }
  20. return false;
  21. }
  22. @Override
  23. public boolean checkPwd(String input) {
  24. if(pwd.equals(input)){
  25. return true;
  26. }
  27. return false;
  28. }
  29. @Override
  30. public void payOnline(double number) {
  31. if(number < money){
  32. money -= number;
  33. }
  34. }
  35. }

农行实现类

  1. package day02;
  2. public class ABCImpl implements ABC{
  3. //卡内余额,允许透支2000
  4. private double balance;
  5. //帐号密码
  6. private String password;
  7. public ABCImpl(double balance, String password) {
  8. super();
  9. this.balance = balance;
  10. this.password = password;
  11. }
  12. @Override
  13. public double getBalance() {
  14. // TODO Auto-generated method stub
  15. return balance;
  16. }
  17. @Override
  18. public boolean drawMoney(double number) {
  19. if(number <= (balance - 2000)){
  20. balance -= number;
  21. return true;
  22. }
  23. return false;
  24. }
  25. @Override
  26. public boolean checkPwd(String input) {
  27. if(password.equals(input)){
  28. return true;
  29. }
  30. return false;
  31. }
  32. @Override
  33. public boolean payTelBill(String phoneNum, double sum) {
  34. if(phoneNum.length() == 11 && (balance-sum >= -2000)){
  35. balance -= sum;
  36. return true;
  37. }
  38. return false;
  39. }
  40. }

工行测试类

  1. package day02;
  2. import java.util.Scanner;
  3. public class UnionPayTest {
  4. public static void main(String[] args) {
  5. UnionPay icbc = new ICBCImpl(2000,"123456");
  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. if(icbc.drawMoney(num)){
  12. System.out.println("取钱成功,卡余额为:" + icbc.getBalance());
  13. }else{
  14. System.out.println("取钱失败");
  15. }
  16. }else{
  17. System.out.println("密码错误");
  18. }
  19. input.close();
  20. }
  21. }

ATM机系统
ABCATM类

  1. package day02;
  2. import java.util.Scanner;
  3. /**
  4. * 用来描述插入银行卡后的操作
  5. *
  6. * @author zeyan
  7. *
  8. */
  9. public class ABCATM {
  10. private UnionPay card;
  11. public void insertCard(UnionPay userCard){
  12. if(card == null){
  13. card = userCard;
  14. }
  15. }
  16. private void outCard(){
  17. card = null;
  18. }
  19. private void showBalance(){
  20. System.out.println("当前余额是:" + card.getBalance());
  21. }
  22. private void takeMoney(){
  23. Scanner input = new Scanner(System.in);
  24. System.out.println("输入取款金额:");
  25. double number = Double.parseDouble(input.next());
  26. if(card.drawMoney(number)){
  27. System.out.println("取款成功");
  28. }else{
  29. System.out.println("取款失败");
  30. }
  31. }
  32. private void payTelBill(){
  33. Scanner input = new Scanner(System.in);
  34. if(card instanceof ABC){
  35. ABC abcCard = (ABC) card;
  36. System.out.println("请输入电话号码:");
  37. String telNum = input.next();
  38. System.out.println("请输入缴费额:");
  39. double sum = Double.parseDouble(input.next());
  40. if(abcCard.payTelBill(telNum, sum)){
  41. System.out.println("缴费成功");
  42. }else{
  43. System.out.println("缴费失败");
  44. }
  45. }else{
  46. System.out.println("你的卡不是农行卡");
  47. }
  48. }
  49. public void allMenu(){
  50. Scanner input = new Scanner(System.in);
  51. System.out.println("请输入密码:");
  52. String pwd = input.next();
  53. if(card.checkPwd(pwd)){
  54. System.out.println("请选择功能: \n 1.查看余额 2.取款 3.缴电话费");
  55. int choice = Integer.parseInt(input.next());
  56. switch(choice){
  57. case 1:
  58. showBalance();
  59. break;
  60. case 2:
  61. takeMoney();
  62. break;
  63. case 3:
  64. payTelBill();
  65. break;
  66. default:
  67. System.out.println("非法输入");
  68. }
  69. }else{
  70. System.out.println("密码错误");
  71. }
  72. this.outCard();
  73. }
  74. }

ATMTest类

  1. package day02;
  2. public class ATMTest {
  3. public static void main(String[] args) {
  4. ABCATM atm = new ABCATM();
  5. ABCImpl abc = new ABCImpl(1000, "123456");
  6. atm.insertCard(abc);
  7. atm.allMenu();
  8. }
  9. }

课后作业

笔记

实现射击游戏

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注