---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------
多态:面向对象的第三个特征,前两个特征为封装、继承
可以理解为事物存在的多种体现形态动物:猫 狗
猫 m = new 猫();
动物 m = new 猫();
1.多态的体现
父类的引用指向了自己的子类对象 Animal a = new Cat(); //类型提升,向上转型
2.多态的前提
必须是类与类之间有关系,要么继承(extends),要么实现(implements)
通常还有一个前提:存在重写
3.多态的好处与弊端
好处:多态的出现提高了程序的扩展性
弊端:虽然提高了扩展性,但是只能使用父类的引用访问父类中的成员
4.多态的应用
Animal a = new Cat(); //类型提升,向上转型
//如果想要调用猫的特有方法时,如何操作?
强制将父类的引用,转成子类类型:
Cat c = (Cat)a; //向下转型 与基本数据的强制转化方式一样,千万别出现父类对象转成子类类型
c.catchMouse();
public static void function(Animal a)
{
a.eat();
if (a instanceof Cat) //instanceof关键字 a引用的实例。 这整句话的意思:判断a引用的对象是否是Cat对象
{
Cat c = (Cat)a;
c.catchMouse();
}
else if (a instanceof Dog)
{
Dog d = (Dog)a;
d.kanJia();
}
}
多态中成员函数(非静态)的特点 Fu f = new Zi(); f是引用型变量
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有则编译通过,反之则编译失败
在运行时期:参阅对象所属的类中是否有调用的方法 new Zi()为堆内存中的对象
总结: 成员函数在多态调用时,编译看左边,运行看右边
注(面试中可能会遇到):
多态中成员变量的特点是无论编译和运行,都参考左边(引用型变量所属的类)
多态中静态成员函数的特点是无论编译和运行,都参考左边。静态绑定
静态绑定:
静态方法在哪个类就用哪个类中的该静态方法
class Fu
{
int num = 5;
void method1()
{
System.out.println("fu_method_1");
}
void method2()
{
System.out.println("fu_method_2");
}
static void methodStatic(){
System.out.println("fu_method_static");
}
}
class Zi extends Fu
{
int num = 3;
void method1()
{
System.out.println("zi_method_1~~"+num);
}
void method3()
{
System.out.println("zi_method_3");
}
static void methodStatic(){
System.out.println("zi_method_static");
}
}
class Demo
{
public static void main(String[] args)
{
Fu f = new Zi();
f.method1(); //输出zi_method_1~~3 重写了Fu类中的method1方法
f.method2(); //输出fu_method_2
//f.method3(); 这句语句要写上的话编译就会出错,因为引用型变量f所属的类为Fu,而Fu类中并没有method3方法
f.methodStatic(); //fu_method_static
System.out.println(f.num); //5
}
}
静态绑定示例:
class Base {
static int i;
Base() {
add(1);
System.out.println(i+"Base()");
}
static void add(int v) {
i += v;
System.out.println(i+"Base().add");
}
void print() {
System.out.println(i);
}
}
class MyBase extends Base {
MyBase() {
//super(); 隐式语句
add(2); //add方法被静态绑定,所以用MyBase中的add方法
}
static void add(int v) {
i += v * 2;
System.out.println(i);
}
}
public class Demo {
public static void main(String[] args) {
go(new MyBase());
// System.out.println();
}
static void go(Base b) {
b.add(8); //是引用b类型的add方法,即Base的add方法
// b.print();}
}
}
结果:
1Base().add
1Base()
5MyBase().add
13Base().add
多态的应用:主板
/*define board interface standard*/
interface PCI
{
public abstract void open();
public abstract void close();
}
/*create a MainBoard*/
class MainBoard
{
void run()
{
System.out.println("mainboard run");
}
void usePCI(PCI p) //PCI p = new NetCard(); 多态的应用
{
if (p!=null)
{
p.open();
p.close();
}
}
}
/*create a net card implements pci*/
class NetCard implements PCI
{
public void open()
{
System.out.println("网卡打开");
}
public void close()
{
System.out.println("网卡关闭");
}
}
/*create a sound card implements pci*/
class SoundCard implements PCI
{
public void open()
{
System.out.println("声卡打开");
}
public void close()
{
System.out.println("声卡关闭");
}
}
class MainBoardDemo
{
public static void main(String[] args)
{
MainBoard m = new MainBoard();
m.run();
m.usePCI(null);
m.usePCI(new NetCard());
m.usePCI(new SoundCard());
}
}
---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net