多态
一个类的多种形式
多态就是同一方法作用的对象不同而出现不同的行为方式。
人话:完成一件事,由不同的人去解决,会有不同的解决方法。(哈姆雷特?)
编译时多态:通过 overloading(重载) 实现
运行时多态:通过 overriding(重写) 和 继承实现
多态存在的三个条件:
- 拥有继承关系
- 子类重写父类方法
- 父类引用指向子类对象:Parent p = new Child( );
- upcasting 向上转型:将子类对象直接赋值给父类引用
- downcasting:向下转型:将指向子类对象的父类引用赋值给子类引用
实例:
package com.wnaoii.oop.Demo06;
//父类
public class Person {
public int age = 0;
public void run() {
System.out.println("run");
}
}
和父类有继承关系的Student类:
package com.wnaoii.oop.Demo06;
// 子类
public class Student extends Person {
public int age = 19;
// 重写父类的 run() 方法
@Override
public void run() {
System.out.println("子类run()方法被调用!");
}
// 子类特有的方法
public void eat() {
System.out.println("子类特有eat()方法被调用!");
}
}
调用:
package com.wnaoii.oop;
import com.wnaoii.oop.Demo06.Person;
import com.wnaoii.oop.Demo06.Student;
public class Application {
public static void main(String[] args) {
Student s1 = new Student();
// 父类的引用指向子类的对象(向上转型)
Person s2 = new Student();
// 多态成员方法调用
s1.run(); // 能调用自己的和继承的方法
s1.eat(); // 类型是 Student 正常调用
System.out.println();
s2.run(); // 子类重写了父类的方法,所以优先执行子类的方法
// s2.eat(); s2的类型为 Person ,而Person中没有eat()方法,无法调用
System.out.println();
// 多态成员变量调用
System.out.println(s1.age);
System.out.println(s2.age);
}
}
结果:
子类run()方法被调用!
子类特有eat()方法被调用!
子类run()方法被调用!
19
0
由此可以看出多态成员访问的特点:
成员变量:编译看父类(左边),运行看父类(左边)
成员方法:编译看父类(左边),运行看子类(右边)
© 著作权归作者所有
举报
发表评论
0/200