博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unit06 - 抽象类、接口和内部类(下) 、 面向对象汇总
阅读量:4597 次
发布时间:2019-06-09

本文共 4478 字,大约阅读时间需要 14 分钟。

    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; }}
UnionPay.java V1.1.1

 

转载于:https://www.cnblogs.com/tangshengwei/p/6185127.html

你可能感兴趣的文章
JavaScript空判断
查看>>
洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
查看>>
python timeit
查看>>
Wireless Network 并查集
查看>>
51nod 1019 逆序数
查看>>
20145202马超《JAVA》预备作业1
查看>>
台湾好市多概述
查看>>
shell-逐行读取文件
查看>>
贝叶斯如何生效
查看>>
UVA - 1588 - Kickdown
查看>>
Win32 SDK:ListBox 为什么不整个 LB_SETTEXT
查看>>
spring的优缺点
查看>>
优云老王的心路历程(一):那个做了五年的产品经理
查看>>
双态运维分享之:业务场景驱动的服务型CMDB
查看>>
cocos2dx-3.6 触摸,键盘,聚焦事件
查看>>
JEECG中t:dictSelect的extendJson用法
查看>>
web开发下的各种下载方法
查看>>
第六章 堆排序 6.5 优先队列
查看>>
Linux搭建我的世界服务器
查看>>
数据库之范式
查看>>