黑马程序员-多态
2014-06-06 18:16 黑马程序员* 阅读(148) 评论(0) 收藏 举报多态;可以理解为事物存在的多种形态。
1.多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接受自己的子类对象。
2,多态前提
必须是类与类之间必须是继承或是实现
通常还有一个前提;具有共有方法。
1.继承 2.重写3.父类引用指向子类对象。
3,多态的好处
多态的出现大大的提高了程序的扩展性。
4,多态多弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
多态的成员函数的特点;
在编译时期;看所引用的类是否有调用的方法。
在运行时期;参阅对象所属的类中是否有调用的方法。
简单总结;成员函数在编译时看左边,在运行时看右边。
在多态中,成员变量的特点;
无论编译和运行,都参考左边(引用型变量所在的类,成员变量没有覆盖的说法,覆盖只是相对于方法)
在多态中,静态成员变量的特点;
无论编译和运行,都参考左边(静态不需要对象,引用找其所在的类,不需要参考右边的对象0)
方法区分静态和非静态(包含this super)。
静态方法都绑定在其所属的类上,静态绑定。
动态绑定this.super,对象是谁就看谁。
多态体现:一个接口,多个方法,如重载,覆盖,一个名字,多个方法
Animal a = new Cat();
在编译时期:a 为animal
在运行时期:a 为Cat
class fu{
}
class zi extends fu{
void show(){}
}
fu f =new zi();
问题:f.show为什么不可以,f在运行期间不是调用zi的方法吗?
在编译时期,编译器会查找f中是否有show()方法,没有编译失败,
运行时期,运行子类的show(),那你查看父类的有无show()方法干什么,你又不调用!
网上:多态的基础是动态的方法调度,它在运行时期调用重载方法的机制???
需求;
电脑运行实例,电脑运行基于主板
interface pci{
public void open();
public void close();
}
class Mainboard{
public void run() {
System.out.println("mainboard run");
}
public void usepci(pci p){//主板要使用pci接口,接口必定要传入子类。
if (p!=null){//如果传入为空,则报错。
p.open();
p.close();
}}}
class NetCard implements pci{// 一年后接了一个网卡,使网卡符合pci的标准,多态
public void open() {
System.out.println("netcard open");
}
public void close() {
System.out.println("netcard close");
}}
用户user---->接口Dao------主程序main:主程序使用接口,用户实现接口。
user implements Dao
多态: Dao d = new user();
d.add();
d.delete();
练习:对数据库的操作。
crud;creat read update delete
abstract interface UserDao{
public abstract void add();
public abstract void delete();
}
class jdbc implements UserDao{
public void add(){....}
public void (delete){....}
}
class hibernate implements UserDao{
public void add(){....}
public void (delete){....}
}
浙公网安备 33010602011771号