多态:
多态概述:事物存在多种状态
多态前提:
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(); //你
}
}
|