面向对象有三大特征:封装、继承、多态。从一定角度看,封装与继承是为多态准备的。多态也是面向对象中最重要的概念。
多态的解释:
- 父类型的引用指向子类型的对象
- 允许不同类型的对象对同一消息作出响应
- 同一消息可以根据发送对象的不同而采用多种不同的行为方式
实现多态的技术
动态绑定(dynamic binding) 是指执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的实现方式
- 接口实现
- 继承父类的方法重写
- 方法重载
关于Java引用类型
在Java中引用变量有两个类型,一个是编译时类型,一个是运行时类型。
编译时类型时由声明该变量时所使用的类型决定。
运行时类型是由该变量所指向的对象类型决定。
如果两种类型不一致,就会出现多态。因此就会将子类对象直接赋值给父类引用变量,称为向上转型,而不用进行类型转换。如Animal a = new Bird()
,其中引用变量a的编译时类型时Animal,运行时类型是Bird,两者不一致,所以出现多态。
注意:当使用该对象引用进行调用时,有一条规则:对象调用编译时类型的属性和运行时类型的方法。
class Person {
public String name;
public Person() {
name = "person";
}
public void show() {
System.out.println("person show");
}
}
class Woman extends Person {
public String name;
public Woman() {
name = "woman";
}
public void show() {
System.out.println("woman show");
}
}
public class TestDemo {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person.name);
person.show();
System.out.println();
Person person1 = new Woman();
System.out.println(person1.name);
person1.show();
System.out.println();
Woman woman = new Woman();
System.out.println(woman.name);
woman.show();
}
}
结果
person
person show
person
woman show
woman
woman show
从结果可以看出,第一条语句 person 引用调用的属性属于 Person 类,person 引用调用的方法还是 Person 类;之后以此类推
参考:
Java编译时类型和运行时类型
网友评论