多态机制是面向对象技术的精华之一,它是建立在继承基础之上的。
多态(polymorphism):某一类事物的多种存在形态。
思想基础
类的继承中,子类在父类的基础上进行扩充和改造,父类拥有的成员子类中都有,子类的对象应该比父类的对象功能强,因而子类的对象应可以替代父类的对象被使用。
学生这个对象对应的类型:学生类型
学生 x=new 学生();
同时学生也是人,也可以把学生称为人
人 y = new 学生();
人是学生、教师、工人等具体事物中抽象出来的父类型。
- 体现:
- 父类的引用指向自己的子类对象;
- 父类的引用可以接收自己的子类对象。
- 子类的对象可以代替父类的对象使用。 人 y = new 学生();
- 前提:要有继承关系,存在覆盖。
- 好处:提高程序的扩展性。
- 弊端:只能使用父类引用访问父类中的成员。如果想访问子类的特有方法,强制将父类的引用转为子类类型。(子类名)父类名
- 成员方法:(动态绑定)编译看左边,运行看右边。
- 成员变量:编译和运行都看左边。
- instanceof:检测一个对象的真正类型。
格式:<变量名> instanceof <类型>
功能:左侧的变量当前时刻所引用对象的真正类型是其右侧给出的类型、或是其子类,则整个表达式结果为true,否则结果为false。
class Person
{
String str = "Person";
public void print(){
System.out.println("父类print()方法,对象是:"+this.toString());
}
}
class Student extends Person
{
String str = "Student";
public void print(){
System.out.println("子类print()方法,对象是:"+this.toString());
}
public void display(){
System.out.println("子类print()方法,对象是:"+this.toString());
}
}
class StudentTest
{
public static void main(String[] args)
{
Person p1 = new Person();
System.out.println("Person变量p1.str="+p1.str); //p
p1.print(); //父,p
Student s = new Student();
System.out.println("Student变量s.str="+s.str); //s
s.display(); //子,s
s.print(); //子,s
Person p2 = new Student(); //类型的提升,向上转型
System.out.println("Person变量p2.str="+p2.str); //p
p2.print(); //子,s
//p1.display();错:person中没有此方法
Student s1 = (Student) p1; //向下转型
s.display(); //子,s
}
}
例2. (3,7)
class Animal
{
public void eat(){
System.out.println("吃");
}
}
class Dog extends Animal
{
public void eat(){
System.out.println("我爱吃骨头");
}
public void say(){
System.out.println("汪汪汪")
}
class Cat extends Animal
{
public void eat(){
System.out.println("我唉吃鱼");
}
public void catMouse(){
System.out.println("我会捉老鼠");
}
}
class Test
{
public static void funEat(Animal a){
a.eat();
if (a instanceof Cat)
{
Cat c = (Cat)a;
c.catMouse();
}
}
public static void main(String[] args)
{
Cat c1 = new Cat();
funEat(c1);
Dog d = new Dog();
funEat(d);
}
}
程序测试
class A{
float var=1.1f;
float method(){ return var; }
}
class B extends A{
float var=2.2f;
float method(){ return var;}
}
若定义A a=new A(),则a.var和a.method()的值是多少?
1.1,1.1
若定义A a=new B(),则a.var和a.method()的值是多少? 1.1,2.2
若定义A a=new B(),B b=(B)a,则b.var和b.method()的值是多少? 2.2,2.2