因为多态的应用比较多所以整理一下我对多态的学习。
多态:同一个对象(事物),在不同时刻体现出来的不同状态。
举例:
猫是猫,猫也是动物的子类。
多态的前提:父类的引用类型变量指向了子类的对象,或者是接口的引用类型变量指向了实现类的对象。
1:要有继承关系。
2:要有方法重写。
动物 d = new 猫();
d.eat();
动物 d = new 狗();
d.eat();
3:要有父类引用指向子类对象。
父 f = new 子();
多态中的成员访问特点:
1:成员变量
编译看左边,运行看左边。
2:构造方法
创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
3:成员方法
编译看左边,运行看右边。
4:静态方法
编译看左边,运行看左边。
注意:由于成员方法存在方法重写,所以它运行看右边。
多态的好处
注意:由于成员方法存在方法重写,所以它运行看右边。
多态的好处
提高了程序的维护性(由继承保证)
提高了程序的扩展性(由多态保证)
多态的弊端
不能访问子类特有功能
继承关系下的多态代码:
class Animal
{
String name;//名字
String color;//颜色
public Animal(){ //无参构造<span style="font-family: Arial, Helvetica, sans-serif;">函数</span>
}
public Animal(String name,String color){ <span style="font-family: Arial, Helvetica, sans-serif;">//带两个参数的构造函数</span>
this.name=name;
this.color=color;
}
public void eat(){
System.out.println(name+"在吃东西");
}
}
class Dog extends Animal{
public Dog(String name,String color){
super(name,color);
}
public void run(){
System.out.println(name+"四只腿跑的飞快");
}
}
class Fish extends Animal{
public Fish(String name,String color){
super(name,color);
}
public void run(){
System.out.println(name+"在水里游来游去");
}
}<pre name="code" class="java">public class Test1
{
public static void main(String[] args)
{
Animal a1=new Dog("哈士奇","白色");
Dog d=(Dog)a1;
d.eat();
d.run();
Animal a2=new Fish("鲤鱼","白色");
a2.eat();
}
}
继承关系下的多态内存图:
接口实现关系下的多态代码
//定义人的接口
interface Person
{
//定义人吃饭的方法
public abstract void eat();
}
class Teacher implements Person{
String name; //姓名
int age; //年龄
public Teacher(){
}
public Teacher(String name,int age){
this.name=name;
this.age=age;
}
public void eat(){
System.out.println(name+"在家里吃着美味的午饭");<span style="white-space:pre"> </span><span style="font-family: Arial, Helvetica, sans-serif;">//实现接口的抽象方法</span>
}
}
class Student implements Person
{
String name; //姓名
int age; //年龄
public Student(){
}
public Student(String name,int age){
this.name=name;
this.age=age;
}
public void eat(){
System.out.println(name+"在外面吃着地沟油饭菜"); //实现接口的抽象方法
}
}
public class Test2
{
public static void main(String[] args)
{
Person p1=new Teacher("张老师",34); //接口的引用类型变量指向了实现类的对象
p1.eat();
Person p2=new Student("李同学",24); //<span style="font-family: Arial, Helvetica, sans-serif;">接口的引用类型变量指向了实现类的对象</span>
p2.eat();
}
}
接口实现关系下的多态内存图
多态的应用场景:
1:多态可以作为形参,接受范围更广的对象,避免函数重载过度使用。
2:多态可以作为返回值类型
2:多态可以作为返回值类型