多态
什么是多态?简单的说,就是事物存在多种体现状态
1.多态的体现
先看一个例子
class Animal{
public String name="animal";
public void fun(){
System.out.println("fun函数");
}
public void fun1(){
System.out.println("动物叫");
}
}
class Dog extends Animal{
public String name="dog";
public void fun1(){
System.out.println("Dog叫");
}
public void lookdoor(){
System.out.println("look door");
}
}
public class DuoTai {
public static void main(String[] args) {
Animal animal = new Animal();
System.out.println(animal.name);
animal.fun();
animal.fun1();
System.out.println();
Dog dog = new Dog();
System.out.println(dog.name);
dog.fun1();
dog.lookdoor();
System.out.println();
Animal an=new Dog();
System.out.println(an.name);//访问父类对象的实例变量
an.fun1();//执行当前类的fun1方法
an.fun();//执行从父类继承到的fun方法
((Dog) an).lookdoor();
}
}
在这个例子中,前面两个引用和其创建的对象都是一个类型,而第三个则是父类引用指向了自己子类的对象, 这就产生了多态。当animal引用创建了一个dog对象时,an.name访问的是父类的实例变量,fun是执行继承父类的方法,fun1是执行当前类的方法, ==Animal an=new Dog();==这句代码将Dog类型提升为Animal类型,叫做 ==向上转型,是自动完成的。 == ((Dog) an).lookdoor(); 这句代码将父类型Animal转换为子类型的Dog,叫做 向下转型它强制将父类引用转成子类类型。 多态自始至终只有子类对象在变化。
这个例子还说明了
在多态中非静态成员函数的特点:
- 在编译时,参阅引用型变量所属类中是否有调用的方法,如果有,编译通过,如果没有,编译失败
- 在运行时其,参阅对象所属类中是否有可调用的方法,
静态成员函数的特点:无论编译和运行,参数参考引用类型变量的类
在多态中
成员变量的特点:无论编译和运行,参数参考引用类型变量的类
多态的前提
必须是类与类之间有关系,要么继承,要么实现。通常还有个前提, 就是存在覆盖
局限性:只能使用父类额引用访问父类额成员
多态的好处
多态的出翔提高了程序的扩展性
多态的应用
主要通过对象的向上转型来实现接收参数的统一。
看例子:
** 对于吃早餐这个行为来说,不管什么人吃,吃的动作怎样,都是吃 */
class Person{
void eat(){
System.out.println("eat food");
}
}
class Student extends Person{
void eat(){
System.out.println("eat food slowly");
}
}
class Worker extends Person{
void eat() {
System.out.println("eat food quickly");
}
}
class Teacher extends Person{
void eat() {
System.out.println("eat food gently");
}
}
public class A {
// 所有的人不论吃相统一的方法进行
public static void eatBreakFast(Person1 per) {
per.eat();
}
public static void main(String[] args) {
eatBreakFast(new Student());
eatBreakFast(new Worker());
eatBreakFast(new Teacher());
}
}
运行结果:
eat food slowly
eat food quickly
eat food gently
如果不使用多态,则会多次重载eat()方法,当子类的类型非常多时,这是很不容易的。