Java面向对象06-多态,内部类
来源:互联网 发布:淘宝哪家女童卖的好 编辑:程序博客网 时间:2024/05/23 13:34
接口和抽象类的区别
- 将公共的属性和行为抽到父类中
所有子类行为都一样—普通方法 - 所有子类行为都不一样—抽象方法
- 符合既是也是的情况使用接口(部分子类有共同行为,而不是所有子类有共同行为)
- 一个类只能继承一个抽象类,但是可以实现多个接口
- 抽象类中可以包含抽象方法和普通方法,而接口中的所有方法均为抽象的
多态
多态的意义
- 同一类型引用指向不同对象时,有不同的实现
- 同一个对象被造型为不同的类型时,有不同的功能
向上造型
- 父类的引用指向子类的对象
- 能造型为的类型有:父类+实现的接口
- 能点出什么来,看引用类型
强制类型转换
- 引用所指向的对象,就是该类型
- 引用所指向的对象,实现了该接口
instanceof
- 作用:判断引用指向的对象,是否是该类型
- 返回rue和false,强转成功的条件就是它为true的条件
- 建议:强转之前先通过instenceof判断后,再强转
内部类
成员内部类
- 类中套类,里边的叫内部类(Inner),外边的叫外部类(Outer)
- 内部类通常只服务于外部类,对外不可见
- 内部类对象通常在外部类中创建
- 内部类中可以直接访问外部类的成员
内部类中默认一个隐式的引用指向外部类
匿名内部类
- 若需要创建一个类(子类)的对象,并且对象只创建一次,则该类不必命名,称之为匿名内部类
- 匿名内部类中访问外部的变量,该变量必须是final的
案例
“银行卡系统(实现银联接口) (上一章博客的案例)”基础上实现本案例,本案例要求实现中国农业银行的ATM系统,详细要求如
1. 中国农业银行的ATM机对所有银联卡提供检查密码功能、取款功能以及查询余额功能。
2. 如果为农行的卡,可以实现支付电话费功能。
import java.util.Scanner;public class ATMTest { public static void main(String[] args) { ABCATM atm=new ABCATM(); UnionPay abc=new ABCImpl(3000,1603); atm.insertCard(abc); atm.allMenu(); }}//农行ATMclass ABCATM{ UnionPay card; Scanner sc=new Scanner(System.in); public void insertCard(UnionPay card){ this.card=card; } public void outCard(){ card=null; } public void showBalance(){ //显示余额 System.out.println("卡内余额:"+card.getBalance()); } public void takeMoney(){ //取钱 System.out.println("请输入取钱金额:"); double number=sc.nextDouble(); if(card.drawMoney(number)){ System.out.println("取款成功!"); }else{ System.out.println("取款失败!"); } } public void payTelBill(){ //电话缴费 if(card instanceof ABCImpl){ ABCImpl abccard=(ABCImpl)card; System.out.println("请输入电话号码:"); String phoneNum=sc.next(); while(phoneNum.length()!=11){ System.out.println("请输入电话号码:"); phoneNum=sc.next(); } if(phoneNum.length()==11){ System.out.println("请输入缴费金额:"); double calls=sc.nextDouble(); if(abccard.payTel(phoneNum,calls)){ System.out.println("缴费成功!"); }else{ System.out.println("缴费失败!"); } }else{ System.out.println("您输入的电话号码有误!"); } }else{ System.out.println("您的银行卡非农行卡,不支持电话缴费"); } } public void allMenu(){ //功能菜单 do{ System.out.println("请输入密码:"); int input=sc.nextInt(); if(card.checkPwd(input)){ System.out.println("请选择功能:1.查询余额 2.电话缴费 3.取款 0.退出"); int a=sc.nextInt(); if(a==0){ System.out.println("退出系统!"); break; }else{ switch(a){ case 1:showBalance(); break; case 2:payTelBill(); break; case 3:takeMoney(); break; default:System.out.println("非法输入!"); } } break; }else{ System.out.println("密码错误!"); System.out.println("请输入密码:"); input=sc.nextInt(); } }while(true); }}//银联接口interface UnionPay { public boolean drawMoney(double number); //取钱 public boolean checkPwd(int input); //验证密码 public double getBalance(); //显示余额}//农行卡接口interface ABC extends UnionPay{ public boolean payTel(String phoneNum,double calls); //支付电话费}//实现农行卡接口class ABCImpl implements ABC{ private double money; private int pwd; public ABCImpl(double money,int pwd){ this.money=money; this.pwd=pwd; } public boolean payTel(String phoneNum,double calls){ if(phoneNum.length()==11&&calls<money){ money-=calls; return true; } return false; } public boolean drawMoney(double number){ if(number<money){ money-=number; return true; } return false; } public boolean checkPwd(int input){ if(pwd==input){ return true; } return false; } public double getBalance(){ return money; } }
2 0
- Java面向对象06-多态,内部类
- java面向对象内部类
- Java面向对象-内部类
- Java-面向对象(继承、封装、多态、内部类、异常)
- 黑马程序员---Java基础---面向对象:多态、内部类、异常
- JAVA面向对象基础:内部类
- Java面向对象基础--内部类
- Java面向对象高级--匿名内部类
- Java面向对象 Object类 内部类
- java面向对象-匿名内部类
- java面向对象(九) 内部类
- Java面向对象 匿名内部类
- java面向对象(内部类)
- JAVA面向对象-----内部类的概述
- JAVA面向对象-----局部内部类
- JAVA面向对象-----匿名内部类
- Java面向对象之 内部类
- Java面向对象(9)内部类
- java 反斜杠转义
- python系列之 RabbitMQ - RPC
- RecyclerView添加addHeader和addFooter方法
- 将 JAR 转为 EXE – exe4j 的使用教程(第一期)
- PHP中的数据类型转换和类型检测
- Java面向对象06-多态,内部类
- Matlab 未找到支持的编译器或 SDK 解决方法归纳
- 域渗透——Skeleton Key
- Ocx 控件添加函数接口,注册控件
- 创建数据库的顺序
- java语言程序设计第十版(Introduce to java 10th) 课后习题 chapter6-32
- firefox 下出现flash上传时提示回话超时,需重新登录问题的解决办法
- 分赌本问题与概率论起步
- 链表实现栈