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){ //falseCoo 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;}
}