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;
    }
}
UnionPay.java V1.1.1
原文地址:https://www.cnblogs.com/tangshengwei/p/6185127.html