什么是多态:一个父类的引用类型变量它既可以指向父类对象也可以指向子类对象,它可以根据当前时刻指向的不同,自动调用不同对象的方法。
举个现实生活中多态应用例子:比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。
利用多态可以实现:同一段代码做不同的事情。
注意点:多态使用过程中,父类和子类的调用方法,要同名同参同返回值。
举例:
<pre name="code" class="java">class A{
public void f(){
Print("AAA");
}
}
class B extends A{
public void f(){
Print("BBB");
}
}
class C extends B{
<span style="white-space:pre"> </span>public void f(){
Print("CCC");
}
}
public class test
{
//public void g();**
public static void g(A aa){
aa.f();
}
public static void main(String[] args){
//g();如果使用**,错误,因为静态的不能调用非静态的方法
A aa = new A();
B bb = new B();
C cc = new C();
g(aa);
g(bb);
g(cc);//这就用到了多态,如果以后再添加子类D,g()方法就不用在修改,直接添加D对象即可。
}
}
关于多态中的向上转型和向下转型:
向上转型:
class A{
public void f(){
Print("AAA");
}
}
class B extends A{
public void f(){
Print("BBB");
}
}
public class Test {
public static void main(String[] args){
A aa = new A();
B bb = new B();
aa = bb;
aa.f();//输出结果是BBB,上面三句相当于A aa = new B();
<span style="white-space:pre"> </span>}
}
向上转型的意义:父类的对象调用子类的方法,如果以后在增加子类,就不需要修改大量的代码,因为直接使用父类的对象即可。 向下转型:
<pre name="code" class="java">class A{
public void f(){
Print("AAA");
}
}
class B extends A{
public void f(){
Print("BBB");
}
}
public class Test {
public static void main(String[] args){
A aa = new A();
B bb = new B();
aa = bb;//正确
bb = aa;//错误,为什么错误:父类在任何情况下都不能赋给子类引用。举例:可以说狗是动物,但是不能说动物是狗,那怎么才能把父类的引用转换成子类的引用呢?强制转换。
bb = (A)aa;这样写,编译没错,运行时报错。因为强制转换并没有改变aa本身的值,只是产生了一个临时的值
aa = bb;
bb = (A)aa;//这样才正确,先给aa赋值。所以向下转型有个要求:只有在父类引用本身指向的就是一个子类对象时,才可以把父类引用强制转换为子类的引用。
}
}
向下转型可以可以调用父类没有定义,但子类实现的方法。暂时没有用到过向下转型,向下转型最大的用处是泛型编程