1.多态的概念
- 一个父类的引用类型变量既可以指向父类对象也可以指向子类对象,可以根据当前时刻指向的不同,自动调用对象的方法,这就是多态。(父类引用指向子类对象)
但这个父类引用只能调用子类从父类继承过来的成员,不能调用子类独有的成员。 - 多态的作用:利用多态可以实现同一段代码做不同的事情。
class A
{
void f()
{
System.out.println("AAA");
}
}
class B extends A
{
void f()
{
System.out.println("BBB");
}
void g()
{
}
}
class Test
{
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
a1.f();
b1.f();
a1 = b1; //只可以子类转化为父类
//b1 = a1; //error A无法转换为B
a1.f(); //与上面的a1.f()具有不同的功能,同一个语句实现了不同的功能,体现了多态性
//a1.g(); //error g()方法是子类独有的,无法通过父类引用调用
}
}
输出结果:
AAA
BBB
BBB
2.多态的实际用法举例
/**
* 写一段代码,能把A类族的所有show函数都调用
* 以后添加了子类也不需修改,依然实现相同的功能。
*/
class A
{
void show()
{
System.out.println("AAA");
}
}
class B extends A
{
void show()
{
System.out.println("BBB");
}
}
class C extends B
{
void show()
{
System.out.println("CCC");
}
}
class Test
{
static void show(A a) //只能声明为static类型,main函数才能调用
{
a.show(); //父类的引用a作为形参,类似c语言的指针作为函数形参
}
public static void main(String[] args)
{
A a1 = new A();
B b1 = new B();
C c1 = new C();
show(a1); //把a1传给a
show(b1); //只能把子类的引用传给父类引用
show(c1);
}
}
输出结果:
AAA
BBB
CCC
总结:引用作为函数参数,间接实现了c语言的指针作为函数参数的功能,增加了灵活性。引用可以理解为:a .show()和(a).show()相同。引用指向的是对象,引用变量就可以代表它所指向的对象,而指针只是存了对象的地址,需要加上指针运算符才代表了指向的对象。