一、多态的概念:面向对象语言有三大主要特征:封装、继承、多态、封装是为了把我们需要隐藏的东西私有化,不让别人知道,把该暴露的暴露出去;继承提高了代码的复用性,我们可以直接拿父类中的属性,而且子父类的产生使类与类之间产生了关系,就有了多态的出现。顾名思义,多态就是事物的多种体现形态,学生军人农民都是人,我们既可以说他们是农民、军人又可以说他们是人,这就是多态。
二、多态的体现:多态必须是父类的引用指向子类的对象:Person p=new Student();当然这个前提是Student
这个类extends Person
这个类。多态的必要性:存在继承关系,子父类或者是实现关系(接口中)。然后就是发生重写,就是有重写存在。
三、多态的好处:大大提到了代码的可扩展性;只要我们的父类定义好了,引用指向子类,就可以调用子类中的方法了,代码体现如下:
class DuoDemo
{
public static void main(String[] args)
{
//Student s=new
Student();
// s.eat();
// Person p=new
Student();
function(new
Student());//匿名对象可以作为参数传递
//Person p1=new
Soldier();
function(new Soldier());
}
public static void function(Person
p) //相当于Person p=new Soldier();
{
p.eat();
}
}
class Person //定义一个Person类,里面有eat()的功能
{
void eat()
{
System.out.println("吃饭");
}
}
class Student extends Person//定义一个学生类,他继承了Person类,
{
void eat()
{
System.out.println("学生在吃饭:");
}
}
class Soldier extends Person//定义一个军人类,它继承了Person类
{
void eat()
{
System.out.println("军人在吃饭");
}
}
四、多态的弊端:只能用父类的引用访问到父类的成员,而不能访问到子类的成员,如果需要访问,就要把父类引用强制转换为子类引用,就是向下转型
如果学生中有一个功能:study(),需要调用,
那么Person p=new Person(); Student
s=Student(p); s.study();就可以了。
五.多态中成员的特点:
1、首先说一下匿名对象,new
Student();就是没有名字的对象,当我们对类中的方法只调用一次时,可以使用匿名对象。new
Student()、eat();但是如果多次调用,就必须使用引用。
另外匿名对象也可以作为一个实际参数来传递,就是没有指向,不使用引用。
2.多态中的成员函数的特点:编译时期,看的是左边的引用型变量所属类中是否有调用的方法。就是看父类中有无被调用的方法。而运行时,看的是右边,就是子类中是否有调用的方法。所以父类方法还是要写的,否则是不能够编译通过的。
3.多态中成员变量的特点:编译运行都是看左边,是父类引用,就执行父类的方法,是子类引用就执行子类的方法。
4、多态中静态变量的特点:也是看左边,方法同上。