多态的简介:
1. 多态的体现
父类的引用指向了自己的子类对象。父类的引用也可以接收自己的子类对象。
2. 多态的前提
必须是类与类之间有关系。要么是继承关系,要么是实现关系。
通常还有一个前提:存在覆盖。
3. 多态的好处
多态的出现大大提高了程序的扩展性。
4. 多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
在使用多态的过程中,Animal a=new Cat();相当于是一次类型的提升,将Cat类型的对象转换成了父类Animal对象。这时候Cat的对象便不能调用其特有的方法了。这是候要调用的话,便应该强制将父类的引用转换成子类类型。Cat c=(Cat)a;这时候便能使用对象c调用Cat特有的方法了。
注意:在以上过程中自始至终我们都是在对子类的对象在做着变化。不能将父类对像转换为子类类型。我们能转换的是父类引用指向了自己的子类对象时,该引用可以被提升,也可以强制转换。
一、在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
总结起来:成员函数在多态调用时,编译看左边,运行看右边。
二、在多态中成员变量的特点:
无论编译和运行,都参考左边(引用型变量所书的类)
三、在多态中静态成员函数的特点:
无论编译和运行,都参考左边(引用型变量所书的类)
a instanceof Cat:如果a是Cat类的对象。一般不使用instanceof关键字,因为需要不断的判断,这会导致程序的扩展性变差。两种情况下使用:子类有限(如男女性别)、需要特有的方法来比较。
在主板实例中,如果直接在主板类中定义使用网卡声卡的方法,相当于在现实生活中将网卡声卡等焊接在了主板上,如果主板需要更新,便需要更换主板,这中设计方式使主板的扩展性变得很差。在这种情况下降低主板和声卡网卡的耦合性是解决问题的关键。创建一个接口,让网卡声卡符合接口的规范,便是一个非常好的解决方式。
public class InterfaceDemo2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MainBoard mb=new MainBoard();
mb.run();
mb.usePCI(new NetCard());
}
}
interface PCI
{
void open();
void close();
}
class NetCard implements PCI
{
public void open()
{
System.out.println("netcard work");
}
public void close()
{
System.out.println("netcard close");
}
}
class SoundCard implements PCI
{
public void open()
{
System.out.println("soundcard work");
}
public void close()
{
System.out.println("soundcard close");
}
}
class MainBoard
{
public void run()
{
System.out.println("mainboard run");
}
public void usePCI(PCI p)//PCI p=new netcard();接口型引用指向自己的子类对象。这样不论定义了其他的功能模块,将其实现PCI就可以直接传入使用了。
{
if(p!=null)
{
p.open();
p.close();
}
}
}