A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© xiaobokk 中级黑马   /  2016-8-3 22:10  /  283 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多态:
        多态概述:事物存在多种状态

        多态前提:
                A:要有继承;
                B:要有方法重写;
                C:要有父类引用指向子类对象.
       
        多态中的成员访问特点:
                成员变量: 编译看左边,运行看左边
                                可以理解为子类对象在堆内存中有一块super区域,
                                而父类的引用指向了它,所以运行的结果为左边

                成员方法: 编译看左边,运行看右边
                                在编译的时候会看在父类中有没有该方法,但是在运行的时候
                                会运行子类的成员方法,这叫做动态绑定.

                静态方法: 编译看左边,运行看左边
                                理解为和类相关的方法,算不上重写,所以访问的是父类的

        多态中的向上转型和向下转型:
                由子类向父类的转型叫做向上转型;
                        --> Person p = new superMan();

                有父类向子类的强行类型转换叫做向下转型;
                        --> superMan sm = (superMan) p;
       
        多态的好处和弊端:
                好处:
                        A:提高了代码的复用性(有继承保证)
                        B:提高了代码的扩展性(有多态保证)
                弊端:
                        不能使用子类特有的属性和方法


       另附两道题:
       
[Java] 纯文本查看 复制代码
class Fu {
			public void show() {
				System.out.println("fu show");
			}
		}
	
		class Zi extends Fu {
			public void show() {
				System.out.println("zi show");
			}
	
			public void method() {
				System.out.println("zi method");
			}
		}
	
		class Swap {
			public static void main(String[] args) {
				Fu f = new Zi();
				//f.method();		//编译看左边,会报错
				f.show();			//编译看左边,运行看右边,结果是zi show
			}
		}


[Java] 纯文本查看 复制代码
class A {
	public void show() {
		show2();
	}
	public void show2() {
		System.out.println("我");
	}
}
class B extends A {
	public void show2() {
		System.out.println("爱");
	}
}
class C extends B {
	public void show() {
		super.show();
	}
	public void show2() {
		System.out.println("你");
	}
}
public class Swap {
	public static void main(String[] args) {
		A a = new B();	//父类的引用指向子类的对象
						//父类中有show()编译通过,子类中没有show(),调用父类的show()
						//父类中的show()调用show2(),如果有一样的话,调用子类的方法
		a.show();		//爱	
		
		B b = new C();	//父类的引用指向子类的对象
						//父类中有继承的show()方法,所以编译不报错,
						//调用B父类的show()方法,方法体内调用的是show2()方法
						//父类中的show()调用show2(),如果有一样的话,调用子类的方法
		b.show();		//你
	}
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马