您的位置:首页 > 运维架构

OOP Unit06 抽象类、接口和内部类(下) 、 面向对象汇总

2017-06-12 14:42 405 查看
1.多态:

1)意义:

1.1)同一类型的引用指向不同的对象时,有不同的实现

行为的多态:cut()、run()、study()

1.2)同一个对象被造型为不同的类型时,有不同的功能

对象的多态:我、你、水

2)向上造型:

2.1)父类型的引用指向子类的对象

2.2)能造型成为的类型: 父类、所实现的接口

2.3)能点出来什么,看引用的类型

3)强制类型转换,成功的条件只有两种:

3.1)引用所指向的对象,就是该类型

3.2)引用所指向的对象,实现了该接口

4)若不符合如上两个条件,则ClassCastException类型转换异常

建议在强转之前先通过instanceof来判断引用的对象是否是某种类型

多态演示:

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


2.成员内部类:应用率比较低

1)类中套类,外面的称为外部类,里面的称为内部类

2)内部类通常只服务于外部类,对外不具备可见性

3)内部类通常在外部类中创建

4)内部类中可以直接访问外部类的成员(包括私有的)

内部类中有个隐式的引用指向了创建它的外部类对象

外部类名.this

成员内部类的演示:

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); //编译错误
}
}
}


3.匿名内部类

1)若想创建一个类(子类)的对象,并且该对象只被创建一次,

此时该类不必命名,称之为匿名内部类

2)匿名内部类中访问外面的数据,该数据必须是final的

匿名内部类的演示:

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


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吗?

答:有

银联卡系统V-1.1.1

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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐