-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
多态:可以理解为事物存在的多种体现形态。
人:男人,女人。
动物:猫,狗。
猫 x = new 猫();(实体)
动物 x = new 猫();
1、多态的体现
父类的引用指向了自己的子类对象。
父类的引用也可以接收自己的对象。
2、多态的前提
必须是类与类之间有关系,要么继承要么实现。
通常还有一个前提:存在覆盖。
3、多态的好处
多态的出现提高了程序的扩展性,但是只能使用父类的引用访问父类中的成员。
4、 多态的弊端
虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员。
Animal a = new Cat();//类型提升。向上转型。
如果想要调用猫的特有方法时,强制将父类的引用转成子类类型。向下转型
(Cat)a.Cat特有方法。//向下转型
注意:不能将父类对象转成子类类型。
能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。
多态自始至终都是子类对象在做变化。
instanceof 类型比较关键字
格式:a instanceof Cat
多态程序举例:
程序一:
<span style="font-size:18px;">class Fu
{
void method1()
{
System.out.println("fu method_1");
}
void method2()
{
System.out.println("fu method_2");
}
}
class Zi extends Fu
{
void method1()
{
System.out.println("zi method_1");
}
void method3()
{
System.out.println("zi method_3");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Zi z = new Zi();
z.method1();
z.method2();
z.method3();
}
</span>
运行结果:
zi method_1
fu method_2
zi method_3
原因:在子类中method1()覆盖父类的方法;method2()继承父类的方法;method3()子类特有的方法。
程序二:
public class DuoTaiDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
//Zi z = new Zi();
//z.method1();
//z.method2();
//z.method3();
Fu f = new Zi();
f.method1();
f.method2();
((Zi)f).method3();
}
运行结果:
zi method_1
fu method_2
zi method_3
原因:子类向上转型,转型后还是调用子类的方法,对于子类特有方法必须进行向下转型后调用。
在多态中成员函数的特点:
在编译时期:查阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,没有则便于失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
总结:成员函数在多态调用时,编译看左边,运行看右边。
程序三:
class Fu
{
int num = 5;
}
class Zi extends Fu
{
int num = 8;
}
public class DuoTaiDemo {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.num);
Zi z = new Zi();
System.out.println(z.num);
}
}
运行结果:
5
8
在多态中,成员变量的特点: 无论编译和运行,都参考左边(引用型变量所属的类)。
即便是所属类中有这个变量,而引用型变量中没有,引用型变量就不可以调用。
如:int num1 = 1;存在子类中不存在父类中。而Fu f = new Zi(); f.num1编译不通过。
class Fu
{
static void method4()
{
System.out.println("fu method_4");
}
}
class Zi extends Fu
{
static void method4()
{
System.out.println("zi method_4");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
Fu f = new Zi();
f.method4();
Zi z = new Zi();
z.method4();
}
}
结果:
fu method_4
zi method_4
原因:在多态中,静态成员函数,无论是编译和运行,都参考左边。
注:静态变量不需要创建对象就可以引用。Fu.method4(); Zi.method4();
在多态中:静态变量绑定是静态绑定,非静态变量绑定是动态绑定。
接口与多态应用示例:
/*
* 需求:
* 电脑运行示例,
* 电脑运行基于主板。
*/
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");
}
}
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------