Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总
Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总
1.多态:
1)意义:
1.1)同一类型的引用指向不同的对象时,有不同的实现
行为的多态:cut()、run()、study()
1.2)同一个对象被造型为不同的类型时,有不同的功能
对象的多态:我、你、水
2)向上造型:
2.1)父类型的引用指向子类的对象
2.2)能造型成为的类型: 父类、所实现的接口
2.3)能点出来什么,看引用的类型
3)强制类型转换,成功的条件只有两种:
3.1)引用所指向的对象,就是该类型
3.2)引用所指向的对象,实现了该接口
4)若不符合如上两个条件,则ClassCastException类型转换异常
建议在强转之前先通过instanceof来判断引用的对象是否是某种类型
2.成员内部类:应用率比较低
1)类中套类,外面的称为外部类,里面的称为内部类
2)内部类通常只服务于外部类,对外不具备可见性
3)内部类通常在外部类中创建
4)内部类中可以直接访问外部类的成员(包括私有的)
内部类中有个隐式的引用指向了创建它的外部类对象
外部类名.this
3.匿名内部类:
1)若想创建一个类(子类)的对象,并且该对象只被创建一次,
此时该类不必命名,称之为匿名内部类
2)匿名内部类中访问外面的数据,该数据必须是final的
4.面向对象三大特征:
1)封装:
1.1)类:封装的是对象的属性和行为
1.2)方法:封装的是具体的业务逻辑功能实现
1.3)访问控制修饰符:封装的是访问的权限
2)继承:
2.1)作用:代码的复用
2.2)通过extends来继承
2.3)子继承父后,具有:父+子
2.4)单一继承、传递性
2.5)继承类、实现接口
3)多态:
3.1)意义:行为的多态、对象的多态
3.2)向上造型、强制类型转换、instanceof
3.3)表现形式:
3.3.1)重写
3.3.2)重载
程序设计规则:
1)将公共的属性和行为抽象到父类中
2)所有子类行为都一样------普通方法
所有子类行为不一样------抽象方法
3)符合既是也是原则时,使用接口
部分子类共有,设计到接口中
接口是对继承单根性的扩展
println()-------是多态的(根据参数而多态)
面试题:
问:内部类有独立的.class吗?
答:有
成员内部类的演示
InnerClassDemo.java
package oo.day06; //成员内部类的演示 public class InnerClassDemo { public static void main(String[] args) { Mama a = new Mama(); //Baby b = new Baby(); //编译错误 } } class Mama{ private String name; Baby createBaby(){ return new Baby(); } class Baby{ void showMamaName(){ System.out.println(name); System.out.println(Mama.this.name); //System.out.println(this.name); //编译错误 } } }
多态演示
UpDemo.java
package oo.day06; //多态的演示 public class UpDemo { public static void main(String[] args) { Aoo o1 = new Boo(); //向上造型 Boo o2 = (Boo)o1; //o1指向的对象就是Boo类型 Inter1 o3 = (Inter1)o1; //o1指向的对象实现了Inter1接口 //Coo o4 = (Coo)o1; //ClassCastException类型转换异常 if(o1 instanceof Coo){ //false Coo o5 = (Coo)o1; } System.out.println("over"); } } interface Inter1{ } class Aoo{ } class Boo extends Aoo implements Inter1{ } class Coo extends Aoo{ }
匿名内部类的演示
NstInnerClassDemo.java
package oo.day06; //匿名内部类的演示 public class NstInnerClassDemo { public static void main(String[] args) { //1.创建了Inter2的一个子类,没有名字 //2.为该子类创建了一个对象,叫o1 //3.大括号中的为子类的类体 Inter2 o1 = new Inter2(){ }; //1.创建了Inter2的一个子类,没有名字 //2.为该子类创建了一个对象,叫o2 //3.大括号中的为子类的类体 Inter2 o2 = new Inter2(){ }; final int num = 5; Inter3 o3 = new Inter3(){ public void run(){ System.out.println("abc"); System.out.println(num); } }; o3.run(); } } interface Inter3{ public void run(); } interface Inter2{ }
银联卡系统V-1.1.1
UnionPay.java

package oo.day06; //银联卡系统 public class UnionPayTest { public static void main(String[] args) { ABCATM atm = new ABCATM(); //atm机对象 UnionPay card = new ICBCImpl(); //银联卡--工行卡 atm.insertCard(card); //插卡 atm.payTelBill(); //支付电话费 } } class ABCATM{ //农行ATM机 private UnionPay card; //银联卡 public void insertCard(UnionPay card){ //插卡 this.card = card; } public void payTelBill(){ //支付电话费 if(card instanceof ABC){ //农行卡 ABC abcCard = (ABC)card; //强转为农行卡 abcCard.payTelBill("12345678945", 500); //支付电话费 }else{ System.out.println("不是农行卡,不能支付电话费"); } } public void getBalance(){ //查询余额 System.out.println("当前余额为:"+card.getBalance()); } } interface UnionPay{ //银联接口 public double getBalance(); //查询余额 public boolean drawMoney(double number); //取款 public boolean checkPwd(String input); //检查密码 } interface ICBC extends UnionPay{ //工行接口 public void payOnline(double number); //在线支付 } interface ABC extends UnionPay{ //农行接口 public boolean payTelBill(String phoneNum,double sum); //支付电话费 } class ICBCImpl implements ICBC{ //工行卡 public double getBalance(){return 0.0;} public boolean drawMoney(double number){return false;} public boolean checkPwd(String input){return false;} public void payOnline(double number){} } class ABCImpl implements ABC{ //农行卡 public double getBalance(){return 0.0;} public boolean drawMoney(double number){return false;} public boolean checkPwd(String input){return false;} public boolean payTelBill(String phoneNum,double sum){ System.out.println("支付电话费成功"); return true; } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步