1.多态的概念
多态是面向对象程序的第三大特征。实现多态的前提下是在继承的关系下,每个子类定义了覆盖的方法。简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。
c++多态分为两种:编译时多态,运行时多态。而Java中的多态只有一种,就是运行时多态。运行时是一种运行期间的行为,而不是一种运行期间的行为,而不是编译期间的行为。
多态是指在继承的关系下,对于相同的消息,不同类采用不同的实现方式,即不同类的对象调用同名的方法,产生不同的行为。
Java语言的多态性体现在方法的重载与覆盖上。通过方法的覆盖和对象的动态绑定,可以使得上转型对象具有多态性。
2.多态的效果
1.对于指向子类对象的父类来说,在编译期间只能调用父类方法,不能直接调用子类的方法。
2.对于父子类都有的非静态方法来说,指向子类的父类对象最终调用子类的重写版本。
3.对于父子类都有的静态方法来说,指向子类的父类对象最终调用父类版本,与指向的对象无关。
4.多态可以屏蔽不同子类的差异性而编写通用代码,从而产生不同的效果。
示例如下:
public class Person {
private String name;
private int age;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public int getAge() {return age;}
public void setAge(int age)
{ if(age>0&&age<120) {this.age = age;
}else {System.out.println("年龄不合理");}}
public Person() {}
public Person(String name,int age) {
this.name = name;this.age = age;}
public void show() {System.out.println("我是"+getName()+",今年"+getAge()+"岁了!");
}
public static class Student extends Person {
private int id;
public Student() {super();}
public Student(String name,int age,int id) {
super(name, age);
setId(id);}
public Student(int id) {
super();
this.id = id;}
public int getId() {return id;}
public void setId(int id) {
if (id > 0) {
this.id = id;}
else{
System.out.println("学号不合理");
}
}
public void show() {
super.show();
System.out.println("学号:" + getId());
}
}
public class TestPersonStudent {
public void main(String[] args) {
Person p = new Person();
p.show();
System.out.println("------------");
Student s = new Student();
s.show();
System.out.println("------------");
Person ps = new Student("张三", 18, 1010);
ps.show();
}
}
}
解释说明:ps调用的show()方法是子类Student的。