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; }}