一、表现:
父类或者接口的引用指向了或者接收了自己的子类对象。
二、前提:
1,类与类之间要有关系。继承,实现。
2,通常都会有覆盖。
三、好处:
预先定义的程序可以运行后期程序的内容。
增强了程序的扩展性。
四、弊端:
虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。
不能预先使用子类中定义的特有功能。
五、多态的注意事项:
在代码中。
对于成员函数:Fu f = new Zi(); f.method();
编译时期:看左边。
运行时期:看右边。
因为成员函数有一个覆盖操作。
对于非私有的实例变量,
静态变量,静态方法。
编译和运行都看左边。
六、转型。
子类对象被父类引用:子类对象在向上转型。
将指向子类对象的父类应用转换成子类类型引用:向下转型。
七、应用。
(1)父类的引用指向了子类
abstract class Animal
{
abstract void eat();
}
class Cat extends Animal
{
public void eat()
{
System.out.println("吃鱼");
}
public void catchMouse()
{
System.out.println("抓老鼠");
}
}
class Dog extends Animal
{
public void eat()
{
System.out.println("吃骨头");
}
public void kanJia()
{
System.out.println("看家");
}
}
class DuoTaiDemo
{
public static void main(String[] args)
{
//类型提升。 向上转型。
Animal a = new Cat();
a.eat();
//强制将父类的引用。转成子类类型。向下转型。调用子类的特有方法
Cat c = (Cat)a;
c.catchMouse();
//类型提升。 向上转型。
Animal a1 = new Dog();
a1.eat();
//强制将父类的引用。转成子类类型。向下转型。调用子类的特有方法
Dog d = (Dog)a1;
d.kanJia();
}
}
(2)接口的引用接收了自己的子类对象。
interface PCI
{
public void open();
public void close();
}
class MainBoard
{
public void run()
{
System.out.println("mainboard run ");
}
public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。
{
if(p!=null)
{
p.open();
p.close();
}
}
}
class NetCard implements PCI
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
method();
}
}
class SoundCard implements PCI
{
public void open()
{
System.out.println("SoundCard open");
}
public void close()
{
System.out.println("SoundCard close");
}
}
class DuoTaiDemo5
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}